RequestTest.cc 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #include "Request.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "Netrc.h"
  4. #include "DefaultAuthResolver.h"
  5. #include "NetrcAuthResolver.h"
  6. #include "uri.h"
  7. namespace aria2 {
  8. class RequestTest:public CppUnit::TestFixture {
  9. CPPUNIT_TEST_SUITE(RequestTest);
  10. CPPUNIT_TEST(testSetUri1);
  11. CPPUNIT_TEST(testSetUri2);
  12. CPPUNIT_TEST(testSetUri7);
  13. CPPUNIT_TEST(testSetUri17);
  14. CPPUNIT_TEST(testSetUri_supportsPersistentConnection);
  15. CPPUNIT_TEST(testRedirectUri);
  16. CPPUNIT_TEST(testRedirectUri2);
  17. CPPUNIT_TEST(testRedirectUri_supportsPersistentConnection);
  18. CPPUNIT_TEST(testResetUri);
  19. CPPUNIT_TEST(testResetUri_supportsPersistentConnection);
  20. CPPUNIT_TEST(testInnerLink);
  21. CPPUNIT_TEST(testInnerLinkInReferer);
  22. CPPUNIT_TEST(testGetURIHost);
  23. CPPUNIT_TEST_SUITE_END();
  24. public:
  25. void testSetUri1();
  26. void testSetUri2();
  27. void testSetUri7();
  28. void testSetUri17();
  29. void testSetUri_supportsPersistentConnection();
  30. void testRedirectUri();
  31. void testRedirectUri2();
  32. void testRedirectUri_supportsPersistentConnection();
  33. void testResetUri();
  34. void testResetUri_supportsPersistentConnection();
  35. void testInnerLink();
  36. void testInnerLinkInReferer();
  37. void testGetURIHost();
  38. };
  39. CPPUNIT_TEST_SUITE_REGISTRATION( RequestTest );
  40. void RequestTest::testSetUri1() {
  41. Request req;
  42. bool v = req.setUri("http://aria.rednoah.com/");
  43. CPPUNIT_ASSERT(v);
  44. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"),
  45. req.getUri());
  46. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"),
  47. req.getCurrentUri());
  48. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
  49. CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
  50. CPPUNIT_ASSERT_EQUAL((uint16_t)80, req.getPort());
  51. CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost());
  52. CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir());
  53. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile());
  54. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
  55. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getUsername());
  56. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPassword());
  57. CPPUNIT_ASSERT(!req.isIPv6LiteralAddress());
  58. }
  59. void RequestTest::testSetUri2() {
  60. Request req;
  61. bool v = req.setUri("http://aria.rednoah.com:8080/index.html");
  62. req.setReferer("http://aria.rednoah.com:8080");
  63. CPPUNIT_ASSERT(v);
  64. // referer is unchaged
  65. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080"),
  66. req.getReferer());
  67. // previousUri must equal to referer;
  68. CPPUNIT_ASSERT_EQUAL(req.getReferer(), req.getPreviousUri());
  69. CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
  70. CPPUNIT_ASSERT_EQUAL((uint16_t)8080, req.getPort());
  71. CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost());
  72. CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir());
  73. CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile());
  74. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
  75. }
  76. void RequestTest::testSetUri7() {
  77. Request req;
  78. bool v = req.setUri("http://");
  79. CPPUNIT_ASSERT(!v);
  80. }
  81. void RequestTest::testSetUri17()
  82. {
  83. Request req;
  84. bool v = req.setUri("http://host:80/file<with%2 %20space/"
  85. "file with space;param%?a=/?");
  86. CPPUNIT_ASSERT(v);
  87. CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
  88. CPPUNIT_ASSERT_EQUAL(std::string("host"), req.getHost());
  89. CPPUNIT_ASSERT_EQUAL(std::string("/file%3Cwith%252%20%20space"),
  90. req.getDir());
  91. CPPUNIT_ASSERT_EQUAL(std::string("file%20with%20space;param%25"),
  92. req.getFile());
  93. CPPUNIT_ASSERT_EQUAL(std::string("?a=/?"), req.getQuery());
  94. CPPUNIT_ASSERT_EQUAL(std::string("http://host:80/file%3Cwith%252%20%20space"
  95. "/file%20with%20space;param%25?a=/?"),
  96. req.getCurrentUri());
  97. CPPUNIT_ASSERT_EQUAL(std::string("http://host:80/file<with%2 %20space"
  98. "/file with space;param%?a=/?"),
  99. req.getUri());
  100. }
  101. void RequestTest::testRedirectUri()
  102. {
  103. Request req;
  104. req.supportsPersistentConnection(false);
  105. req.setUri("http://aria.rednoah.com:8080/aria2/index.html");
  106. bool v2 = req.redirectUri("http://aria.rednoah.co.jp/");
  107. CPPUNIT_ASSERT(v2);
  108. // persistent connection flag is set to be true after redirection
  109. CPPUNIT_ASSERT(req.supportsPersistentConnection());
  110. // uri must be the same
  111. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/aria2/"
  112. "index.html"),
  113. req.getUri());
  114. // currentUri must be updated
  115. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/"),
  116. req.getCurrentUri());
  117. // previousUri is "" because no referer is set.
  118. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
  119. CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
  120. CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.co.jp"), req.getHost());
  121. CPPUNIT_ASSERT_EQUAL((uint16_t)80, req.getPort());
  122. CPPUNIT_ASSERT_EQUAL(std::string("/"), req.getDir());
  123. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getFile());
  124. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
  125. // See redirect count is incremented.
  126. CPPUNIT_ASSERT_EQUAL((unsigned int)1, req.getRedirectCount());
  127. // Give abosulute path
  128. CPPUNIT_ASSERT(req.redirectUri("/abspath/to/file"));
  129. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/abspath/to/file"),
  130. req.getCurrentUri());
  131. CPPUNIT_ASSERT_EQUAL((unsigned int)2, req.getRedirectCount());
  132. // Give relative path
  133. CPPUNIT_ASSERT(req.redirectUri("relativepath/to/file"));
  134. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.co.jp/abspath/to/"
  135. "relativepath/to/file"),
  136. req.getCurrentUri());
  137. CPPUNIT_ASSERT_EQUAL((unsigned int)3, req.getRedirectCount());
  138. // White space in path and fragment is appended.
  139. CPPUNIT_ASSERT(req.redirectUri("http://example.org/white space#aria2"));
  140. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/white%20space"),
  141. req.getCurrentUri());
  142. }
  143. void RequestTest::testRedirectUri2()
  144. {
  145. Request req;
  146. req.setUri("http://aria.rednoah.com/download.html");
  147. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getPreviousUri());
  148. req.setReferer("http://aria.rednoah.com/");
  149. // previousUri is updated when referer is specified
  150. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"),
  151. req.getPreviousUri());
  152. req.redirectUri("http://aria.rednoah.com/403.html");
  153. // previousUri must not be changed in redirection
  154. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"),
  155. req.getPreviousUri());
  156. // referer is unchagned
  157. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"),
  158. req.getReferer());
  159. req.redirectUri("http://aria.rednoah.com/error.html");
  160. // previousUri must not be changed in redirection
  161. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/"),
  162. req.getPreviousUri());
  163. }
  164. void RequestTest::testResetUri()
  165. {
  166. Request req;
  167. req.setUri("http://aria.rednoah.com:8080/aria2/index.html");
  168. req.setReferer("http://aria.rednoah.com:8080/");
  169. req.redirectUri("ftp://aria.rednoah.co.jp/index_en.html?view=wide");
  170. bool v3 = req.resetUri();
  171. CPPUNIT_ASSERT(v3);
  172. // currentUri must equal to uri
  173. CPPUNIT_ASSERT_EQUAL
  174. (std::string("http://aria.rednoah.com:8080/aria2/index.html"),
  175. req.getUri());
  176. CPPUNIT_ASSERT_EQUAL(req.getUri(), req.getCurrentUri());
  177. // previousUri must equal to referer
  178. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/"),
  179. req.getPreviousUri());
  180. // referer is unchanged
  181. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com:8080/"),
  182. req.getReferer());
  183. CPPUNIT_ASSERT_EQUAL(std::string("http"), req.getProtocol());
  184. CPPUNIT_ASSERT_EQUAL((uint16_t)8080, req.getPort());
  185. CPPUNIT_ASSERT_EQUAL(std::string("aria.rednoah.com"), req.getHost());
  186. CPPUNIT_ASSERT_EQUAL(std::string("/aria2"), req.getDir());
  187. CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile());
  188. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
  189. }
  190. void RequestTest::testInnerLink()
  191. {
  192. Request req;
  193. bool v = req.setUri("http://aria.rednoah.com/index.html#download");
  194. CPPUNIT_ASSERT(v);
  195. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/index.html"
  196. "#download"),
  197. req.getUri());
  198. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/index.html"),
  199. req.getCurrentUri());
  200. CPPUNIT_ASSERT_EQUAL(std::string("index.html"), req.getFile());
  201. CPPUNIT_ASSERT_EQUAL(std::string(""), req.getQuery());
  202. }
  203. void RequestTest::testInnerLinkInReferer()
  204. {
  205. Request req;
  206. req.setReferer("http://aria.rednoah.com/home.html#top");
  207. CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/home.html"),
  208. req.getReferer());
  209. }
  210. void RequestTest::testSetUri_supportsPersistentConnection()
  211. {
  212. Request req;
  213. CPPUNIT_ASSERT(req.setUri("http://host/file"));
  214. req.supportsPersistentConnection(false);
  215. CPPUNIT_ASSERT(!req.supportsPersistentConnection());
  216. req.setUri("http://host/file");
  217. CPPUNIT_ASSERT(req.supportsPersistentConnection());
  218. }
  219. void RequestTest::testResetUri_supportsPersistentConnection()
  220. {
  221. Request req;
  222. CPPUNIT_ASSERT(req.setUri("http://host/file"));
  223. req.supportsPersistentConnection(false);
  224. CPPUNIT_ASSERT(!req.supportsPersistentConnection());
  225. req.resetUri();
  226. CPPUNIT_ASSERT(req.supportsPersistentConnection());
  227. }
  228. void RequestTest::testRedirectUri_supportsPersistentConnection()
  229. {
  230. Request req;
  231. CPPUNIT_ASSERT(req.setUri("http://host/file"));
  232. req.supportsPersistentConnection(false);
  233. CPPUNIT_ASSERT(!req.supportsPersistentConnection());
  234. req.redirectUri("http://host/file");
  235. CPPUNIT_ASSERT(req.supportsPersistentConnection());
  236. }
  237. void RequestTest::testGetURIHost()
  238. {
  239. Request req;
  240. CPPUNIT_ASSERT(req.setUri("http://[::1]"));
  241. CPPUNIT_ASSERT_EQUAL(std::string("[::1]"), req.getURIHost());
  242. }
  243. } // namespace aria2