HttpResponseTest.cc 18 KB

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