HttpResponseTest.cc 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. #include "HttpResponse.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "prefs.h"
  5. #include "PiecedSegment.h"
  6. #include "Piece.h"
  7. #include "Request.h"
  8. #include "HttpHeader.h"
  9. #include "HttpRequest.h"
  10. #include "Exception.h"
  11. #include "A2STR.h"
  12. #include "DlRetryEx.h"
  13. #include "CookieStorage.h"
  14. #include "AuthConfigFactory.h"
  15. #include "AuthConfig.h"
  16. #include "StreamFilter.h"
  17. #include "MetalinkHttpEntry.h"
  18. #include "Option.h"
  19. #include "Checksum.h"
  20. namespace aria2 {
  21. class HttpResponseTest : public CppUnit::TestFixture {
  22. CPPUNIT_TEST_SUITE(HttpResponseTest);
  23. CPPUNIT_TEST(testGetContentLength_null);
  24. CPPUNIT_TEST(testGetContentLength_contentLength);
  25. //CPPUNIT_TEST(testGetContentLength_range);
  26. CPPUNIT_TEST(testGetEntityLength);
  27. CPPUNIT_TEST(testGetContentType);
  28. CPPUNIT_TEST(testDeterminFilename_without_ContentDisposition);
  29. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition_zero_length);
  30. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition);
  31. CPPUNIT_TEST(testGetRedirectURI_without_Location);
  32. CPPUNIT_TEST(testGetRedirectURI_with_Location);
  33. CPPUNIT_TEST(testIsRedirect);
  34. CPPUNIT_TEST(testIsTransferEncodingSpecified);
  35. CPPUNIT_TEST(testGetTransferEncoding);
  36. CPPUNIT_TEST(testGetTransferEncodingStreamFilter);
  37. CPPUNIT_TEST(testIsContentEncodingSpecified);
  38. CPPUNIT_TEST(testGetContentEncoding);
  39. CPPUNIT_TEST(testGetContentEncodingStreamFilter);
  40. CPPUNIT_TEST(testValidateResponse);
  41. CPPUNIT_TEST(testValidateResponse_good_range);
  42. CPPUNIT_TEST(testValidateResponse_bad_range);
  43. CPPUNIT_TEST(testValidateResponse_chunked);
  44. CPPUNIT_TEST(testValidateResponse_withIfModifiedSince);
  45. CPPUNIT_TEST(testHasRetryAfter);
  46. CPPUNIT_TEST(testProcessRedirect);
  47. CPPUNIT_TEST(testRetrieveCookie);
  48. CPPUNIT_TEST(testSupportsPersistentConnection);
  49. CPPUNIT_TEST(testGetMetalinKHttpEntries);
  50. #ifdef ENABLE_MESSAGE_DIGEST
  51. CPPUNIT_TEST(testGetDigest);
  52. #endif // ENABLE_MESSAGE_DIGEST
  53. CPPUNIT_TEST_SUITE_END();
  54. private:
  55. public:
  56. void setUp() {
  57. }
  58. void testGetContentLength_null();
  59. void testGetContentLength_contentLength();
  60. void testGetEntityLength();
  61. void testGetContentType();
  62. void testDeterminFilename_without_ContentDisposition();
  63. void testDeterminFilename_with_ContentDisposition_zero_length();
  64. void testDeterminFilename_with_ContentDisposition();
  65. void testGetRedirectURI_without_Location();
  66. void testGetRedirectURI_with_Location();
  67. void testIsRedirect();
  68. void testIsTransferEncodingSpecified();
  69. void testGetTransferEncoding();
  70. void testGetTransferEncodingStreamFilter();
  71. void testIsContentEncodingSpecified();
  72. void testGetContentEncoding();
  73. void testGetContentEncodingStreamFilter();
  74. void testValidateResponse();
  75. void testValidateResponse_good_range();
  76. void testValidateResponse_bad_range();
  77. void testValidateResponse_chunked();
  78. void testValidateResponse_withIfModifiedSince();
  79. void testHasRetryAfter();
  80. void testProcessRedirect();
  81. void testRetrieveCookie();
  82. void testSupportsPersistentConnection();
  83. void testGetMetalinKHttpEntries();
  84. #ifdef ENABLE_MESSAGE_DIGEST
  85. void testGetDigest();
  86. #endif // ENABLE_MESSAGE_DIGEST
  87. };
  88. CPPUNIT_TEST_SUITE_REGISTRATION( HttpResponseTest );
  89. void HttpResponseTest::testGetContentLength_null()
  90. {
  91. HttpResponse httpResponse;
  92. CPPUNIT_ASSERT_EQUAL((int64_t)0LL, httpResponse.getContentLength());
  93. }
  94. void HttpResponseTest::testGetContentLength_contentLength()
  95. {
  96. HttpResponse httpResponse;
  97. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  98. httpHeader->put(HttpHeader::CONTENT_LENGTH, "4294967296");
  99. httpResponse.setHttpHeader(httpHeader);
  100. CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getContentLength());
  101. }
  102. void HttpResponseTest::testGetEntityLength()
  103. {
  104. HttpResponse httpResponse;
  105. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  106. httpHeader->put(HttpHeader::CONTENT_LENGTH, "4294967296");
  107. httpResponse.setHttpHeader(httpHeader);
  108. CPPUNIT_ASSERT_EQUAL((int64_t)4294967296LL, httpResponse.getEntityLength());
  109. httpHeader->put(HttpHeader::CONTENT_RANGE, "bytes 1-4294967296/4294967297");
  110. CPPUNIT_ASSERT_EQUAL((int64_t)4294967297LL, httpResponse.getEntityLength());
  111. }
  112. void HttpResponseTest::testGetContentType()
  113. {
  114. HttpResponse httpResponse;
  115. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  116. httpHeader->put(HttpHeader::CONTENT_TYPE,
  117. "application/metalink+xml; charset=UTF-8");
  118. httpResponse.setHttpHeader(httpHeader);
  119. // See paramter is ignored.
  120. CPPUNIT_ASSERT_EQUAL(std::string("application/metalink+xml"),
  121. httpResponse.getContentType());
  122. }
  123. void HttpResponseTest::testDeterminFilename_without_ContentDisposition()
  124. {
  125. HttpResponse httpResponse;
  126. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  127. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  128. SharedHandle<Request> request(new Request());
  129. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  130. httpRequest->setRequest(request);
  131. httpResponse.setHttpHeader(httpHeader);
  132. httpResponse.setHttpRequest(httpRequest);
  133. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  134. httpResponse.determinFilename());
  135. }
  136. void HttpResponseTest::testDeterminFilename_with_ContentDisposition_zero_length
  137. ()
  138. {
  139. HttpResponse httpResponse;
  140. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  141. httpHeader->put(HttpHeader::CONTENT_DISPOSITION, "attachment; filename=\"\"");
  142. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  143. SharedHandle<Request> request(new Request());
  144. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  145. httpRequest->setRequest(request);
  146. httpResponse.setHttpHeader(httpHeader);
  147. httpResponse.setHttpRequest(httpRequest);
  148. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  149. httpResponse.determinFilename());
  150. }
  151. void HttpResponseTest::testDeterminFilename_with_ContentDisposition()
  152. {
  153. HttpResponse httpResponse;
  154. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  155. httpHeader->put(HttpHeader::CONTENT_DISPOSITION,
  156. "attachment; filename=\"aria2-current.tar.bz2\"");
  157. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  158. SharedHandle<Request> request(new Request());
  159. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  160. httpRequest->setRequest(request);
  161. httpResponse.setHttpHeader(httpHeader);
  162. httpResponse.setHttpRequest(httpRequest);
  163. CPPUNIT_ASSERT_EQUAL(std::string("aria2-current.tar.bz2"),
  164. httpResponse.determinFilename());
  165. }
  166. void HttpResponseTest::testGetRedirectURI_without_Location()
  167. {
  168. HttpResponse httpResponse;
  169. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  170. httpResponse.setHttpHeader(httpHeader);
  171. CPPUNIT_ASSERT_EQUAL(std::string(""),
  172. httpResponse.getRedirectURI());
  173. }
  174. void HttpResponseTest::testGetRedirectURI_with_Location()
  175. {
  176. HttpResponse httpResponse;
  177. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  178. httpHeader->put(HttpHeader::LOCATION, "http://localhost/download/aria2-1.0.0.tar.bz2");
  179. httpResponse.setHttpHeader(httpHeader);
  180. CPPUNIT_ASSERT_EQUAL
  181. (std::string("http://localhost/download/aria2-1.0.0.tar.bz2"),
  182. httpResponse.getRedirectURI());
  183. }
  184. void HttpResponseTest::testIsRedirect()
  185. {
  186. HttpResponse httpResponse;
  187. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  188. httpHeader->setStatusCode(200);
  189. httpHeader->put(HttpHeader::LOCATION,
  190. "http://localhost/download/aria2-1.0.0.tar.bz2");
  191. httpResponse.setHttpHeader(httpHeader);
  192. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  193. httpHeader->setStatusCode(301);
  194. CPPUNIT_ASSERT(httpResponse.isRedirect());
  195. }
  196. void HttpResponseTest::testIsTransferEncodingSpecified()
  197. {
  198. HttpResponse httpResponse;
  199. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  200. httpResponse.setHttpHeader(httpHeader);
  201. CPPUNIT_ASSERT(!httpResponse.isTransferEncodingSpecified());
  202. httpHeader->put(HttpHeader::TRANSFER_ENCODING, "chunked");
  203. CPPUNIT_ASSERT(httpResponse.isTransferEncodingSpecified());
  204. }
  205. void HttpResponseTest::testGetTransferEncoding()
  206. {
  207. HttpResponse httpResponse;
  208. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  209. httpResponse.setHttpHeader(httpHeader);
  210. CPPUNIT_ASSERT_EQUAL(std::string(""), httpResponse.getTransferEncoding());
  211. httpHeader->put(HttpHeader::TRANSFER_ENCODING, "chunked");
  212. CPPUNIT_ASSERT_EQUAL(std::string("chunked"),
  213. httpResponse.getTransferEncoding());
  214. }
  215. void HttpResponseTest::testGetTransferEncodingStreamFilter()
  216. {
  217. HttpResponse httpResponse;
  218. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  219. httpResponse.setHttpHeader(httpHeader);
  220. CPPUNIT_ASSERT(!httpResponse.getTransferEncodingStreamFilter());
  221. httpHeader->put(HttpHeader::TRANSFER_ENCODING, "chunked");
  222. CPPUNIT_ASSERT(httpResponse.getTransferEncodingStreamFilter());
  223. }
  224. void HttpResponseTest::testIsContentEncodingSpecified()
  225. {
  226. HttpResponse httpResponse;
  227. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  228. httpResponse.setHttpHeader(httpHeader);
  229. CPPUNIT_ASSERT(!httpResponse.isContentEncodingSpecified());
  230. httpHeader->put(HttpHeader::CONTENT_ENCODING, "gzip");
  231. CPPUNIT_ASSERT(httpResponse.isContentEncodingSpecified());
  232. }
  233. void HttpResponseTest::testGetContentEncoding()
  234. {
  235. HttpResponse httpResponse;
  236. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  237. httpResponse.setHttpHeader(httpHeader);
  238. CPPUNIT_ASSERT_EQUAL(A2STR::NIL, httpResponse.getContentEncoding());
  239. httpHeader->put(HttpHeader::CONTENT_ENCODING, "gzip");
  240. CPPUNIT_ASSERT_EQUAL(std::string("gzip"), httpResponse.getContentEncoding());
  241. }
  242. void HttpResponseTest::testGetContentEncodingStreamFilter()
  243. {
  244. HttpResponse httpResponse;
  245. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  246. httpResponse.setHttpHeader(httpHeader);
  247. CPPUNIT_ASSERT(!httpResponse.getContentEncodingStreamFilter());
  248. #ifdef HAVE_ZLIB
  249. httpHeader->put(HttpHeader::CONTENT_ENCODING, "gzip");
  250. {
  251. SharedHandle<StreamFilter> filter =
  252. httpResponse.getContentEncodingStreamFilter();
  253. CPPUNIT_ASSERT(filter);
  254. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecodingStreamFilter"),
  255. filter->getName());
  256. }
  257. httpHeader.reset(new HttpHeader());
  258. httpResponse.setHttpHeader(httpHeader);
  259. httpHeader->put(HttpHeader::CONTENT_ENCODING, "deflate");
  260. {
  261. SharedHandle<StreamFilter> filter =
  262. httpResponse.getContentEncodingStreamFilter();
  263. CPPUNIT_ASSERT(filter);
  264. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecodingStreamFilter"),
  265. filter->getName());
  266. }
  267. #endif // HAVE_ZLIB
  268. httpHeader.reset(new HttpHeader());
  269. httpResponse.setHttpHeader(httpHeader);
  270. httpHeader->put(HttpHeader::CONTENT_ENCODING, "bzip2");
  271. {
  272. SharedHandle<StreamFilter> filter =
  273. httpResponse.getContentEncodingStreamFilter();
  274. CPPUNIT_ASSERT(!filter);
  275. }
  276. }
  277. void HttpResponseTest::testValidateResponse()
  278. {
  279. HttpResponse httpResponse;
  280. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  281. httpResponse.setHttpHeader(httpHeader);
  282. httpHeader->setStatusCode(301);
  283. try {
  284. httpResponse.validateResponse();
  285. CPPUNIT_FAIL("exception must be thrown.");
  286. } catch(Exception& e) {
  287. }
  288. httpHeader->put(HttpHeader::LOCATION,
  289. "http://localhost/archives/aria2-1.0.0.tar.bz2");
  290. try {
  291. httpResponse.validateResponse();
  292. } catch(Exception& e) {
  293. CPPUNIT_FAIL("exception must not be thrown.");
  294. }
  295. }
  296. void HttpResponseTest::testValidateResponse_good_range()
  297. {
  298. HttpResponse httpResponse;
  299. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  300. httpResponse.setHttpHeader(httpHeader);
  301. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  302. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  303. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  304. httpRequest->setSegment(segment);
  305. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  306. httpRequest->setFileEntry(fileEntry);
  307. SharedHandle<Request> request(new Request());
  308. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  309. httpRequest->setRequest(request);
  310. httpResponse.setHttpRequest(httpRequest);
  311. httpHeader->setStatusCode(206);
  312. httpHeader->put(HttpHeader::CONTENT_RANGE, "bytes 1048576-10485760/10485760");
  313. try {
  314. httpResponse.validateResponse();
  315. } catch(Exception& e) {
  316. std::cerr << e.stackTrace() << std::endl;
  317. CPPUNIT_FAIL("exception must not be thrown.");
  318. }
  319. }
  320. void HttpResponseTest::testValidateResponse_bad_range()
  321. {
  322. HttpResponse httpResponse;
  323. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  324. httpResponse.setHttpHeader(httpHeader);
  325. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  326. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  327. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  328. httpRequest->setSegment(segment);
  329. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  330. httpRequest->setFileEntry(fileEntry);
  331. SharedHandle<Request> request(new Request());
  332. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  333. httpRequest->setRequest(request);
  334. httpResponse.setHttpRequest(httpRequest);
  335. httpHeader->setStatusCode(206);
  336. httpHeader->put(HttpHeader::CONTENT_RANGE, "bytes 0-10485760/10485761");
  337. try {
  338. httpResponse.validateResponse();
  339. CPPUNIT_FAIL("exception must be thrown.");
  340. } catch(Exception& e) {
  341. }
  342. }
  343. void HttpResponseTest::testValidateResponse_chunked()
  344. {
  345. HttpResponse httpResponse;
  346. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  347. httpResponse.setHttpHeader(httpHeader);
  348. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  349. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  350. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  351. httpRequest->setSegment(segment);
  352. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  353. httpRequest->setFileEntry(fileEntry);
  354. SharedHandle<Request> request(new Request());
  355. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  356. httpRequest->setRequest(request);
  357. httpResponse.setHttpRequest(httpRequest);
  358. httpHeader->setStatusCode(206);
  359. httpHeader->put(HttpHeader::CONTENT_RANGE, "bytes 0-10485760/10485761");
  360. httpHeader->put(HttpHeader::TRANSFER_ENCODING, "chunked");
  361. // if transfer-encoding is specified, then range validation is skipped.
  362. try {
  363. httpResponse.validateResponse();
  364. } catch(Exception& e) {
  365. CPPUNIT_FAIL("exception must not be thrown.");
  366. }
  367. }
  368. void HttpResponseTest::testValidateResponse_withIfModifiedSince()
  369. {
  370. HttpResponse httpResponse;
  371. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  372. httpResponse.setHttpHeader(httpHeader);
  373. httpHeader->setStatusCode(304);
  374. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  375. httpResponse.setHttpRequest(httpRequest);
  376. try {
  377. httpResponse.validateResponse();
  378. CPPUNIT_FAIL("exception must be thrown.");
  379. } catch(Exception& e) {
  380. }
  381. httpRequest->setIfModifiedSinceHeader("Fri, 16 Jul 2010 12:56:59 GMT");
  382. httpResponse.validateResponse();
  383. }
  384. void HttpResponseTest::testHasRetryAfter()
  385. {
  386. HttpResponse httpResponse;
  387. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  388. httpResponse.setHttpHeader(httpHeader);
  389. httpHeader->put(HttpHeader::RETRY_AFTER, "60");
  390. CPPUNIT_ASSERT(httpResponse.hasRetryAfter());
  391. CPPUNIT_ASSERT_EQUAL((time_t)60, httpResponse.getRetryAfter());
  392. }
  393. void HttpResponseTest::testProcessRedirect()
  394. {
  395. HttpResponse httpResponse;
  396. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  397. httpResponse.setHttpHeader(httpHeader);
  398. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  399. SharedHandle<Request> request(new Request());
  400. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  401. httpRequest->setRequest(request);
  402. httpResponse.setHttpRequest(httpRequest);
  403. httpHeader->put(HttpHeader::LOCATION, "http://mirror/aria2-1.0.0.tar.bz2");
  404. httpResponse.processRedirect();
  405. httpHeader->clearField();
  406. // Test for percent-encode
  407. httpHeader->put(HttpHeader::LOCATION, "http://example.org/white space#aria2");
  408. httpResponse.processRedirect();
  409. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/white%20space"),
  410. request->getCurrentUri());
  411. httpHeader->clearField();
  412. // Give unsupported scheme
  413. httpHeader->put(HttpHeader::LOCATION,
  414. "unsupported://mirror/aria2-1.0.0.tar.bz2");
  415. try {
  416. httpResponse.processRedirect();
  417. CPPUNIT_FAIL("DlRetryEx exception must be thrown.");
  418. } catch(DlRetryEx& e) {
  419. // Success
  420. } catch(...) {
  421. CPPUNIT_FAIL("DlRetryEx exception must be thrown.");
  422. }
  423. }
  424. void HttpResponseTest::testRetrieveCookie()
  425. {
  426. HttpResponse httpResponse;
  427. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  428. httpResponse.setHttpHeader(httpHeader);
  429. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  430. SharedHandle<Request> request(new Request());
  431. request->setUri("http://www.aria2.org/archives/aria2-1.0.0.tar.bz2");
  432. httpRequest->setRequest(request);
  433. SharedHandle<CookieStorage> st(new CookieStorage());
  434. httpRequest->setCookieStorage(st);
  435. httpResponse.setHttpRequest(httpRequest);
  436. httpHeader->put(HttpHeader::SET_COOKIE,
  437. "k1=v1; expires=Sun, 10-Jun-2007 11:00:00 GMT;"
  438. "path=/; domain=.aria2.org;");
  439. httpHeader->put(HttpHeader::SET_COOKIE,
  440. "k2=v2; expires=Sun, 01-Jan-38 00:00:00 GMT;"
  441. "path=/; domain=.aria2.org;");
  442. httpHeader->put(HttpHeader::SET_COOKIE, "k3=v3;");
  443. httpResponse.retrieveCookie();
  444. CPPUNIT_ASSERT_EQUAL((size_t)2, st->size());
  445. std::vector<Cookie> cookies;
  446. st->dumpCookie(std::back_inserter(cookies));
  447. CPPUNIT_ASSERT_EQUAL(std::string("k2=v2"), cookies[0].toString());
  448. CPPUNIT_ASSERT_EQUAL(std::string("k3=v3"), cookies[1].toString());
  449. }
  450. void HttpResponseTest::testSupportsPersistentConnection()
  451. {
  452. HttpResponse httpResponse;
  453. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  454. httpResponse.setHttpHeader(httpHeader);
  455. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  456. httpResponse.setHttpRequest(httpRequest);
  457. httpHeader->setVersion("HTTP/1.1");
  458. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  459. httpHeader->put(HttpHeader::CONNECTION, "close");
  460. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  461. httpHeader->clearField();
  462. httpHeader->put(HttpHeader::CONNECTION, "keep-alive");
  463. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  464. httpHeader->clearField();
  465. httpHeader->setVersion("HTTP/1.0");
  466. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  467. httpHeader->put(HttpHeader::CONNECTION, "close");
  468. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  469. httpHeader->clearField();
  470. httpHeader->put(HttpHeader::CONNECTION, "keep-alive");
  471. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  472. httpHeader->clearField();
  473. // test proxy connection
  474. SharedHandle<Request> proxyRequest(new Request());
  475. httpRequest->setProxyRequest(proxyRequest);
  476. httpHeader->setVersion("HTTP/1.1");
  477. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  478. httpHeader->put(HttpHeader::CONNECTION, "close");
  479. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  480. httpHeader->clearField();
  481. httpHeader->put(HttpHeader::CONNECTION, "keep-alive");
  482. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  483. httpHeader->clearField();
  484. httpHeader->put(HttpHeader::PROXY_CONNECTION, "keep-alive");
  485. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  486. httpHeader->put(HttpHeader::CONNECTION, "close");
  487. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  488. httpHeader->clearField();
  489. httpHeader->put(HttpHeader::PROXY_CONNECTION, "close");
  490. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  491. httpHeader->clearField();
  492. httpHeader->setVersion("HTTP/1.0");
  493. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  494. httpHeader->put(HttpHeader::CONNECTION, "close");
  495. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  496. httpHeader->clearField();
  497. httpHeader->put(HttpHeader::CONNECTION, "keep-alive");
  498. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  499. httpHeader->put(HttpHeader::PROXY_CONNECTION, "keep-alive");
  500. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  501. httpHeader->clearField();
  502. httpHeader->put(HttpHeader::PROXY_CONNECTION, "keep-alive");
  503. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  504. httpHeader->clearField();
  505. httpHeader->put(HttpHeader::PROXY_CONNECTION, "close");
  506. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  507. httpHeader->clearField();
  508. }
  509. void HttpResponseTest::testGetMetalinKHttpEntries()
  510. {
  511. HttpResponse httpResponse;
  512. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  513. httpResponse.setHttpHeader(httpHeader);
  514. SharedHandle<Option> option(new Option());
  515. httpHeader->put(HttpHeader::LINK,
  516. "<http://uri1/>; rel=duplicate; pri=1; pref; geo=JP");
  517. httpHeader->put(HttpHeader::LINK,
  518. "<http://uri2/>; rel=duplicate");
  519. httpHeader->put(HttpHeader::LINK,
  520. "<http://uri3/>;;;;;;;;rel=duplicate;;;;;pri=2;;;;;");
  521. httpHeader->put(HttpHeader::LINK, "<http://uri4/>;rel=duplicate;=pri=1;pref");
  522. httpHeader->put(HttpHeader::LINK, "<http://describedby>; rel=describedby");
  523. httpHeader->put(HttpHeader::LINK, "<http://norel/>");
  524. httpHeader->put(HttpHeader::LINK, "<baduri>; rel=duplicate; pri=-1;");
  525. std::vector<MetalinkHttpEntry> result;
  526. httpResponse.getMetalinKHttpEntries(result, option);
  527. CPPUNIT_ASSERT_EQUAL((size_t)5, result.size());
  528. MetalinkHttpEntry e = result[0];
  529. CPPUNIT_ASSERT_EQUAL(std::string("http://uri1/"), e.uri);
  530. CPPUNIT_ASSERT_EQUAL(1, e.pri);
  531. CPPUNIT_ASSERT(e.pref);
  532. CPPUNIT_ASSERT_EQUAL(std::string("jp"), e.geo);
  533. e = result[1];
  534. CPPUNIT_ASSERT_EQUAL(std::string("http://uri4/"), e.uri);
  535. CPPUNIT_ASSERT_EQUAL(999999, e.pri);
  536. CPPUNIT_ASSERT(e.pref);
  537. CPPUNIT_ASSERT(e.geo.empty());
  538. e = result[2];
  539. CPPUNIT_ASSERT_EQUAL(std::string("http://uri3/"), e.uri);
  540. CPPUNIT_ASSERT_EQUAL(2, e.pri);
  541. CPPUNIT_ASSERT(!e.pref);
  542. CPPUNIT_ASSERT(e.geo.empty());
  543. e = result[3];
  544. CPPUNIT_ASSERT_EQUAL(std::string("http://uri2/"), e.uri);
  545. CPPUNIT_ASSERT_EQUAL(999999, e.pri);
  546. CPPUNIT_ASSERT(!e.pref);
  547. CPPUNIT_ASSERT(e.geo.empty());
  548. e = result[4];
  549. CPPUNIT_ASSERT_EQUAL(std::string("baduri"), e.uri);
  550. CPPUNIT_ASSERT_EQUAL(999999, e.pri);
  551. CPPUNIT_ASSERT(!e.pref);
  552. CPPUNIT_ASSERT(e.geo.empty());
  553. }
  554. #ifdef ENABLE_MESSAGE_DIGEST
  555. void HttpResponseTest::testGetDigest()
  556. {
  557. HttpResponse httpResponse;
  558. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  559. httpResponse.setHttpHeader(httpHeader);
  560. SharedHandle<Option> option(new Option());
  561. // Python binascii.hexlify(base64.b64decode(B64ED_HASH)) is handy to
  562. // retrieve ascii hex hash string.
  563. httpHeader->put(HttpHeader::DIGEST, "SHA-1=82AD8itGL/oYQ5BTPFANiYnp9oE=");
  564. httpHeader->put(HttpHeader::DIGEST, "NOT_SUPPORTED");
  565. httpHeader->put(HttpHeader::DIGEST,
  566. "SHA-224=rQdowoLHQJTMVZ3rF7vmYOIzUXlu7F+FcMbPnA==");
  567. httpHeader->put(HttpHeader::DIGEST,
  568. "SHA-224=6Ik6LNZ1iPy6cbmlKO4NHfvxzaiurmHilMyhGA==");
  569. httpHeader->put(HttpHeader::DIGEST,
  570. "SHA-256=+D8nGudz3G/kpkVKQeDrI3xD57v0UeQmzGCZOk03nsU=,"
  571. "MD5=LJDK2+9ClF8Nz/K5WZd/+A==");
  572. std::vector<Checksum> result;
  573. httpResponse.getDigest(result);
  574. CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
  575. Checksum c = result[0];
  576. CPPUNIT_ASSERT_EQUAL(std::string("sha-256"), c.getHashType());
  577. CPPUNIT_ASSERT_EQUAL(std::string("f83f271ae773dc6fe4a6454a41e0eb237c43e7bbf451e426cc60993a4d379ec5"),
  578. util::toHex(c.getDigest()));
  579. c = result[1];
  580. CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), c.getHashType());
  581. CPPUNIT_ASSERT_EQUAL(std::string("f36003f22b462ffa184390533c500d8989e9f681"),
  582. util::toHex(c.getDigest()));
  583. }
  584. #endif // ENABLE_MESSAGE_DIGEST
  585. } // namespace aria2