HttpRequestTest.cc 21 KB

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