HTTPMessage.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //
  2. // HTTPMessage.cpp
  3. //
  4. // Library: Net
  5. // Package: HTTP
  6. // Module: HTTPMessage
  7. //
  8. // Copyright (c) 2005-2006, Applied Informatics Software Engineering GmbH.
  9. // and Contributors.
  10. //
  11. // SPDX-License-Identifier: BSL-1.0
  12. //
  13. #include "Poco/Net/HTTPMessage.h"
  14. #include "Poco/Net/MediaType.h"
  15. #include "Poco/NumberFormatter.h"
  16. #include "Poco/NumberParser.h"
  17. #include "Poco/String.h"
  18. using Poco::NumberFormatter;
  19. using Poco::NumberParser;
  20. using Poco::icompare;
  21. namespace Poco {
  22. namespace Net {
  23. const std::string HTTPMessage::HTTP_1_0 = "HTTP/1.0";
  24. const std::string HTTPMessage::HTTP_1_1 = "HTTP/1.1";
  25. const std::string HTTPMessage::IDENTITY_TRANSFER_ENCODING = "identity";
  26. const std::string HTTPMessage::CHUNKED_TRANSFER_ENCODING = "chunked";
  27. const int HTTPMessage::UNKNOWN_CONTENT_LENGTH = -1;
  28. const std::string HTTPMessage::UNKNOWN_CONTENT_TYPE;
  29. const std::string HTTPMessage::CONTENT_LENGTH = "Content-Length";
  30. const std::string HTTPMessage::CONTENT_TYPE = "Content-Type";
  31. const std::string HTTPMessage::TRANSFER_ENCODING = "Transfer-Encoding";
  32. const std::string HTTPMessage::CONNECTION = "Connection";
  33. const std::string HTTPMessage::CONNECTION_KEEP_ALIVE = "Keep-Alive";
  34. const std::string HTTPMessage::CONNECTION_CLOSE = "Close";
  35. const std::string HTTPMessage::EMPTY;
  36. HTTPMessage::HTTPMessage():
  37. _version(HTTP_1_0)
  38. {
  39. }
  40. HTTPMessage::HTTPMessage(const std::string& version):
  41. _version(version)
  42. {
  43. }
  44. HTTPMessage::~HTTPMessage()
  45. {
  46. }
  47. void HTTPMessage::setVersion(const std::string& version)
  48. {
  49. _version = version;
  50. }
  51. void HTTPMessage::setContentLength(std::streamsize length)
  52. {
  53. if (length != UNKNOWN_CONTENT_LENGTH)
  54. set(CONTENT_LENGTH, NumberFormatter::format(length));
  55. else
  56. erase(CONTENT_LENGTH);
  57. }
  58. std::streamsize HTTPMessage::getContentLength() const
  59. {
  60. const std::string& contentLength = get(CONTENT_LENGTH, EMPTY);
  61. if (!contentLength.empty())
  62. {
  63. if (sizeof(std::streamsize) == sizeof(Poco::Int64))
  64. return static_cast<std::streamsize>(NumberParser::parse64(contentLength));
  65. else
  66. return static_cast<std::streamsize>(NumberParser::parse(contentLength));
  67. }
  68. else return UNKNOWN_CONTENT_LENGTH;
  69. }
  70. #if defined(POCO_HAVE_INT64)
  71. void HTTPMessage::setContentLength64(Poco::Int64 length)
  72. {
  73. if (length != UNKNOWN_CONTENT_LENGTH)
  74. set(CONTENT_LENGTH, NumberFormatter::format(length));
  75. else
  76. erase(CONTENT_LENGTH);
  77. }
  78. Poco::Int64 HTTPMessage::getContentLength64() const
  79. {
  80. const std::string& contentLength = get(CONTENT_LENGTH, EMPTY);
  81. if (!contentLength.empty())
  82. {
  83. return NumberParser::parse64(contentLength);
  84. }
  85. else return UNKNOWN_CONTENT_LENGTH;
  86. }
  87. #endif // defined(POCO_HAVE_INT64)
  88. void HTTPMessage::setTransferEncoding(const std::string& transferEncoding)
  89. {
  90. if (icompare(transferEncoding, IDENTITY_TRANSFER_ENCODING) == 0)
  91. erase(TRANSFER_ENCODING);
  92. else
  93. set(TRANSFER_ENCODING, transferEncoding);
  94. }
  95. const std::string& HTTPMessage::getTransferEncoding() const
  96. {
  97. return get(TRANSFER_ENCODING, IDENTITY_TRANSFER_ENCODING);
  98. }
  99. void HTTPMessage::setChunkedTransferEncoding(bool flag)
  100. {
  101. if (flag)
  102. setTransferEncoding(CHUNKED_TRANSFER_ENCODING);
  103. else
  104. setTransferEncoding(IDENTITY_TRANSFER_ENCODING);
  105. }
  106. bool HTTPMessage::getChunkedTransferEncoding() const
  107. {
  108. return icompare(getTransferEncoding(), CHUNKED_TRANSFER_ENCODING) == 0;
  109. }
  110. void HTTPMessage::setContentType(const std::string& mediaType)
  111. {
  112. if (mediaType.empty())
  113. erase(CONTENT_TYPE);
  114. else
  115. set(CONTENT_TYPE, mediaType);
  116. }
  117. void HTTPMessage::setContentType(const MediaType& mediaType)
  118. {
  119. setContentType(mediaType.toString());
  120. }
  121. const std::string& HTTPMessage::getContentType() const
  122. {
  123. return get(CONTENT_TYPE, UNKNOWN_CONTENT_TYPE);
  124. }
  125. void HTTPMessage::setKeepAlive(bool keepAlive)
  126. {
  127. if (keepAlive)
  128. set(CONNECTION, CONNECTION_KEEP_ALIVE);
  129. else
  130. set(CONNECTION, CONNECTION_CLOSE);
  131. }
  132. bool HTTPMessage::getKeepAlive() const
  133. {
  134. const std::string& connection = get(CONNECTION, EMPTY);
  135. if (!connection.empty())
  136. return icompare(connection, CONNECTION_CLOSE) != 0;
  137. else
  138. return getVersion() == HTTP_1_1;
  139. }
  140. } } // namespace Poco::Net