HttpResponseTest.cc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  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 "Decoder.h"
  13. #include "DlRetryEx.h"
  14. #include "CookieStorage.h"
  15. #include "AuthConfigFactory.h"
  16. #include "AuthConfig.h"
  17. namespace aria2 {
  18. class HttpResponseTest : public CppUnit::TestFixture {
  19. CPPUNIT_TEST_SUITE(HttpResponseTest);
  20. CPPUNIT_TEST(testGetContentLength_null);
  21. CPPUNIT_TEST(testGetContentLength_contentLength);
  22. //CPPUNIT_TEST(testGetContentLength_range);
  23. CPPUNIT_TEST(testGetEntityLength);
  24. CPPUNIT_TEST(testGetContentType);
  25. CPPUNIT_TEST(testDeterminFilename_without_ContentDisposition);
  26. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition_zero_length);
  27. CPPUNIT_TEST(testDeterminFilename_with_ContentDisposition);
  28. CPPUNIT_TEST(testGetRedirectURI_without_Location);
  29. CPPUNIT_TEST(testGetRedirectURI_with_Location);
  30. CPPUNIT_TEST(testIsRedirect);
  31. CPPUNIT_TEST(testIsTransferEncodingSpecified);
  32. CPPUNIT_TEST(testGetTransferEncoding);
  33. CPPUNIT_TEST(testGetTransferEncodingDecoder);
  34. CPPUNIT_TEST(testIsContentEncodingSpecified);
  35. CPPUNIT_TEST(testGetContentEncoding);
  36. CPPUNIT_TEST(testGetContentEncodingDecoder);
  37. CPPUNIT_TEST(testValidateResponse);
  38. CPPUNIT_TEST(testValidateResponse_good_range);
  39. CPPUNIT_TEST(testValidateResponse_bad_range);
  40. CPPUNIT_TEST(testValidateResponse_chunked);
  41. CPPUNIT_TEST(testValidateResponse_withIfModifiedSince);
  42. CPPUNIT_TEST(testHasRetryAfter);
  43. CPPUNIT_TEST(testProcessRedirect);
  44. CPPUNIT_TEST(testRetrieveCookie);
  45. CPPUNIT_TEST(testSupportsPersistentConnection);
  46. CPPUNIT_TEST_SUITE_END();
  47. private:
  48. public:
  49. void setUp() {
  50. }
  51. void testGetContentLength_null();
  52. void testGetContentLength_contentLength();
  53. void testGetEntityLength();
  54. void testGetContentType();
  55. void testDeterminFilename_without_ContentDisposition();
  56. void testDeterminFilename_with_ContentDisposition_zero_length();
  57. void testDeterminFilename_with_ContentDisposition();
  58. void testGetRedirectURI_without_Location();
  59. void testGetRedirectURI_with_Location();
  60. void testIsRedirect();
  61. void testIsTransferEncodingSpecified();
  62. void testGetTransferEncoding();
  63. void testGetTransferEncodingDecoder();
  64. void testIsContentEncodingSpecified();
  65. void testGetContentEncoding();
  66. void testGetContentEncodingDecoder();
  67. void testValidateResponse();
  68. void testValidateResponse_good_range();
  69. void testValidateResponse_bad_range();
  70. void testValidateResponse_chunked();
  71. void testValidateResponse_withIfModifiedSince();
  72. void testHasRetryAfter();
  73. void testProcessRedirect();
  74. void testRetrieveCookie();
  75. void testSupportsPersistentConnection();
  76. };
  77. CPPUNIT_TEST_SUITE_REGISTRATION( HttpResponseTest );
  78. void HttpResponseTest::testGetContentLength_null()
  79. {
  80. HttpResponse httpResponse;
  81. CPPUNIT_ASSERT_EQUAL((uint64_t)0ULL, httpResponse.getContentLength());
  82. }
  83. void HttpResponseTest::testGetContentLength_contentLength()
  84. {
  85. HttpResponse httpResponse;
  86. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  87. httpHeader->put("Content-Length", "4294967296");
  88. httpResponse.setHttpHeader(httpHeader);
  89. CPPUNIT_ASSERT_EQUAL((uint64_t)4294967296ULL, httpResponse.getContentLength());
  90. }
  91. void HttpResponseTest::testGetEntityLength()
  92. {
  93. HttpResponse httpResponse;
  94. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  95. httpHeader->put("Content-Length", "4294967296");
  96. httpResponse.setHttpHeader(httpHeader);
  97. CPPUNIT_ASSERT_EQUAL((uint64_t)4294967296ULL, httpResponse.getEntityLength());
  98. httpHeader->put("Content-Range", "bytes 1-4294967296/4294967297");
  99. CPPUNIT_ASSERT_EQUAL((uint64_t)4294967297ULL, httpResponse.getEntityLength());
  100. }
  101. void HttpResponseTest::testGetContentType()
  102. {
  103. HttpResponse httpResponse;
  104. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  105. httpHeader->put("content-type", "application/metalink+xml; charset=UTF-8");
  106. httpResponse.setHttpHeader(httpHeader);
  107. // See paramter is ignored.
  108. CPPUNIT_ASSERT_EQUAL(std::string("application/metalink+xml"),
  109. httpResponse.getContentType());
  110. }
  111. void HttpResponseTest::testDeterminFilename_without_ContentDisposition()
  112. {
  113. HttpResponse httpResponse;
  114. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  115. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  116. SharedHandle<Request> request(new Request());
  117. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  118. httpRequest->setRequest(request);
  119. httpResponse.setHttpHeader(httpHeader);
  120. httpResponse.setHttpRequest(httpRequest);
  121. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  122. httpResponse.determinFilename());
  123. }
  124. void HttpResponseTest::testDeterminFilename_with_ContentDisposition_zero_length
  125. ()
  126. {
  127. HttpResponse httpResponse;
  128. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  129. httpHeader->put("Content-Disposition", "attachment; filename=\"\"");
  130. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  131. SharedHandle<Request> request(new Request());
  132. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  133. httpRequest->setRequest(request);
  134. httpResponse.setHttpHeader(httpHeader);
  135. httpResponse.setHttpRequest(httpRequest);
  136. CPPUNIT_ASSERT_EQUAL(std::string("aria2-1.0.0.tar.bz2"),
  137. httpResponse.determinFilename());
  138. }
  139. void HttpResponseTest::testDeterminFilename_with_ContentDisposition()
  140. {
  141. HttpResponse httpResponse;
  142. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  143. httpHeader->put("Content-Disposition",
  144. "attachment; filename=\"aria2-current.tar.bz2\"");
  145. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  146. SharedHandle<Request> request(new Request());
  147. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  148. httpRequest->setRequest(request);
  149. httpResponse.setHttpHeader(httpHeader);
  150. httpResponse.setHttpRequest(httpRequest);
  151. CPPUNIT_ASSERT_EQUAL(std::string("aria2-current.tar.bz2"),
  152. httpResponse.determinFilename());
  153. }
  154. void HttpResponseTest::testGetRedirectURI_without_Location()
  155. {
  156. HttpResponse httpResponse;
  157. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  158. httpResponse.setHttpHeader(httpHeader);
  159. CPPUNIT_ASSERT_EQUAL(std::string(""),
  160. httpResponse.getRedirectURI());
  161. }
  162. void HttpResponseTest::testGetRedirectURI_with_Location()
  163. {
  164. HttpResponse httpResponse;
  165. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  166. httpHeader->put("Location", "http://localhost/download/aria2-1.0.0.tar.bz2");
  167. httpResponse.setHttpHeader(httpHeader);
  168. CPPUNIT_ASSERT_EQUAL
  169. (std::string("http://localhost/download/aria2-1.0.0.tar.bz2"),
  170. httpResponse.getRedirectURI());
  171. }
  172. void HttpResponseTest::testIsRedirect()
  173. {
  174. HttpResponse httpResponse;
  175. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  176. httpHeader->setResponseStatus("200");
  177. httpHeader->put("Location", "http://localhost/download/aria2-1.0.0.tar.bz2");
  178. httpResponse.setHttpHeader(httpHeader);
  179. CPPUNIT_ASSERT(!httpResponse.isRedirect());
  180. httpHeader->setResponseStatus("301");
  181. CPPUNIT_ASSERT(httpResponse.isRedirect());
  182. }
  183. void HttpResponseTest::testIsTransferEncodingSpecified()
  184. {
  185. HttpResponse httpResponse;
  186. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  187. httpResponse.setHttpHeader(httpHeader);
  188. CPPUNIT_ASSERT(!httpResponse.isTransferEncodingSpecified());
  189. httpHeader->put("Transfer-Encoding", "chunked");
  190. CPPUNIT_ASSERT(httpResponse.isTransferEncodingSpecified());
  191. }
  192. void HttpResponseTest::testGetTransferEncoding()
  193. {
  194. HttpResponse httpResponse;
  195. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  196. httpResponse.setHttpHeader(httpHeader);
  197. CPPUNIT_ASSERT_EQUAL(std::string(""), httpResponse.getTransferEncoding());
  198. httpHeader->put("Transfer-Encoding", "chunked");
  199. CPPUNIT_ASSERT_EQUAL(std::string("chunked"),
  200. httpResponse.getTransferEncoding());
  201. }
  202. void HttpResponseTest::testGetTransferEncodingDecoder()
  203. {
  204. HttpResponse httpResponse;
  205. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  206. httpResponse.setHttpHeader(httpHeader);
  207. CPPUNIT_ASSERT(httpResponse.getTransferEncodingDecoder().isNull());
  208. httpHeader->put("Transfer-Encoding", "chunked");
  209. CPPUNIT_ASSERT(!httpResponse.getTransferEncodingDecoder().isNull());
  210. }
  211. void HttpResponseTest::testIsContentEncodingSpecified()
  212. {
  213. HttpResponse httpResponse;
  214. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  215. httpResponse.setHttpHeader(httpHeader);
  216. CPPUNIT_ASSERT(!httpResponse.isContentEncodingSpecified());
  217. httpHeader->put("Content-Encoding", "gzip");
  218. CPPUNIT_ASSERT(httpResponse.isContentEncodingSpecified());
  219. }
  220. void HttpResponseTest::testGetContentEncoding()
  221. {
  222. HttpResponse httpResponse;
  223. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  224. httpResponse.setHttpHeader(httpHeader);
  225. CPPUNIT_ASSERT_EQUAL(A2STR::NIL, httpResponse.getContentEncoding());
  226. httpHeader->put("Content-Encoding", "gzip");
  227. CPPUNIT_ASSERT_EQUAL(std::string("gzip"), httpResponse.getContentEncoding());
  228. }
  229. void HttpResponseTest::testGetContentEncodingDecoder()
  230. {
  231. HttpResponse httpResponse;
  232. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  233. httpResponse.setHttpHeader(httpHeader);
  234. CPPUNIT_ASSERT(httpResponse.getContentEncodingDecoder().isNull());
  235. #ifdef HAVE_LIBZ
  236. httpHeader->put("Content-Encoding", "gzip");
  237. {
  238. SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
  239. CPPUNIT_ASSERT(!decoder.isNull());
  240. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecoder"), decoder->getName());
  241. }
  242. httpHeader.reset(new HttpHeader());
  243. httpResponse.setHttpHeader(httpHeader);
  244. httpHeader->put("Content-Encoding", "deflate");
  245. {
  246. SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
  247. CPPUNIT_ASSERT(!decoder.isNull());
  248. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecoder"), decoder->getName());
  249. }
  250. #endif // HAVE_LIBZ
  251. httpHeader.reset(new HttpHeader());
  252. httpResponse.setHttpHeader(httpHeader);
  253. httpHeader->put("Content-Encoding", "bzip2");
  254. {
  255. SharedHandle<Decoder> decoder = httpResponse.getContentEncodingDecoder();
  256. CPPUNIT_ASSERT(decoder.isNull());
  257. }
  258. }
  259. void HttpResponseTest::testValidateResponse()
  260. {
  261. HttpResponse httpResponse;
  262. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  263. httpResponse.setHttpHeader(httpHeader);
  264. httpHeader->setResponseStatus("301");
  265. try {
  266. httpResponse.validateResponse();
  267. CPPUNIT_FAIL("exception must be thrown.");
  268. } catch(Exception& e) {
  269. }
  270. httpHeader->put("Location", "http://localhost/archives/aria2-1.0.0.tar.bz2");
  271. try {
  272. httpResponse.validateResponse();
  273. } catch(Exception& e) {
  274. CPPUNIT_FAIL("exception must not be thrown.");
  275. }
  276. }
  277. void HttpResponseTest::testValidateResponse_good_range()
  278. {
  279. HttpResponse httpResponse;
  280. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  281. httpResponse.setHttpHeader(httpHeader);
  282. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  283. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  284. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  285. httpRequest->setSegment(segment);
  286. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  287. httpRequest->setFileEntry(fileEntry);
  288. SharedHandle<Request> request(new Request());
  289. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  290. httpRequest->setRequest(request);
  291. httpResponse.setHttpRequest(httpRequest);
  292. httpHeader->setResponseStatus("206");
  293. httpHeader->put("Content-Range", "bytes 1048576-10485760/10485760");
  294. try {
  295. httpResponse.validateResponse();
  296. } catch(Exception& e) {
  297. std::cerr << e.stackTrace() << std::endl;
  298. CPPUNIT_FAIL("exception must not be thrown.");
  299. }
  300. }
  301. void HttpResponseTest::testValidateResponse_bad_range()
  302. {
  303. HttpResponse httpResponse;
  304. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  305. httpResponse.setHttpHeader(httpHeader);
  306. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  307. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  308. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  309. httpRequest->setSegment(segment);
  310. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  311. httpRequest->setFileEntry(fileEntry);
  312. SharedHandle<Request> request(new Request());
  313. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  314. httpRequest->setRequest(request);
  315. httpResponse.setHttpRequest(httpRequest);
  316. httpHeader->setResponseStatus("206");
  317. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  318. try {
  319. httpResponse.validateResponse();
  320. CPPUNIT_FAIL("exception must be thrown.");
  321. } catch(Exception& e) {
  322. }
  323. }
  324. void HttpResponseTest::testValidateResponse_chunked()
  325. {
  326. HttpResponse httpResponse;
  327. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  328. httpResponse.setHttpHeader(httpHeader);
  329. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  330. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  331. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  332. httpRequest->setSegment(segment);
  333. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  334. httpRequest->setFileEntry(fileEntry);
  335. SharedHandle<Request> request(new Request());
  336. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  337. httpRequest->setRequest(request);
  338. httpResponse.setHttpRequest(httpRequest);
  339. httpHeader->setResponseStatus("206");
  340. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  341. httpHeader->put("Transfer-Encoding", "chunked");
  342. // if transfer-encoding is specified, then range validation is skipped.
  343. try {
  344. httpResponse.validateResponse();
  345. } catch(Exception& e) {
  346. CPPUNIT_FAIL("exception must not be thrown.");
  347. }
  348. }
  349. void HttpResponseTest::testValidateResponse_withIfModifiedSince()
  350. {
  351. HttpResponse httpResponse;
  352. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  353. httpResponse.setHttpHeader(httpHeader);
  354. httpHeader->setResponseStatus("304");
  355. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  356. httpResponse.setHttpRequest(httpRequest);
  357. try {
  358. httpResponse.validateResponse();
  359. CPPUNIT_FAIL("exception must be thrown.");
  360. } catch(Exception& e) {
  361. }
  362. httpRequest->setIfModifiedSinceHeader("Fri, 16 Jul 2010 12:56:59 GMT");
  363. httpResponse.validateResponse();
  364. }
  365. void HttpResponseTest::testHasRetryAfter()
  366. {
  367. HttpResponse httpResponse;
  368. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  369. httpResponse.setHttpHeader(httpHeader);
  370. httpHeader->put("Retry-After", "60");
  371. CPPUNIT_ASSERT(httpResponse.hasRetryAfter());
  372. CPPUNIT_ASSERT_EQUAL((time_t)60, httpResponse.getRetryAfter());
  373. }
  374. void HttpResponseTest::testProcessRedirect()
  375. {
  376. HttpResponse httpResponse;
  377. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  378. httpResponse.setHttpHeader(httpHeader);
  379. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  380. SharedHandle<Request> request(new Request());
  381. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  382. httpRequest->setRequest(request);
  383. httpResponse.setHttpRequest(httpRequest);
  384. httpHeader->put("Location", "http://mirror/aria2-1.0.0.tar.bz2");
  385. httpResponse.processRedirect();
  386. httpHeader->clearField();
  387. // Give unsupported scheme
  388. httpHeader->put("Location", "unsupported://mirror/aria2-1.0.0.tar.bz2");
  389. try {
  390. httpResponse.processRedirect();
  391. CPPUNIT_FAIL("DlRetryEx exception must be thrown.");
  392. } catch(DlRetryEx& e) {
  393. // Success
  394. } catch(...) {
  395. CPPUNIT_FAIL("DlRetryEx exception must be thrown.");
  396. }
  397. }
  398. void HttpResponseTest::testRetrieveCookie()
  399. {
  400. HttpResponse httpResponse;
  401. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  402. httpResponse.setHttpHeader(httpHeader);
  403. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  404. SharedHandle<Request> request(new Request());
  405. request->setUri("http://www.aria2.org/archives/aria2-1.0.0.tar.bz2");
  406. httpRequest->setRequest(request);
  407. SharedHandle<CookieStorage> st(new CookieStorage());
  408. httpRequest->setCookieStorage(st);
  409. httpResponse.setHttpRequest(httpRequest);
  410. httpHeader->put("Set-Cookie", "k1=v1; expires=Sun, 10-Jun-2007 11:00:00 GMT;"
  411. "path=/; domain=.aria2.org;");
  412. httpHeader->put("Set-Cookie", "k2=v2; expires=Sun, 01-Jan-38 00:00:00 GMT;"
  413. "path=/; domain=.aria2.org;");
  414. httpHeader->put("Set-Cookie", "k3=v3;");
  415. httpResponse.retrieveCookie();
  416. CPPUNIT_ASSERT_EQUAL((size_t)2, st->size());
  417. std::vector<Cookie> cookies;
  418. st->dumpCookie(std::back_inserter(cookies));
  419. CPPUNIT_ASSERT_EQUAL(std::string("k2=v2"), cookies[0].toString());
  420. CPPUNIT_ASSERT_EQUAL(std::string("k3=v3"), cookies[1].toString());
  421. }
  422. void HttpResponseTest::testSupportsPersistentConnection()
  423. {
  424. HttpResponse httpResponse;
  425. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  426. httpResponse.setHttpHeader(httpHeader);
  427. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  428. httpResponse.setHttpRequest(httpRequest);
  429. httpHeader->setVersion("HTTP/1.1");
  430. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  431. httpHeader->put("Connection", "close");
  432. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  433. httpHeader->clearField();
  434. httpHeader->put("Connection", "keep-alive");
  435. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  436. httpHeader->clearField();
  437. httpHeader->setVersion("HTTP/1.0");
  438. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  439. httpHeader->put("Connection", "close");
  440. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  441. httpHeader->clearField();
  442. httpHeader->put("Connection", "keep-alive");
  443. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  444. httpHeader->clearField();
  445. // test proxy connection
  446. SharedHandle<Request> proxyRequest(new Request());
  447. httpRequest->setProxyRequest(proxyRequest);
  448. httpHeader->setVersion("HTTP/1.1");
  449. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  450. httpHeader->put("Connection", "close");
  451. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  452. httpHeader->clearField();
  453. httpHeader->put("Connection", "keep-alive");
  454. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  455. httpHeader->clearField();
  456. httpHeader->put("Proxy-Connection", "keep-alive");
  457. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  458. httpHeader->put("Connection", "close");
  459. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  460. httpHeader->clearField();
  461. httpHeader->put("Proxy-Connection", "close");
  462. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  463. httpHeader->clearField();
  464. httpHeader->setVersion("HTTP/1.0");
  465. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  466. httpHeader->put("Connection", "close");
  467. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  468. httpHeader->clearField();
  469. httpHeader->put("Connection", "keep-alive");
  470. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  471. httpHeader->put("Proxy-Connection", "keep-alive");
  472. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  473. httpHeader->clearField();
  474. httpHeader->put("Proxy-Connection", "keep-alive");
  475. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  476. httpHeader->clearField();
  477. httpHeader->put("Proxy-Connection", "close");
  478. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  479. httpHeader->clearField();
  480. }
  481. } // namespace aria2