HttpResponseTest.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. #include "HttpResponse.h"
  2. #include "prefs.h"
  3. #include "PiecedSegment.h"
  4. #include "Piece.h"
  5. #include "TransferEncoding.h"
  6. #include "Request.h"
  7. #include "HttpHeader.h"
  8. #include "HttpRequest.h"
  9. #include "Exception.h"
  10. #include "A2STR.h"
  11. #include "Decoder.h"
  12. #include <iostream>
  13. #include <cppunit/extensions/HelperMacros.h>
  14. namespace aria2 {
  15. class HttpResponseTest : public CppUnit::TestFixture {
  16. CPPUNIT_TEST_SUITE(HttpResponseTest);
  17. CPPUNIT_TEST(testGetContentLength_null);
  18. CPPUNIT_TEST(testGetContentLength_contentLength);
  19. //CPPUNIT_TEST(testGetContentLength_range);
  20. CPPUNIT_TEST(testGetEntityLength);
  21. CPPUNIT_TEST(testGetContentType);
  22. CPPUNIT_TEST(testDeterminFilename_without_ContentDisposition);
  23. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition_zero_length);
  24. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition);
  25. CPPUNIT_TEST(testGetRedirectURI_without_Location);
  26. CPPUNIT_TEST(testGetRedirectURI_with_Location);
  27. CPPUNIT_TEST(testIsRedirect);
  28. CPPUNIT_TEST(testIsTransferEncodingSpecified);
  29. CPPUNIT_TEST(testGetTransferEncoding);
  30. CPPUNIT_TEST(testGetTransferDecoder);
  31. CPPUNIT_TEST(testIsContentEncodingSpecified);
  32. CPPUNIT_TEST(testGetContentEncoding);
  33. CPPUNIT_TEST(testGetContentEncodingDecoder);
  34. CPPUNIT_TEST(testValidateResponse);
  35. CPPUNIT_TEST(testValidateResponse_good_range);
  36. CPPUNIT_TEST(testValidateResponse_bad_range);
  37. CPPUNIT_TEST(testValidateResponse_chunked);
  38. CPPUNIT_TEST(testHasRetryAfter);
  39. CPPUNIT_TEST_SUITE_END();
  40. private:
  41. public:
  42. void setUp() {
  43. }
  44. void testGetContentLength_null();
  45. void testGetContentLength_contentLength();
  46. void testGetEntityLength();
  47. void testGetContentType();
  48. void testDeterminFilename_without_ContentDisposition();
  49. void testDeterminFilename_with_ContentDisposition_zero_length();
  50. void testDeterminFilename_with_ContentDisposition();
  51. void testGetRedirectURI_without_Location();
  52. void testGetRedirectURI_with_Location();
  53. void testIsRedirect();
  54. void testIsTransferEncodingSpecified();
  55. void testGetTransferEncoding();
  56. void testGetTransferDecoder();
  57. void testIsContentEncodingSpecified();
  58. void testGetContentEncoding();
  59. void testGetContentEncodingDecoder();
  60. void testValidateResponse();
  61. void testValidateResponse_good_range();
  62. void testValidateResponse_bad_range();
  63. void testValidateResponse_chunked();
  64. void testHasRetryAfter();
  65. };
  66. CPPUNIT_TEST_SUITE_REGISTRATION( HttpResponseTest );
  67. void HttpResponseTest::testGetContentLength_null()
  68. {
  69. HttpResponse httpResponse;
  70. CPPUNIT_ASSERT_EQUAL(0ULL, httpResponse.getContentLength());
  71. }
  72. void HttpResponseTest::testGetContentLength_contentLength()
  73. {
  74. HttpResponse httpResponse;
  75. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  76. httpHeader->put("Content-Length", "4294967296");
  77. httpResponse.setHttpHeader(httpHeader);
  78. CPPUNIT_ASSERT_EQUAL(4294967296ULL, httpResponse.getContentLength());
  79. }
  80. void HttpResponseTest::testGetEntityLength()
  81. {
  82. HttpResponse httpResponse;
  83. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  84. httpHeader->put("Content-Length", "4294967296");
  85. httpResponse.setHttpHeader(httpHeader);
  86. CPPUNIT_ASSERT_EQUAL(4294967296ULL, httpResponse.getEntityLength());
  87. httpHeader->put("Content-Range", "bytes 1-4294967296/4294967297");
  88. CPPUNIT_ASSERT_EQUAL(4294967297ULL, httpResponse.getEntityLength());
  89. }
  90. void HttpResponseTest::testGetContentType()
  91. {
  92. HttpResponse httpResponse;
  93. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  94. httpHeader->put("content-type", "application/octet-stream");
  95. httpResponse.setHttpHeader(httpHeader);
  96. CPPUNIT_ASSERT_EQUAL(std::string("application/octet-stream"),
  97. httpResponse.getContentType());
  98. }
  99. void HttpResponseTest::testDeterminFilename_without_ContentDisposition()
  100. {
  101. HttpResponse httpResponse;
  102. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  103. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  104. SharedHandle<Request> request(new Request());
  105. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  106. httpRequest->setRequest(request);
  107. httpResponse.setHttpHeader(httpHeader);
  108. httpResponse.setHttpRequest(httpRequest);
  109. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  110. httpResponse.determinFilename());
  111. }
  112. void HttpResponseTest::testDeterminFilename_with_ContentDisposition_zero_length()
  113. {
  114. HttpResponse httpResponse;
  115. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  116. httpHeader->put("Content-Disposition", "attachment; filename=\"\"");
  117. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  118. SharedHandle<Request> request(new Request());
  119. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  120. httpRequest->setRequest(request);
  121. httpResponse.setHttpHeader(httpHeader);
  122. httpResponse.setHttpRequest(httpRequest);
  123. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  124. httpResponse.determinFilename());
  125. }
  126. void HttpResponseTest::testDeterminFilename_with_ContentDisposition()
  127. {
  128. HttpResponse httpResponse;
  129. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  130. httpHeader->put("Content-Disposition", "attachment; filename=\"aria2-current.tar.bz2\"");
  131. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  132. SharedHandle<Request> request(new Request());
  133. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  134. httpRequest->setRequest(request);
  135. httpResponse.setHttpHeader(httpHeader);
  136. httpResponse.setHttpRequest(httpRequest);
  137. CPPUNIT_ASSERT_EQUAL(std::string("aria2-current.tar.bz2"),
  138. httpResponse.determinFilename());
  139. }
  140. void HttpResponseTest::testGetRedirectURI_without_Location()
  141. {
  142. HttpResponse httpResponse;
  143. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  144. httpResponse.setHttpHeader(httpHeader);
  145. CPPUNIT_ASSERT_EQUAL(std::string(""),
  146. httpResponse.getRedirectURI());
  147. }
  148. void HttpResponseTest::testGetRedirectURI_with_Location()
  149. {
  150. HttpResponse httpResponse;
  151. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  152. httpHeader->put("Location", "http://localhost/download/aria2-1.0.0.tar.bz2");
  153. httpResponse.setHttpHeader(httpHeader);
  154. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/download/aria2-1.0.0.tar.bz2"),
  155. httpResponse.getRedirectURI());
  156. }
  157. void HttpResponseTest::testIsRedirect()
  158. {
  159. HttpResponse httpResponse;
  160. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  161. httpHeader->setResponseStatus("200");
  162. httpHeader->put("Location", "http://localhost/download/aria2-1.0.0.tar.bz2");
  163. httpResponse.setHttpHeader(httpHeader);
  164. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  165. httpHeader->setResponseStatus("304");
  166. CPPUNIT_ASSERT(httpResponse.isRedirect());
  167. }
  168. void HttpResponseTest::testIsTransferEncodingSpecified()
  169. {
  170. HttpResponse httpResponse;
  171. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  172. httpResponse.setHttpHeader(httpHeader);
  173. CPPUNIT_ASSERT(!httpResponse.isTransferEncodingSpecified());
  174. httpHeader->put("Transfer-Encoding", "chunked");
  175. CPPUNIT_ASSERT(httpResponse.isTransferEncodingSpecified());
  176. }
  177. void HttpResponseTest::testGetTransferEncoding()
  178. {
  179. HttpResponse httpResponse;
  180. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  181. httpResponse.setHttpHeader(httpHeader);
  182. CPPUNIT_ASSERT_EQUAL(std::string(""), httpResponse.getTransferEncoding());
  183. httpHeader->put("Transfer-Encoding", "chunked");
  184. CPPUNIT_ASSERT_EQUAL(std::string("chunked"), httpResponse.getTransferEncoding());
  185. }
  186. void HttpResponseTest::testGetTransferDecoder()
  187. {
  188. HttpResponse httpResponse;
  189. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  190. httpResponse.setHttpHeader(httpHeader);
  191. CPPUNIT_ASSERT(httpResponse.getTransferDecoder().isNull());
  192. httpHeader->put("Transfer-Encoding", "chunked");
  193. CPPUNIT_ASSERT(!httpResponse.getTransferDecoder().isNull());
  194. }
  195. void HttpResponseTest::testIsContentEncodingSpecified()
  196. {
  197. HttpResponse httpResponse;
  198. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  199. httpResponse.setHttpHeader(httpHeader);
  200. CPPUNIT_ASSERT(!httpResponse.isContentEncodingSpecified());
  201. httpHeader->put("Content-Encoding", "gzip");
  202. CPPUNIT_ASSERT(httpResponse.isContentEncodingSpecified());
  203. }
  204. void HttpResponseTest::testGetContentEncoding()
  205. {
  206. HttpResponse httpResponse;
  207. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  208. httpResponse.setHttpHeader(httpHeader);
  209. CPPUNIT_ASSERT_EQUAL(A2STR::NIL, httpResponse.getContentEncoding());
  210. httpHeader->put("Content-Encoding", "gzip");
  211. CPPUNIT_ASSERT_EQUAL(std::string("gzip"), httpResponse.getContentEncoding());
  212. }
  213. void HttpResponseTest::testGetContentEncodingDecoder()
  214. {
  215. HttpResponse httpResponse;
  216. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  217. httpResponse.setHttpHeader(httpHeader);
  218. CPPUNIT_ASSERT(httpResponse.getContentEncodingDecoder().isNull());
  219. #ifdef HAVE_LIBZ
  220. httpHeader->put("Content-Encoding", "gzip");
  221. {
  222. SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
  223. CPPUNIT_ASSERT(!decoder.isNull());
  224. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecoder"), decoder->getName());
  225. }
  226. httpHeader.reset(new HttpHeader());
  227. httpResponse.setHttpHeader(httpHeader);
  228. httpHeader->put("Content-Encoding", "deflate");
  229. {
  230. SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
  231. CPPUNIT_ASSERT(!decoder.isNull());
  232. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecoder"), decoder->getName());
  233. }
  234. #endif // HAVE_LIBZ
  235. httpHeader.reset(new HttpHeader());
  236. httpResponse.setHttpHeader(httpHeader);
  237. httpHeader->put("Content-Encoding", "bzip2");
  238. {
  239. SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
  240. CPPUNIT_ASSERT(decoder.isNull());
  241. }
  242. }
  243. void HttpResponseTest::testValidateResponse()
  244. {
  245. HttpResponse httpResponse;
  246. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  247. httpResponse.setHttpHeader(httpHeader);
  248. httpHeader->setResponseStatus("304");
  249. try {
  250. httpResponse.validateResponse();
  251. CPPUNIT_FAIL("exception must be thrown.");
  252. } catch(Exception& e) {
  253. }
  254. httpHeader->put("Location", "http://localhost/archives/aria2-1.0.0.tar.bz2");
  255. try {
  256. httpResponse.validateResponse();
  257. } catch(Exception& e) {
  258. CPPUNIT_FAIL("exception must not be thrown.");
  259. }
  260. }
  261. void HttpResponseTest::testValidateResponse_good_range()
  262. {
  263. HttpResponse httpResponse;
  264. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  265. httpResponse.setHttpHeader(httpHeader);
  266. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  267. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  268. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  269. httpRequest->setSegment(segment);
  270. SharedHandle<Request> request(new Request());
  271. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  272. httpRequest->setRequest(request);
  273. httpResponse.setHttpRequest(httpRequest);
  274. httpHeader->setResponseStatus("206");
  275. httpHeader->put("Content-Range", "bytes 1048576-10485760/10485761");
  276. try {
  277. httpResponse.validateResponse();
  278. } catch(Exception& e) {
  279. std::cerr << e.stackTrace() << std::endl;
  280. CPPUNIT_FAIL("exception must not be thrown.");
  281. }
  282. }
  283. void HttpResponseTest::testValidateResponse_bad_range()
  284. {
  285. HttpResponse httpResponse;
  286. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  287. httpResponse.setHttpHeader(httpHeader);
  288. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  289. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  290. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  291. httpRequest->setSegment(segment);
  292. SharedHandle<Request> request(new Request());
  293. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  294. httpRequest->setRequest(request);
  295. httpResponse.setHttpRequest(httpRequest);
  296. httpHeader->setResponseStatus("206");
  297. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  298. try {
  299. httpResponse.validateResponse();
  300. CPPUNIT_FAIL("exception must be thrown.");
  301. } catch(Exception& e) {
  302. }
  303. }
  304. void HttpResponseTest::testValidateResponse_chunked()
  305. {
  306. HttpResponse httpResponse;
  307. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  308. httpResponse.setHttpHeader(httpHeader);
  309. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  310. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  311. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  312. httpRequest->setSegment(segment);
  313. SharedHandle<Request> request(new Request());
  314. request->setUrl("http://localhost/archives/aria2-1.0.0.tar.bz2");
  315. httpRequest->setRequest(request);
  316. httpResponse.setHttpRequest(httpRequest);
  317. httpHeader->setResponseStatus("206");
  318. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  319. httpHeader->put("Transfer-Encoding", "chunked");
  320. // if transfer-encoding is specified, then range validation is skipped.
  321. try {
  322. httpResponse.validateResponse();
  323. } catch(Exception& e) {
  324. CPPUNIT_FAIL("exception must not be thrown.");
  325. }
  326. }
  327. void HttpResponseTest::testHasRetryAfter()
  328. {
  329. HttpResponse httpResponse;
  330. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  331. httpResponse.setHttpHeader(httpHeader);
  332. httpHeader->put("Retry-After", "60");
  333. CPPUNIT_ASSERT(httpResponse.hasRetryAfter());
  334. CPPUNIT_ASSERT_EQUAL((time_t)60, httpResponse.getRetryAfter());
  335. }
  336. } // namespace aria2