HttpRequest.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "HttpRequest.h"
  2. #include "Klient.h"
  3. using namespace Framework;
  4. using namespace Network;
  5. using namespace HTTP;
  6. PostRequest::PostRequest( const char *path, const char *host, const char *data, const char *contentType, unsigned short port )
  7. {
  8. this->path = path;
  9. this->host = host;
  10. this->data = data;
  11. this->contentType = contentType;
  12. this->port = port;
  13. ref = 1;
  14. }
  15. Answer *PostRequest::execute() const
  16. {
  17. Text message = "POST ";
  18. message += path;
  19. message += " HTTP/1.1\n";
  20. message += "Host: ";
  21. message += host;
  22. message += "\nContent-Type: ";
  23. message += contentType;
  24. message += "\nContent-Length: ";
  25. message += data.getLength();
  26. message += "\n\n";
  27. message += data;
  28. message += "\n";
  29. Klient httpK;
  30. if( !httpK.verbinde( port, host ) )
  31. return 0;
  32. httpK.sende( message, message.getLength() );
  33. Text answer;
  34. do {
  35. char buff[ 2 ];
  36. buff[ 1 ] = 0;
  37. if( httpK.getNachricht( buff, 1 ) )
  38. answer += buff;
  39. else
  40. break;
  41. } while( httpK.hatNachricht( 0 ) );
  42. return new Answer( answer );
  43. }
  44. PostRequest *PostRequest::getThis()
  45. {
  46. ref++;
  47. return this;
  48. }
  49. PostRequest *PostRequest::release()
  50. {
  51. if( !--ref )
  52. delete this;
  53. return 0;
  54. }
  55. Answer::Answer( const char *answer )
  56. {
  57. TextReader reader( new Text( answer ) );
  58. // parse header
  59. Text *line = reader.leseZeile();
  60. header += *line;
  61. header += "\n";
  62. int trenn = line->positionVon( " " );
  63. Text *tmp = line->getTeilText( 0, trenn );
  64. this->protocol = *tmp;
  65. tmp->release();
  66. line->remove( 0, trenn + 1 );
  67. trenn = line->positionVon( " " );
  68. tmp = line->getTeilText( 0, trenn );
  69. this->statusNumber = *tmp;
  70. tmp->release();
  71. line->remove( 0, trenn + 1 );
  72. this->statusText = *line;
  73. line->release();
  74. while( !reader.istEnde() )
  75. {
  76. Text *line = reader.leseZeile();
  77. if( line->getLength() > 0 )
  78. {
  79. header += *line;
  80. header += "\n";
  81. }
  82. if( line->positionVon( "Data:" ) == 0 )
  83. this->date = line->getText() + 6;
  84. if( line->positionVon( "Content-Type:" ) == 0 )
  85. this->contentType = line->getText() + 14;
  86. int len = line->getLength();
  87. line->release();
  88. if( len == 0 )
  89. break;
  90. }
  91. // parse body
  92. if( !reader.istEnde() )
  93. this->data = answer + reader.getLPosition();
  94. ref = 1;
  95. }
  96. const char *Answer::getContentType() const
  97. {
  98. return contentType;
  99. }
  100. const char *Answer::getData() const
  101. {
  102. return data;
  103. }
  104. Answer *Answer::getThis()
  105. {
  106. ref++;
  107. return this;
  108. }
  109. Answer *Answer::release()
  110. {
  111. if( !--ref )
  112. delete this;
  113. return 0;
  114. }