HttpResponseTest.cc.8905 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #include "HttpResponse.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "TestUtil.h"
  5. #include "prefs.h"
  6. #include "PiecedSegment.h"
  7. #include "Piece.h"
  8. #include "Request.h"
  9. #include "HttpHeader.h"
  10. #include "HttpRequest.h"
  11. #include "Exception.h"
  12. #include "A2STR.h"
  13. #include "DlRetryEx.h"
  14. #include "CookieStorage.h"
  15. #include "AuthConfigFactory.h"
  16. #include "AuthConfig.h"
  17. #include "StreamFilter.h"
  18. #include "MetalinkHttpEntry.h"
  19. #include "Option.h"
  20. #include "Checksum.h"
  21. namespace aria2 {
  22. class HttpResponseTest : public CppUnit::TestFixture {
  23. CPPUNIT_TEST_SUITE(HttpResponseTest);
  24. CPPUNIT_TEST(testGetContentLength_null);
  25. CPPUNIT_TEST(testGetContentLength_contentLength);
  26. // CPPUNIT_TEST(testGetContentLength_range);
  27. CPPUNIT_TEST(testGetEntityLength);
  28. CPPUNIT_TEST(testGetContentType);
  29. CPPUNIT_TEST(testDetermineFilename_without_ContentDisposition);
  30. CPPUNIT_TEST(testDetermineFilename_with_ContentDisposition_zero_length);
  31. CPPUNIT_TEST(testDetermineFilename_with_ContentDisposition);
  32. CPPUNIT_TEST(testGetRedirectURI_without_Location);
  33. CPPUNIT_TEST(testGetRedirectURI_with_Location);
  34. CPPUNIT_TEST(testIsRedirect);
  35. CPPUNIT_TEST(testIsTransferEncodingSpecified);
  36. CPPUNIT_TEST(testGetTransferEncoding);
  37. CPPUNIT_TEST(testGetTransferEncodingStreamFilter);
  38. CPPUNIT_TEST(testIsContentEncodingSpecified);
  39. CPPUNIT_TEST(testGetContentEncoding);
  40. CPPUNIT_TEST(testGetContentEncodingStreamFilter);
  41. CPPUNIT_TEST(testValidateResponse);
  42. CPPUNIT_TEST(testValidateResponse_good_range);
  43. CPPUNIT_TEST(testValidateResponse_bad_range);
  44. CPPUNIT_TEST(testValidateResponse_chunked);
  45. CPPUNIT_TEST(testValidateResponse_withIfModifiedSince);
  46. CPPUNIT_TEST(testProcessRedirect);
  47. CPPUNIT_TEST(testRetrieveCookie);
  48. CPPUNIT_TEST(testSupportsPersistentConnection);
  49. CPPUNIT_TEST(testGetMetalinKHttpEntries);
  50. CPPUNIT_TEST(testGetDigest);
  51. CPPUNIT_TEST_SUITE_END();
  52. private:
  53. public:
  54. void setUp() {}
  55. void testGetContentLength_null();
  56. void testGetContentLength_contentLength();
  57. void testGetEntityLength();
  58. void testGetContentType();
  59. void testDetermineFilename_without_ContentDisposition();
  60. void testDetermineFilename_with_ContentDisposition_zero_length();
  61. void testDetermineFilename_with_ContentDisposition();
  62. void testGetRedirectURI_without_Location();
  63. void testGetRedirectURI_with_Location();
  64. void testIsRedirect();
  65. void testIsTransferEncodingSpecified();
  66. void testGetTransferEncoding();
  67. void testGetTransferEncodingStreamFilter();
  68. void testIsContentEncodingSpecified();
  69. void testGetContentEncoding();
  70. void testGetContentEncodingStreamFilter();
  71. void testValidateResponse();
  72. void testValidateResponse_good_range();
  73. void testValidateResponse_bad_range();
  74. void testValidateResponse_chunked();
  75. void testValidateResponse_withIfModifiedSince();
  76. void testProcessRedirect();
  77. void testRetrieveCookie();
  78. void testSupportsPersistentConnection();
  79. void testGetMetalinKHttpEntries();
  80. void testGetDigest();
  81. };
  82. CPPUNIT_TEST_SUITE_REGISTRATION(HttpResponseTest);
  83. void HttpResponseTest::testGetContentLength_null()
  84. {
  85. HttpResponse httpResponse;
  86. CPPUNIT_ASSERT_EQUAL((int64_t)0LL, httpResponse.getContentLength());
  87. }
  88. void HttpResponseTest::testGetContentLength_contentLength()
  89. {
  90. HttpResponse httpResponse;
  91. auto httpHeader = make_unique<HttpHeader>();
  92. httpHeader->put(HttpHeader::CONTENT_LENGTH, "4294967296");
  93. httpResponse.setHttpHeader(std::move(httpHeader));
  94. CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getContentLength());
  95. }
  96. void HttpResponseTest::testGetEntityLength()
  97. {
  98. HttpResponse httpResponse;
  99. auto httpHeader = make_unique<HttpHeader>();
  100. httpHeader->put(HttpHeader::CONTENT_LENGTH, "4294967296");
  101. httpResponse.setHttpHeader(std::move(httpHeader));
  102. CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getEntityLength());
  103. httpResponse.getHttpHeader()->put(HttpHeader::CONTENT_RANGE,
  104. "bytes 1-4294967296/4294967297");
  105. CPPUNIT_ASSERT_EQUAL((int64_t)4294967297LL, httpResponse.getEntityLength());
  106. }
  107. void HttpResponseTest::testGetContentType()
  108. {
  109. HttpResponse httpResponse;
  110. auto httpHeader = make_unique<HttpHeader>();
  111. httpHeader->put(HttpHeader::CONTENT_TYPE,
  112. "application/metalink+xml; charset=UTF-8");
  113. httpResponse.setHttpHeader(std::move(httpHeader));
  114. // See parameter is ignored.
  115. CPPUNIT_ASSERT_EQUAL(std::string("application/metalink+xml"),
  116. httpResponse.getContentType());
  117. }
  118. void HttpResponseTest::testDetermineFilename_without_ContentDisposition()
  119. {
  120. HttpResponse httpResponse;
  121. auto httpRequest = make_unique<HttpRequest>();
  122. auto request = std::make_shared<Request>();
  123. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  124. httpRequest->setRequest(request);
  125. httpResponse.setHttpHeader(make_unique<HttpHeader>());
  126. httpResponse.setHttpRequest(std::move(httpRequest));
  127. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  128. httpResponse.determineFilename(false));
  129. }
  130. void HttpResponseTest::
  131. testDetermineFilename_with_ContentDisposition_zero_length()
  132. {
  133. HttpResponse httpResponse;
  134. auto httpHeader = make_unique<HttpHeader>();
  135. httpHeader->put(HttpHeader::CONTENT_DISPOSITION, "attachment; filename=\"\"");
  136. auto httpRequest = make_unique<HttpRequest>();
  137. auto request = std::make_shared<Request>();
  138. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  139. httpRequest->setRequest(request);
  140. httpResponse.setHttpHeader(std::move(httpHeader));
  141. httpResponse.setHttpRequest(std::move(httpRequest));
  142. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  143. httpResponse.determineFilename(false));
  144. }
  145. void HttpResponseTest::testDetermineFilename_with_ContentDisposition()
  146. {
  147. HttpResponse httpResponse;
  148. auto httpHeader = make_unique<HttpHeader>();
  149. httpHeader->put(HttpHeader::CONTENT_DISPOSITION,
  150. "attachment; filename=\"aria2-current.tar.bz2\"");
  151. auto httpRequest = make_unique<HttpRequest>();
  152. auto request = std::make_shared<Request>();
  153. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  154. httpRequest->setRequest(request);
  155. httpResponse.setHttpHeader(std::move(httpHeader));
  156. httpResponse.setHttpRequest(std::move(httpRequest));
  157. CPPUNIT_ASSERT_EQUAL(std::string("aria2-current.tar.bz2"),
  158. httpResponse.determineFilename(false));
  159. }
  160. void HttpResponseTest::testGetRedirectURI_without_Location()
  161. {
  162. HttpResponse httpResponse;
  163. httpResponse.setHttpHeader(make_unique<HttpHeader>());
  164. CPPUNIT_ASSERT_EQUAL(std::string(""), httpResponse.getRedirectURI());
  165. }
  166. void HttpResponseTest::testGetRedirectURI_with_Location()
  167. {
  168. HttpResponse httpResponse;
  169. auto httpHeader = make_unique<HttpHeader>();
  170. httpHeader->put(HttpHeader::LOCATION,
  171. "http://localhost/download/aria2-1.0.0.tar.bz2");
  172. httpResponse.setHttpHeader(std::move(httpHeader));
  173. CPPUNIT_ASSERT_EQUAL(
  174. std::string("http://localhost/download/aria2-1.0.0.tar.bz2"),
  175. httpResponse.getRedirectURI());
  176. }
  177. void HttpResponseTest::testIsRedirect()
  178. {
  179. HttpResponse httpResponse;
  180. httpResponse.setHttpHeader(make_unique<HttpHeader>());
  181. httpResponse.getHttpHeader()->setStatusCode(301);
  182. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  183. httpResponse.getHttpHeader()->setStatusCode(200);
  184. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  185. httpResponse.getHttpHeader()->put(
  186. HttpHeader::LOCATION, "http://localhost/download/aria2-1.0.0.tar.bz2");
  187. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  188. httpResponse.getHttpHeader()->setStatusCode(300);
  189. CPPUNIT_ASSERT(httpResponse.isRedirect());
  190. httpResponse.getHttpHeader()->setStatusCode(301);
  191. CPPUNIT_ASSERT(httpResponse.isRedirect());
  192. httpResponse.getHttpHeader()->setStatusCode(302);
  193. CPPUNIT_ASSERT(httpResponse.isRedirect());
  194. httpResponse.getHttpHeader()->setStatusCode(303);
  195. CPPUNIT_ASSERT(httpResponse.isRedirect());
  196. httpResponse.getHttpHeader()->setStatusCode(304);
  197. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  198. httpResponse.getHttpHeader()->setStatusCode(305);
  199. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  200. httpResp