HttpRequestTest.cc 21 KB

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