HttpRequestTest.cc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  1. #include "HttpRequest.h"
  2. #include <sstream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "prefs.h"
  5. #include "AuthConfigFactory.h"
  6. #include "PiecedSegment.h"
  7. #include "Piece.h"
  8. #include "Range.h"
  9. #include "Request.h"
  10. #include "Option.h"
  11. #include "array_fun.h"
  12. #include "CookieStorage.h"
  13. #include "util.h"
  14. #include "AuthConfig.h"
  15. namespace aria2 {
  16. class HttpRequestTest : public CppUnit::TestFixture {
  17. CPPUNIT_TEST_SUITE(HttpRequestTest);
  18. CPPUNIT_TEST(testGetStartByte);
  19. CPPUNIT_TEST(testGetEndByte);
  20. CPPUNIT_TEST(testCreateRequest);
  21. CPPUNIT_TEST(testCreateRequest_ftp);
  22. CPPUNIT_TEST(testCreateRequest_with_cookie);
  23. CPPUNIT_TEST(testCreateRequest_query);
  24. CPPUNIT_TEST(testCreateRequest_head);
  25. CPPUNIT_TEST(testCreateRequest_ipv6LiteralAddr);
  26. CPPUNIT_TEST(testCreateRequest_endOffsetOverride);
  27. CPPUNIT_TEST(testCreateProxyRequest);
  28. CPPUNIT_TEST(testIsRangeSatisfied);
  29. CPPUNIT_TEST(testUserAgent);
  30. CPPUNIT_TEST(testAddHeader);
  31. CPPUNIT_TEST(testAddAcceptType);
  32. CPPUNIT_TEST(testEnableAcceptEncoding);
  33. CPPUNIT_TEST_SUITE_END();
  34. private:
  35. SharedHandle<Option> option_;
  36. SharedHandle<AuthConfigFactory> authConfigFactory_;
  37. public:
  38. void setUp()
  39. {
  40. option_.reset(new Option());
  41. option_->put(PREF_HTTP_AUTH_CHALLENGE, V_TRUE);
  42. authConfigFactory_.reset(new AuthConfigFactory());
  43. }
  44. void testGetStartByte();
  45. void testGetEndByte();
  46. void testCreateRequest();
  47. void testCreateRequest_ftp();
  48. void testCreateRequest_with_cookie();
  49. void testCreateRequest_query();
  50. void testCreateRequest_head();
  51. void testCreateRequest_ipv6LiteralAddr();
  52. void testCreateRequest_endOffsetOverride();
  53. void testCreateProxyRequest();
  54. void testIsRangeSatisfied();
  55. void testUserAgent();
  56. void testAddHeader();
  57. void testAddAcceptType();
  58. void testEnableAcceptEncoding();
  59. };
  60. CPPUNIT_TEST_SUITE_REGISTRATION( HttpRequestTest );
  61. void HttpRequestTest::testGetStartByte()
  62. {
  63. HttpRequest httpRequest;
  64. SharedHandle<Piece> p(new Piece(1, 1024));
  65. SharedHandle<Segment> segment(new PiecedSegment(1024, p));
  66. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*10, 0));
  67. CPPUNIT_ASSERT_EQUAL((off_t)0LL, httpRequest.getStartByte());
  68. httpRequest.setSegment(segment);
  69. httpRequest.setFileEntry(fileEntry);
  70. CPPUNIT_ASSERT_EQUAL((off_t)1024LL, httpRequest.getStartByte());
  71. }
  72. void HttpRequestTest::testGetEndByte()
  73. {
  74. size_t index = 1;
  75. size_t length = 1024*1024-1024;
  76. size_t segmentLength = 1024*1024;
  77. HttpRequest httpRequest;
  78. SharedHandle<Piece> piece(new Piece(index, length));
  79. SharedHandle<Segment> segment(new PiecedSegment(segmentLength, piece));
  80. SharedHandle<FileEntry> fileEntry(new FileEntry("file", segmentLength*10, 0));
  81. CPPUNIT_ASSERT_EQUAL((off_t)0LL, httpRequest.getEndByte());
  82. httpRequest.setSegment(segment);
  83. CPPUNIT_ASSERT_EQUAL((off_t)0LL, httpRequest.getEndByte());
  84. SharedHandle<Request> request(new Request());
  85. request->supportsPersistentConnection(true);
  86. request->setPipeliningHint(true);
  87. httpRequest.setRequest(request);
  88. httpRequest.setFileEntry(fileEntry);
  89. CPPUNIT_ASSERT_EQUAL((off_t)(segmentLength*index+length-1),
  90. httpRequest.getEndByte());
  91. // The end byte of FileEntry are placed inside segment
  92. fileEntry->setLength(segmentLength+100);
  93. CPPUNIT_ASSERT_EQUAL((off_t)(segmentLength*index+100-1),
  94. httpRequest.getEndByte());
  95. request->setPipeliningHint(false);
  96. CPPUNIT_ASSERT_EQUAL((off_t)0LL, httpRequest.getEndByte());
  97. }
  98. void HttpRequestTest::testCreateRequest()
  99. {
  100. SharedHandle<Piece> p;
  101. SharedHandle<Request> request(new Request());
  102. request->supportsPersistentConnection(true);
  103. request->setUri("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
  104. p.reset(new Piece(0, 1024));
  105. SharedHandle<Segment> segment(new PiecedSegment(1024, p));
  106. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  107. HttpRequest httpRequest;
  108. httpRequest.disableContentEncoding();
  109. httpRequest.setRequest(request);
  110. httpRequest.setSegment(segment);
  111. httpRequest.setFileEntry(fileEntry);
  112. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  113. // remove "Connection: close" and add end byte range
  114. request->setPipeliningHint(true);
  115. std::string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  116. "User-Agent: aria2\r\n"
  117. "Accept: */*\r\n"
  118. "Host: localhost:8080\r\n"
  119. "Pragma: no-cache\r\n"
  120. "Cache-Control: no-cache\r\n"
  121. "Range: bytes=0-1023\r\n"
  122. "\r\n";
  123. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  124. request->setPipeliningHint(false);
  125. expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  126. "User-Agent: aria2\r\n"
  127. "Accept: */*\r\n"
  128. "Host: localhost:8080\r\n"
  129. "Pragma: no-cache\r\n"
  130. "Cache-Control: no-cache\r\n"
  131. "Connection: close\r\n"
  132. "\r\n";
  133. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  134. p.reset(new Piece(1, 1024*1024));
  135. segment.reset(new PiecedSegment(1024*1024, p));
  136. httpRequest.setSegment(segment);
  137. expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  138. "User-Agent: aria2\r\n"
  139. "Accept: */*\r\n"
  140. "Host: localhost:8080\r\n"
  141. "Pragma: no-cache\r\n"
  142. "Cache-Control: no-cache\r\n"
  143. "Connection: close\r\n"
  144. "Range: bytes=1048576-\r\n"
  145. "\r\n";
  146. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  147. request->setPipeliningHint(true);
  148. expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  149. "User-Agent: aria2\r\n"
  150. "Accept: */*\r\n"
  151. "Host: localhost:8080\r\n"
  152. "Pragma: no-cache\r\n"
  153. "Cache-Control: no-cache\r\n"
  154. "Range: bytes=1048576-2097151\r\n"
  155. "\r\n";
  156. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  157. // redirection set persistent connection flag to true
  158. request->redirectUri("http://localhost:8080/archives/download/aria2-1.0.0.tar.bz2");
  159. expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  160. "User-Agent: aria2\r\n"
  161. "Accept: */*\r\n"
  162. "Host: localhost:8080\r\n"
  163. "Pragma: no-cache\r\n"
  164. "Cache-Control: no-cache\r\n"
  165. "Range: bytes=1048576-2097151\r\n"
  166. "\r\n";
  167. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  168. request->supportsPersistentConnection(true);
  169. request->setPipeliningHint(false);
  170. // this only removes "Connection: close".
  171. request->setKeepAliveHint(true);
  172. expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  173. "User-Agent: aria2\r\n"
  174. "Accept: */*\r\n"
  175. "Host: localhost:8080\r\n"
  176. "Pragma: no-cache\r\n"
  177. "Cache-Control: no-cache\r\n"
  178. "Range: bytes=1048576-\r\n"
  179. "\r\n";
  180. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  181. request->setKeepAliveHint(false);
  182. request->resetUri();
  183. p.reset(new Piece(0, 1024*1024));
  184. segment.reset(new PiecedSegment(1024*1024, p));
  185. httpRequest.setSegment(segment);
  186. // enable http auth
  187. option_->put(PREF_HTTP_USER, "aria2user");
  188. option_->put(PREF_HTTP_PASSWD, "aria2passwd");
  189. CPPUNIT_ASSERT(authConfigFactory_->activateBasicCred
  190. ("localhost", "/", option_.get()));
  191. expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  192. "User-Agent: aria2\r\n"
  193. "Accept: */*\r\n"
  194. "Host: localhost:8080\r\n"
  195. "Pragma: no-cache\r\n"
  196. "Cache-Control: no-cache\r\n"
  197. "Connection: close\r\n"
  198. "Authorization: Basic YXJpYTJ1c2VyOmFyaWEycGFzc3dk\r\n"
  199. "\r\n";
  200. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  201. // enable http proxy auth
  202. SharedHandle<Request> proxyRequest(new Request());
  203. CPPUNIT_ASSERT(proxyRequest->setUri
  204. ("http://aria2proxyuser:aria2proxypasswd@localhost:9000"));
  205. httpRequest.setProxyRequest(proxyRequest);
  206. expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  207. "User-Agent: aria2\r\n"
  208. "Accept: */*\r\n"
  209. "Host: localhost:8080\r\n"
  210. "Pragma: no-cache\r\n"
  211. "Cache-Control: no-cache\r\n"
  212. "Connection: close\r\n"
  213. "Proxy-Connection: close\r\n"
  214. "Proxy-Authorization: Basic YXJpYTJwcm94eXVzZXI6YXJpYTJwcm94eXBhc3N3ZA==\r\n"
  215. "Authorization: Basic YXJpYTJ1c2VyOmFyaWEycGFzc3dk\r\n"
  216. "\r\n";
  217. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  218. request->setPipeliningHint(true);
  219. expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  220. "User-Agent: aria2\r\n"
  221. "Accept: */*\r\n"
  222. "Host: localhost:8080\r\n"
  223. "Pragma: no-cache\r\n"
  224. "Cache-Control: no-cache\r\n"
  225. "Range: bytes=0-1048575\r\n"
  226. "Proxy-Connection: Keep-Alive\r\n"
  227. "Proxy-Authorization: Basic YXJpYTJwcm94eXVzZXI6YXJpYTJwcm94eXBhc3N3ZA==\r\n"
  228. "Authorization: Basic YXJpYTJ1c2VyOmFyaWEycGFzc3dk\r\n"
  229. "\r\n";
  230. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  231. request->setPipeliningHint(false);
  232. // turn off proxy auth
  233. CPPUNIT_ASSERT(proxyRequest->setUri("http://localhost:9000"));
  234. expectedText = "GET http://localhost:8080/archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  235. "User-Agent: aria2\r\n"
  236. "Accept: */*\r\n"
  237. "Host: localhost:8080\r\n"
  238. "Pragma: no-cache\r\n"
  239. "Cache-Control: no-cache\r\n"
  240. "Connection: close\r\n"
  241. "Proxy-Connection: close\r\n"
  242. "Authorization: Basic YXJpYTJ1c2VyOmFyaWEycGFzc3dk\r\n"
  243. "\r\n";
  244. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  245. }
  246. void HttpRequestTest::testCreateRequest_ftp()
  247. {
  248. option_->put(PREF_FTP_USER, "aria2user");
  249. option_->put(PREF_FTP_PASSWD, "aria2passwd");
  250. SharedHandle<Request> request(new Request());
  251. request->setUri("ftp://localhost:8080/archives/aria2-1.0.0.tar.bz2");
  252. SharedHandle<Request> proxyRequest(new Request());
  253. CPPUNIT_ASSERT(proxyRequest->setUri
  254. ("http://localhost:9000"));
  255. HttpRequest httpRequest;
  256. SharedHandle<Piece> p(new Piece(0, 1024*1024));
  257. SharedHandle<Segment> segment
  258. (new PiecedSegment(1024*1024, p));
  259. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  260. httpRequest.disableContentEncoding();
  261. httpRequest.setRequest(request);
  262. httpRequest.setSegment(segment);
  263. httpRequest.setFileEntry(fileEntry);
  264. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  265. httpRequest.setProxyRequest(proxyRequest);
  266. std::string expectedText =
  267. "GET ftp://aria2user@localhost:8080/archives/aria2-1.0.0.tar.bz2"
  268. " HTTP/1.1\r\n"
  269. "User-Agent: aria2\r\n"
  270. "Accept: */*\r\n"
  271. "Host: localhost:8080\r\n"
  272. "Pragma: no-cache\r\n"
  273. "Cache-Control: no-cache\r\n"
  274. "Connection: close\r\n"
  275. "Proxy-Connection: close\r\n"
  276. "Authorization: Basic YXJpYTJ1c2VyOmFyaWEycGFzc3dk\r\n"
  277. "\r\n";
  278. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  279. // test proxy authorization
  280. CPPUNIT_ASSERT(proxyRequest->setUri
  281. ("http://aria2proxyuser:aria2proxypasswd@localhost:9000"));
  282. expectedText =
  283. "GET ftp://aria2user@localhost:8080/archives/aria2-1.0.0.tar.bz2"
  284. " HTTP/1.1\r\n"
  285. "User-Agent: aria2\r\n"
  286. "Accept: */*\r\n"
  287. "Host: localhost:8080\r\n"
  288. "Pragma: no-cache\r\n"
  289. "Cache-Control: no-cache\r\n"
  290. "Connection: close\r\n"
  291. "Proxy-Connection: close\r\n"
  292. "Proxy-Authorization: Basic YXJpYTJwcm94eXVzZXI6YXJpYTJwcm94eXBhc3N3ZA==\r\n"
  293. "Authorization: Basic YXJpYTJ1c2VyOmFyaWEycGFzc3dk\r\n"
  294. "\r\n";
  295. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  296. }
  297. void HttpRequestTest::testCreateRequest_with_cookie()
  298. {
  299. SharedHandle<Request> request(new Request());
  300. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  301. SharedHandle<Piece> p(new Piece(0, 1024*1024));
  302. SharedHandle<Segment> segment
  303. (new PiecedSegment(1024*1024, p));
  304. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 1024*1024*10, 0));
  305. Cookie cookie1("name1", "value1", "/archives", "localhost", false);
  306. Cookie cookie2("name2", "value2", "/archives/download", "localhost", false);
  307. Cookie cookie3("name3", "value3", "/archives/download", ".aria2.org", false);
  308. Cookie cookie4("name4", "value4", "/archives/", ".aria2.org", true);
  309. SharedHandle<CookieStorage> st(new CookieStorage());
  310. CPPUNIT_ASSERT(st->store(cookie1));
  311. CPPUNIT_ASSERT(st->store(cookie2));
  312. CPPUNIT_ASSERT(st->store(cookie3));
  313. CPPUNIT_ASSERT(st->store(cookie4));
  314. HttpRequest httpRequest;
  315. httpRequest.disableContentEncoding();
  316. httpRequest.setRequest(request);
  317. httpRequest.setSegment(segment);
  318. httpRequest.setFileEntry(fileEntry);
  319. httpRequest.setCookieStorage(st);
  320. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  321. std::string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  322. "User-Agent: aria2\r\n"
  323. "Accept: */*\r\n"
  324. "Host: localhost\r\n"
  325. "Pragma: no-cache\r\n"
  326. "Cache-Control: no-cache\r\n"
  327. "Connection: close\r\n"
  328. "Cookie: name1=value1;\r\n"
  329. "\r\n";
  330. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  331. request->setUri("http://localhost/archives/download/aria2-1.0.0.tar.bz2");
  332. expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  333. "User-Agent: aria2\r\n"
  334. "Accept: */*\r\n"
  335. "Host: localhost\r\n"
  336. "Pragma: no-cache\r\n"
  337. "Cache-Control: no-cache\r\n"
  338. "Connection: close\r\n"
  339. "Cookie: name2=value2;name1=value1;\r\n"
  340. "\r\n";
  341. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  342. request->setUri("http://www.aria2.org/archives/download/aria2-1.0.0.tar.bz2");
  343. expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  344. "User-Agent: aria2\r\n"
  345. "Accept: */*\r\n"
  346. "Host: www.aria2.org\r\n"
  347. "Pragma: no-cache\r\n"
  348. "Cache-Control: no-cache\r\n"
  349. "Connection: close\r\n"
  350. "Cookie: name3=value3;\r\n"
  351. "\r\n";
  352. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  353. request->setUri("https://www.aria2.org/archives/download/"
  354. "aria2-1.0.0.tar.bz2");
  355. expectedText = "GET /archives/download/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  356. "User-Agent: aria2\r\n"
  357. "Accept: */*\r\n"
  358. "Host: www.aria2.org\r\n"
  359. "Pragma: no-cache\r\n"
  360. "Cache-Control: no-cache\r\n"
  361. "Connection: close\r\n"
  362. "Cookie: name3=value3;name4=value4;\r\n"
  363. "\r\n";
  364. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  365. }
  366. void HttpRequestTest::testCreateRequest_query()
  367. {
  368. SharedHandle<Request> request(new Request());
  369. request->setUri("http://localhost/wiki?id=9ad5109a-b8a5-4edf-9373-56a1c34ae138");
  370. HttpRequest httpRequest;
  371. httpRequest.disableContentEncoding();
  372. httpRequest.setRequest(request);
  373. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  374. std::string expectedText =
  375. "GET /wiki?id=9ad5109a-b8a5-4edf-9373-56a1c34ae138 HTTP/1.1\r\n"
  376. "User-Agent: aria2\r\n"
  377. "Accept: */*\r\n"
  378. "Host: localhost\r\n"
  379. "Pragma: no-cache\r\n"
  380. "Cache-Control: no-cache\r\n"
  381. "Connection: close\r\n"
  382. "\r\n";
  383. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  384. }
  385. void HttpRequestTest::testCreateRequest_head()
  386. {
  387. SharedHandle<Request> request(new Request());
  388. request->setMethod(Request::METHOD_HEAD);
  389. request->setUri("http://localhost/aria2-1.0.0.tar.bz2");
  390. HttpRequest httpRequest;
  391. httpRequest.setRequest(request);
  392. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  393. std::stringstream result(httpRequest.createRequest());
  394. std::string line;
  395. CPPUNIT_ASSERT(getline(result, line));
  396. util::trimSelf(line);
  397. CPPUNIT_ASSERT_EQUAL(std::string("HEAD /aria2-1.0.0.tar.bz2 HTTP/1.1"), line);
  398. }
  399. void HttpRequestTest::testCreateRequest_endOffsetOverride()
  400. {
  401. SharedHandle<Request> request(new Request());
  402. request->setUri("http://localhost/myfile");
  403. HttpRequest httpRequest;
  404. httpRequest.disableContentEncoding();
  405. httpRequest.setRequest(request);
  406. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  407. SharedHandle<Piece> p(new Piece(0, 1024*1024));
  408. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  409. httpRequest.setSegment(segment);
  410. httpRequest.setEndOffsetOverride(1024*1024*1024);
  411. SharedHandle<FileEntry> fileEntry
  412. (new FileEntry("file", 1024*1024*1024*10LL, 0));
  413. httpRequest.setFileEntry(fileEntry);
  414. // End byte is not passed if start byte is 0.
  415. std::string expectedText =
  416. "GET /myfile HTTP/1.1\r\n"
  417. "User-Agent: aria2\r\n"
  418. "Accept: */*\r\n"
  419. "Host: localhost\r\n"
  420. "Pragma: no-cache\r\n"
  421. "Cache-Control: no-cache\r\n"
  422. "Connection: close\r\n"
  423. "\r\n";
  424. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  425. segment->updateWrittenLength(1);
  426. expectedText =
  427. "GET /myfile HTTP/1.1\r\n"
  428. "User-Agent: aria2\r\n"
  429. "Accept: */*\r\n"
  430. "Host: localhost\r\n"
  431. "Pragma: no-cache\r\n"
  432. "Cache-Control: no-cache\r\n"
  433. "Connection: close\r\n"
  434. "Range: bytes=1-1073741823\r\n"
  435. "\r\n";
  436. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  437. }
  438. void HttpRequestTest::testCreateProxyRequest()
  439. {
  440. SharedHandle<Request> request(new Request());
  441. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  442. SharedHandle<Piece> p(new Piece(0, 1024*1024));
  443. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  444. SharedHandle<Request> proxyRequest(new Request());
  445. CPPUNIT_ASSERT(proxyRequest->setUri("http://localhost:9000"));
  446. HttpRequest httpRequest;
  447. httpRequest.setRequest(request);
  448. httpRequest.setSegment(segment);
  449. httpRequest.setProxyRequest(proxyRequest);
  450. request->supportsPersistentConnection(true);
  451. std::string expectedText = "CONNECT localhost:80 HTTP/1.1\r\n"
  452. "User-Agent: aria2\r\n"
  453. "Host: localhost:80\r\n"
  454. //"Proxy-Connection: close\r\n"
  455. "\r\n";
  456. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createProxyRequest());
  457. // adds Keep-Alive header.
  458. request->setKeepAliveHint(true);
  459. expectedText = "CONNECT localhost:80 HTTP/1.1\r\n"
  460. "User-Agent: aria2\r\n"
  461. "Host: localhost:80\r\n"
  462. //"Proxy-Connection: Keep-Alive\r\n"
  463. "\r\n";
  464. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createProxyRequest());
  465. request->setKeepAliveHint(false);
  466. // pipelining also adds Keep-Alive header.
  467. request->setPipeliningHint(true);
  468. expectedText = "CONNECT localhost:80 HTTP/1.1\r\n"
  469. "User-Agent: aria2\r\n"
  470. "Host: localhost:80\r\n"
  471. //"Proxy-Connection: Keep-Alive\r\n"
  472. "\r\n";
  473. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createProxyRequest());
  474. // test proxy authorization
  475. CPPUNIT_ASSERT(proxyRequest->setUri
  476. ("http://aria2proxyuser:aria2proxypasswd@localhost:9000"));
  477. expectedText = "CONNECT localhost:80 HTTP/1.1\r\n"
  478. "User-Agent: aria2\r\n"
  479. "Host: localhost:80\r\n"
  480. //"Proxy-Connection: Keep-Alive\r\n"
  481. "Proxy-Authorization: Basic YXJpYTJwcm94eXVzZXI6YXJpYTJwcm94eXBhc3N3ZA==\r\n"
  482. "\r\n";
  483. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createProxyRequest());
  484. }
  485. void HttpRequestTest::testIsRangeSatisfied()
  486. {
  487. SharedHandle<Request> request(new Request());
  488. request->supportsPersistentConnection(true);
  489. request->setUri("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
  490. request->setPipeliningHint(false); // default: false
  491. SharedHandle<Piece> p(new Piece(0, 1024*1024));
  492. SharedHandle<Segment> segment(new PiecedSegment(1024*1024, p));
  493. SharedHandle<FileEntry> fileEntry(new FileEntry("file", 0, 0));
  494. HttpRequest httpRequest;
  495. httpRequest.setRequest(request);
  496. httpRequest.setSegment(segment);
  497. httpRequest.setFileEntry(fileEntry);
  498. SharedHandle<Range> range(new Range());
  499. CPPUNIT_ASSERT(httpRequest.isRangeSatisfied(range));
  500. p.reset(new Piece(1, 1024*1024));
  501. segment.reset(new PiecedSegment(1024*1024, p));
  502. httpRequest.setSegment(segment);
  503. CPPUNIT_ASSERT(!httpRequest.isRangeSatisfied(range));
  504. uint64_t entityLength = segment->getSegmentLength()*10;
  505. range.reset(new Range(segment->getPosition(), 0, entityLength));
  506. CPPUNIT_ASSERT(httpRequest.isRangeSatisfied(range));
  507. fileEntry->setLength(entityLength-1);
  508. CPPUNIT_ASSERT(!httpRequest.isRangeSatisfied(range));
  509. fileEntry->setLength(entityLength);
  510. CPPUNIT_ASSERT(httpRequest.isRangeSatisfied(range));
  511. request->setPipeliningHint(true);
  512. CPPUNIT_ASSERT(!httpRequest.isRangeSatisfied(range));
  513. range.reset(new Range(segment->getPosition(),
  514. segment->getPosition()+segment->getLength()-1,
  515. entityLength));
  516. CPPUNIT_ASSERT(httpRequest.isRangeSatisfied(range));
  517. range.reset(new Range(0, segment->getPosition()+segment->getLength()-1,
  518. entityLength));
  519. CPPUNIT_ASSERT(!httpRequest.isRangeSatisfied(range));
  520. }
  521. void HttpRequestTest::testUserAgent()
  522. {
  523. SharedHandle<Request> request(new Request());
  524. request->setUri("http://localhost:8080/archives/aria2-1.0.0.tar.bz2");
  525. //SharedHandle<Piece> p(new Piece(0, 1024));
  526. //SharedHandle<Segment> segment(new PiecedSegment(1024, p));
  527. HttpRequest httpRequest;
  528. httpRequest.disableContentEncoding();
  529. httpRequest.setRequest(request);
  530. //httpRequest.setSegment(segment);
  531. httpRequest.setUserAgent("aria2 (Linux)");
  532. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  533. std::string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  534. "User-Agent: aria2 (Linux)\r\n"
  535. "Accept: */*\r\n"
  536. "Host: localhost:8080\r\n"
  537. "Pragma: no-cache\r\n"
  538. "Cache-Control: no-cache\r\n"
  539. "Connection: close\r\n"
  540. "\r\n";
  541. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  542. SharedHandle<Request> proxyRequest(new Request());
  543. CPPUNIT_ASSERT(proxyRequest->setUri("http://localhost:9000"));
  544. httpRequest.setProxyRequest(proxyRequest);
  545. std::string expectedTextForProxy = "CONNECT localhost:8080 HTTP/1.1\r\n"
  546. "User-Agent: aria2 (Linux)\r\n"
  547. "Host: localhost:8080\r\n"
  548. //"Proxy-Connection: close\r\n"
  549. "\r\n";
  550. CPPUNIT_ASSERT_EQUAL(expectedTextForProxy, httpRequest.createProxyRequest());
  551. }
  552. void HttpRequestTest::testAddHeader()
  553. {
  554. SharedHandle<Request> request(new Request());
  555. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  556. HttpRequest httpRequest;
  557. httpRequest.disableContentEncoding();
  558. httpRequest.setRequest(request);
  559. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  560. httpRequest.addHeader("X-ARIA2: v0.13\nX-ARIA2-DISTRIBUTE: enabled\n");
  561. httpRequest.addHeader("Accept: text/html");
  562. std::string expectedText = "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  563. "User-Agent: aria2\r\n"
  564. "Host: localhost\r\n"
  565. "Pragma: no-cache\r\n"
  566. "Cache-Control: no-cache\r\n"
  567. "Connection: close\r\n"
  568. "X-ARIA2: v0.13\r\n"
  569. "X-ARIA2-DISTRIBUTE: enabled\r\n"
  570. "Accept: text/html\r\n"
  571. "\r\n";
  572. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  573. }
  574. void HttpRequestTest::testAddAcceptType()
  575. {
  576. std::string acceptTypes[] = { "cream/custard",
  577. "muffin/chocolate" };
  578. SharedHandle<Request> request(new Request());
  579. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  580. HttpRequest httpRequest;
  581. httpRequest.disableContentEncoding();
  582. httpRequest.setRequest(request);
  583. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  584. httpRequest.addAcceptType(vbegin(acceptTypes), vend(acceptTypes));
  585. std::string expectedText =
  586. "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  587. "User-Agent: aria2\r\n"
  588. "Accept: */*,cream/custard,muffin/chocolate\r\n"
  589. "Host: localhost\r\n"
  590. "Pragma: no-cache\r\n"
  591. "Cache-Control: no-cache\r\n"
  592. "Connection: close\r\n"
  593. "\r\n";
  594. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  595. }
  596. void HttpRequestTest::testEnableAcceptEncoding()
  597. {
  598. SharedHandle<Request> request(new Request());
  599. request->setUri("http://localhost/archives/aria2-1.0.0.tar.bz2");
  600. HttpRequest httpRequest;
  601. httpRequest.setRequest(request);
  602. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  603. std::string acceptEncodings;
  604. #ifdef HAVE_LIBZ
  605. acceptEncodings += "deflate, gzip";
  606. #endif // HAVE_LIBZ
  607. std::string expectedTextHead =
  608. "GET /archives/aria2-1.0.0.tar.bz2 HTTP/1.1\r\n"
  609. "User-Agent: aria2\r\n"
  610. "Accept: */*\r\n";
  611. std::string expectedTextTail =
  612. "Host: localhost\r\n"
  613. "Pragma: no-cache\r\n"
  614. "Cache-Control: no-cache\r\n"
  615. "Connection: close\r\n"
  616. "\r\n";
  617. std::string expectedText = expectedTextHead;
  618. expectedText += expectedTextTail;
  619. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  620. expectedText = expectedTextHead;
  621. if(!acceptEncodings.empty()) {
  622. expectedText += "Accept-Encoding: ";
  623. expectedText += acceptEncodings;
  624. expectedText += "\r\n";
  625. }
  626. expectedText += expectedTextTail;
  627. httpRequest.enableAcceptGZip();
  628. CPPUNIT_ASSERT_EQUAL(expectedText, httpRequest.createRequest());
  629. }
  630. void HttpRequestTest::testCreateRequest_ipv6LiteralAddr()
  631. {
  632. SharedHandle<Request> request(new Request());
  633. request->setUri("http://[::1]/path");
  634. HttpRequest httpRequest;
  635. httpRequest.disableContentEncoding();
  636. httpRequest.setRequest(request);
  637. httpRequest.setAuthConfigFactory(authConfigFactory_, option_.get());
  638. CPPUNIT_ASSERT(httpRequest.createRequest().find("Host: [::1]") != std::string::npos);
  639. SharedHandle<Request> proxy(new Request());
  640. proxy->setUri("http://proxy");
  641. httpRequest.setProxyRequest(proxy);
  642. std::string proxyRequest = httpRequest.createProxyRequest();
  643. CPPUNIT_ASSERT(proxyRequest.find("Host: [::1]:80") != std::string::npos);
  644. CPPUNIT_ASSERT(proxyRequest.find("CONNECT [::1]:80 ") != std::string::npos);
  645. }
  646. } // namespace aria2