HttpResponseTest.cc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  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. 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(testGetTransferEncodingStreamFilter);
  34. CPPUNIT_TEST(testIsContentEncodingSpecified);
  35. CPPUNIT_TEST(testGetContentEncoding);
  36. CPPUNIT_TEST(testGetContentEncodingStreamFilter);
  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 testGetTransferEncodingStreamFilter();
  64. void testIsContentEncodingSpecified();
  65. void testGetContentEncoding();
  66. void testGetContentEncodingStreamFilter();
  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->setStatusCode(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->setStatusCode(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::testGetTransferEncodingStreamFilter()
  203. {
  204. HttpResponse httpResponse;
  205. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  206. httpResponse.setHttpHeader(httpHeader);
  207. CPPUNIT_ASSERT(!httpResponse.getTransferEncodingStreamFilter());
  208. httpHeader->put("Transfer-Encoding", "chunked");
  209. CPPUNIT_ASSERT(httpResponse.getTransferEncodingStreamFilter());
  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::testGetContentEncodingStreamFilter()
  230. {
  231. HttpResponse httpResponse;
  232. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  233. httpResponse.setHttpHeader(httpHeader);
  234. CPPUNIT_ASSERT(!httpResponse.getContentEncodingStreamFilter());
  235. #ifdef HAVE_LIBZ
  236. httpHeader->put("Content-Encoding", "gzip");
  237. {
  238. SharedHandle<StreamFilter> filter =
  239. httpResponse.getContentEncodingStreamFilter();
  240. CPPUNIT_ASSERT(filter);
  241. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecodingStreamFilter"),
  242. filter->getName());
  243. }
  244. httpHeader.reset(new HttpHeader());
  245. httpResponse.setHttpHeader(httpHeader);
  246. httpHeader->put("Content-Encoding", "deflate");
  247. {
  248. SharedHandle<StreamFilter> filter =
  249. httpResponse.getContentEncodingStreamFilter();
  250. CPPUNIT_ASSERT(filter);
  251. CPPUNIT_ASSERT_EQUAL(std::string("GZipDecodingStreamFilter"),
  252. filter->getName());
  253. }
  254. #endif // HAVE_LIBZ
  255. httpHeader.reset(new HttpHeader());
  256. httpResponse.setHttpHeader(httpHeader);
  257. httpHeader->put("Content-Encoding", "bzip2");
  258. {
  259. SharedHandle<StreamFilter> filter =
  260. httpResponse.getContentEncodingStreamFilter();
  261. CPPUNIT_ASSERT(!filter);
  262. }
  263. }
  264. void HttpResponseTest::testValidateResponse()
  265. {
  266. HttpResponse httpResponse;
  267. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  268. httpResponse.setHttpHeader(httpHeader);
  269. httpHeader->setStatusCode(301);
  270. try {
  271. httpResponse.validateResponse();
  272. CPPUNIT_FAIL("exception must be thrown.");
  273. } catch(Exception& e) {
  274. }
  275. httpHeader->put("Location", "http://localhost/archives/aria2-1.0.0.tar.bz2");
  276. try {
  277. httpResponse.validateResponse();
  278. } catch(Exception& e) {
  279. CPPUNIT_FAIL("exception must not be thrown.");
  280. }
  281. }
  282. void HttpResponseTest::testValidateResponse_good_range()
  283. {
  284. HttpResponse httpResponse;
  285. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  286. httpResponse.setHttpHeader(httpHeader);
  287. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  288. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  289. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  290. httpRequest->setSegment(segment);
  291. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  292. httpRequest->setFileEntry(fileEntry);
  293. SharedHandle<Request> request(new Request());
  294. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  295. httpRequest->setRequest(request);
  296. httpResponse.setHttpRequest(httpRequest);
  297. httpHeader->setStatusCode(206);
  298. httpHeader->put("Content-Range", "bytes 1048576-10485760/10485760");
  299. try {
  300. httpResponse.validateResponse();
  301. } catch(Exception& e) {
  302. std::cerr << e.stackTrace() << std::endl;
  303. CPPUNIT_FAIL("exception must not be thrown.");
  304. }
  305. }
  306. void HttpResponseTest::testValidateResponse_bad_range()
  307. {
  308. HttpResponse httpResponse;
  309. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  310. httpResponse.setHttpHeader(httpHeader);
  311. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  312. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  313. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  314. httpRequest->setSegment(segment);
  315. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  316. httpRequest->setFileEntry(fileEntry);
  317. SharedHandle<Request> request(new Request());
  318. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  319. httpRequest->setRequest(request);
  320. httpResponse.setHttpRequest(httpRequest);
  321. httpHeader->setStatusCode(206);
  322. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  323. try {
  324. httpResponse.validateResponse();
  325. CPPUNIT_FAIL("exception must be thrown.");
  326. } catch(Exception& e) {
  327. }
  328. }
  329. void HttpResponseTest::testValidateResponse_chunked()
  330. {
  331. HttpResponse httpResponse;
  332. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  333. httpResponse.setHttpHeader(httpHeader);
  334. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  335. SharedHandle<Piece> p(new Piece(1, 1024*1024));
  336. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  337. httpRequest->setSegment(segment);
  338. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  339. httpRequest->setFileEntry(fileEntry);
  340. SharedHandle<Request> request(new Request());
  341. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  342. httpRequest->setRequest(request);
  343. httpResponse.setHttpRequest(httpRequest);
  344. httpHeader->setStatusCode(206);
  345. httpHeader->put("Content-Range", "bytes 0-10485760/10485761");
  346. httpHeader->put("Transfer-Encoding", "chunked");
  347. // if transfer-encoding is specified, then range validation is skipped.
  348. try {
  349. httpResponse.validateResponse();
  350. } catch(Exception& e) {
  351. CPPUNIT_FAIL("exception must not be thrown.");
  352. }
  353. }
  354. void HttpResponseTest::testValidateResponse_withIfModifiedSince()
  355. {
  356. HttpResponse httpResponse;
  357. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  358. httpResponse.setHttpHeader(httpHeader);
  359. httpHeader->setStatusCode(304);
  360. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  361. httpResponse.setHttpRequest(httpRequest);
  362. try {
  363. httpResponse.validateResponse();
  364. CPPUNIT_FAIL("exception must be thrown.");
  365. } catch(Exception& e) {
  366. }
  367. httpRequest->setIfModifiedSinceHeader("Fri, 16 Jul 2010 12:56:59 GMT");
  368. httpResponse.validateResponse();
  369. }
  370. void HttpResponseTest::testHasRetryAfter()
  371. {
  372. HttpResponse httpResponse;
  373. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  374. httpResponse.setHttpHeader(httpHeader);
  375. httpHeader->put("Retry-After", "60");
  376. CPPUNIT_ASSERT(httpResponse.hasRetryAfter());
  377. CPPUNIT_ASSERT_EQUAL((time_t)60, httpResponse.getRetryAfter());
  378. }
  379. void HttpResponseTest::testProcessRedirect()
  380. {
  381. HttpResponse httpResponse;
  382. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  383. httpResponse.setHttpHeader(httpHeader);
  384. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  385. SharedHandle<Request> request(new Request());
  386. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  387. httpRequest->setRequest(request);
  388. httpResponse.setHttpRequest(httpRequest);
  389. httpHeader->put("Location", "http://mirror/aria2-1.0.0.tar.bz2");
  390. httpResponse.processRedirect();
  391. httpHeader->clearField();
  392. // Give unsupported scheme
  393. httpHeader->put("Location", "unsupported://mirror/aria2-1.0.0.tar.bz2");
  394. try {
  395. httpResponse.processRedirect();
  396. CPPUNIT_FAIL("DlRetryEx exception must be thrown.");
  397. } catch(DlRetryEx& e) {
  398. // Success
  399. } catch(...) {
  400. CPPUNIT_FAIL("DlRetryEx exception must be thrown.");
  401. }
  402. }
  403. void HttpResponseTest::testRetrieveCookie()
  404. {
  405. HttpResponse httpResponse;
  406. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  407. httpResponse.setHttpHeader(httpHeader);
  408. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  409. SharedHandle<Request> request(new Request());
  410. request->setUri("http://www.aria2.org/archives/aria2-1.0.0.tar.bz2");
  411. httpRequest->setRequest(request);
  412. SharedHandle<CookieStorage> st(new CookieStorage());
  413. httpRequest->setCookieStorage(st);
  414. httpResponse.setHttpRequest(httpRequest);
  415. httpHeader->put("Set-Cookie", "k1=v1; expires=Sun, 10-Jun-2007 11:00:00 GMT;"
  416. "path=/; domain=.aria2.org;");
  417. httpHeader->put("Set-Cookie", "k2=v2; expires=Sun, 01-Jan-38 00:00:00 GMT;"
  418. "path=/; domain=.aria2.org;");
  419. httpHeader->put("Set-Cookie", "k3=v3;");
  420. httpResponse.retrieveCookie();
  421. CPPUNIT_ASSERT_EQUAL((size_t)2, st->size());
  422. std::vector<Cookie> cookies;
  423. st->dumpCookie(std::back_inserter(cookies));
  424. CPPUNIT_ASSERT_EQUAL(std::string("k2=v2"), cookies[0].toString());
  425. CPPUNIT_ASSERT_EQUAL(std::string("k3=v3"), cookies[1].toString());
  426. }
  427. void HttpResponseTest::testSupportsPersistentConnection()
  428. {
  429. HttpResponse httpResponse;
  430. SharedHandle<HttpHeader> httpHeader(new HttpHeader());
  431. httpResponse.setHttpHeader(httpHeader);
  432. SharedHandle<HttpRequest> httpRequest(new HttpRequest());
  433. httpResponse.setHttpRequest(httpRequest);
  434. httpHeader->setVersion("HTTP/1.1");
  435. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  436. httpHeader->put("Connection", "close");
  437. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  438. httpHeader->clearField();
  439. httpHeader->put("Connection", "keep-alive");
  440. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  441. httpHeader->clearField();
  442. httpHeader->setVersion("HTTP/1.0");
  443. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  444. httpHeader->put("Connection", "close");
  445. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  446. httpHeader->clearField();
  447. httpHeader->put("Connection", "keep-alive");
  448. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  449. httpHeader->clearField();
  450. // test proxy connection
  451. SharedHandle<Request> proxyRequest(new Request());
  452. httpRequest->setProxyRequest(proxyRequest);
  453. httpHeader->setVersion("HTTP/1.1");
  454. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  455. httpHeader->put("Connection", "close");
  456. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  457. httpHeader->clearField();
  458. httpHeader->put("Connection", "keep-alive");
  459. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  460. httpHeader->clearField();
  461. httpHeader->put("Proxy-Connection", "keep-alive");
  462. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  463. httpHeader->put("Connection", "close");
  464. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  465. httpHeader->clearField();
  466. httpHeader->put("Proxy-Connection", "close");
  467. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  468. httpHeader->clearField();
  469. httpHeader->setVersion("HTTP/1.0");
  470. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  471. httpHeader->put("Connection", "close");
  472. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  473. httpHeader->clearField();
  474. httpHeader->put("Connection", "keep-alive");
  475. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  476. httpHeader->put("Proxy-Connection", "keep-alive");
  477. CPPUNIT_ASSERT(httpResponse.supportsPersistentConnection());
  478. httpHeader->clearField();
  479. httpHeader->put("Proxy-Connection", "keep-alive");
  480. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  481. httpHeader->clearField();
  482. httpHeader->put("Proxy-Connection", "close");
  483. CPPUNIT_ASSERT(!httpResponse.supportsPersistentConnection());
  484. httpHeader->clearField();
  485. }
  486. } // namespace aria2