HttpRequest.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. httpK.getNachricht( buff, 1 );
  38. answer += buff;
  39. } while( httpK.hatNachricht( 0 ) );
  40. return new Answer( answer );
  41. }
  42. PostRequest *PostRequest::getThis()
  43. {
  44. ref++;
  45. return this;
  46. }
  47. PostRequest *PostRequest::release()
  48. {
  49. if( !--ref )
  50. delete this;
  51. return 0;
  52. }
  53. Answer::Answer( const char *answer )
  54. {
  55. TextReader reader( new Text( answer ) );
  56. // parse header
  57. Text *line = reader.leseZeile();
  58. header += *line;
  59. header += "\n";
  60. int trenn = line->positionVon( " " );
  61. Text *tmp = line->getTeilText( 0, trenn );
  62. this->protocol = *tmp;
  63. tmp->release();
  64. line->remove( 0, trenn + 1 );
  65. trenn = line->positionVon( " " );
  66. tmp = line->getTeilText( 0, trenn );
  67. this->statusNumber = *tmp;
  68. tmp->release();
  69. line->remove( 0, trenn + 1 );
  70. this->statusText = *line;
  71. line->release();
  72. while( !reader.istEnde() )
  73. {
  74. Text *line = reader.leseZeile();
  75. if( line->getLength() > 0 )
  76. {
  77. header += *line;
  78. header += "\n";
  79. }
  80. if( line->positionVon( "Data:" ) == 0 )
  81. this->date = line->getText() + 6;
  82. if( line->positionVon( "Content-Type:" ) == 0 )
  83. this->contentType = line->getText() + 14;
  84. int len = line->getLength();
  85. line->release();
  86. if( len == 0 )
  87. break;
  88. }
  89. // parse body
  90. if( !reader.istEnde() )
  91. this->data = answer + reader.getLPosition();
  92. ref = 1;
  93. }
  94. const char *Answer::getContentType() const
  95. {
  96. return contentType;
  97. }
  98. const char *Answer::getData() const
  99. {
  100. return data;
  101. }
  102. Answer *Answer::getThis()
  103. {
  104. ref++;
  105. return this;
  106. }
  107. Answer *Answer::release()
  108. {
  109. if( !--ref )
  110. delete this;
  111. return 0;
  112. }