UtilTest1.cc 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380
  1. #include "util.h"
  2. #include <cmath>
  3. #include <cstring>
  4. #include <string>
  5. #include <iostream>
  6. #include <cppunit/extensions/HelperMacros.h>
  7. #include "FixedNumberRandomizer.h"
  8. #include "DlAbortEx.h"
  9. #include "BitfieldMan.h"
  10. #include "ByteArrayDiskWriter.h"
  11. #include "FileEntry.h"
  12. #include "File.h"
  13. #include "array_fun.h"
  14. #include "BufferedFile.h"
  15. #include "TestUtil.h"
  16. #include "SocketCore.h"
  17. namespace aria2 {
  18. class UtilTest1:public CppUnit::TestFixture {
  19. CPPUNIT_TEST_SUITE(UtilTest1);
  20. CPPUNIT_TEST(testStrip);
  21. CPPUNIT_TEST(testStripIter);
  22. CPPUNIT_TEST(testLstripIter);
  23. CPPUNIT_TEST(testLstripIter_char);
  24. CPPUNIT_TEST(testDivide);
  25. CPPUNIT_TEST(testSplit);
  26. CPPUNIT_TEST(testSplitIter);
  27. CPPUNIT_TEST(testSplitIterM);
  28. CPPUNIT_TEST(testStreq);
  29. CPPUNIT_TEST(testStrieq);
  30. CPPUNIT_TEST(testStrifind);
  31. CPPUNIT_TEST(testEndsWith);
  32. CPPUNIT_TEST(testIendsWith);
  33. CPPUNIT_TEST(testReplace);
  34. CPPUNIT_TEST(testStartsWith);
  35. CPPUNIT_TEST(testIstartsWith);
  36. // may be moved to other helper class in the future.
  37. CPPUNIT_TEST(testGetContentDispositionFilename);
  38. CPPUNIT_TEST(testParseContentDisposition1);
  39. CPPUNIT_TEST(testParseContentDisposition2);
  40. CPPUNIT_TEST_SUITE_END();
  41. private:
  42. public:
  43. void setUp() {
  44. }
  45. void testStrip();
  46. void testStripIter();
  47. void testLstripIter();
  48. void testLstripIter_char();
  49. void testDivide();
  50. void testSplit();
  51. void testSplitIter();
  52. void testSplitIterM();
  53. void testStreq();
  54. void testStrieq();
  55. void testStrifind();
  56. void testEndsWith();
  57. void testIendsWith();
  58. void testReplace();
  59. void testStartsWith();
  60. void testIstartsWith();
  61. // may be moved to other helper class in the future.
  62. void testGetContentDispositionFilename();
  63. void testParseContentDisposition1();
  64. void testParseContentDisposition2();
  65. };
  66. CPPUNIT_TEST_SUITE_REGISTRATION( UtilTest1 );
  67. void UtilTest1::testStrip()
  68. {
  69. std::string str1 = "aria2";
  70. CPPUNIT_ASSERT_EQUAL(str1, util::strip("aria2"));
  71. CPPUNIT_ASSERT_EQUAL(str1, util::strip(" aria2"));
  72. CPPUNIT_ASSERT_EQUAL(str1, util::strip("aria2 "));
  73. CPPUNIT_ASSERT_EQUAL(str1, util::strip(" aria2 "));
  74. CPPUNIT_ASSERT_EQUAL(str1, util::strip(" aria2 "));
  75. std::string str2 = "aria2 debut";
  76. CPPUNIT_ASSERT_EQUAL(str2, util::strip("aria2 debut"));
  77. CPPUNIT_ASSERT_EQUAL(str2, util::strip(" aria2 debut "));
  78. std::string str3 = "";
  79. CPPUNIT_ASSERT_EQUAL(str3, util::strip(""));
  80. CPPUNIT_ASSERT_EQUAL(str3, util::strip(" "));
  81. CPPUNIT_ASSERT_EQUAL(str3, util::strip(" "));
  82. std::string str4 = "A";
  83. CPPUNIT_ASSERT_EQUAL(str4, util::strip("A"));
  84. CPPUNIT_ASSERT_EQUAL(str4, util::strip(" A "));
  85. CPPUNIT_ASSERT_EQUAL(str4, util::strip(" A "));
  86. }
  87. void UtilTest1::testStripIter()
  88. {
  89. Scip p;
  90. std::string str1 = "aria2";
  91. std::string s = "aria2";
  92. p = util::stripIter(s.begin(), s.end());
  93. CPPUNIT_ASSERT_EQUAL(str1, std::string(p.first, p.second));
  94. s = " aria2";
  95. p = util::stripIter(s.begin(), s.end());
  96. CPPUNIT_ASSERT_EQUAL(str1, std::string(p.first, p.second));
  97. s = "aria2 ";
  98. p = util::stripIter(s.begin(), s.end());
  99. CPPUNIT_ASSERT_EQUAL(str1, std::string(p.first, p.second));
  100. s = " aria2 ";
  101. p = util::stripIter(s.begin(), s.end());
  102. CPPUNIT_ASSERT_EQUAL(str1, std::string(p.first, p.second));
  103. s = " aria2 ";
  104. p = util::stripIter(s.begin(), s.end());
  105. CPPUNIT_ASSERT_EQUAL(str1, std::string(p.first, p.second));
  106. std::string str2 = "aria2 debut";
  107. s = "aria2 debut";
  108. p = util::stripIter(s.begin(), s.end());
  109. CPPUNIT_ASSERT_EQUAL(str2, std::string(p.first, p.second));
  110. s = " aria2 debut ";
  111. p = util::stripIter(s.begin(), s.end());
  112. CPPUNIT_ASSERT_EQUAL(str2, std::string(p.first, p.second));
  113. std::string str3 = "";
  114. s = "";
  115. p = util::stripIter(s.begin(), s.end());
  116. CPPUNIT_ASSERT_EQUAL(str3, std::string(p.first, p.second));
  117. s = " ";
  118. p = util::stripIter(s.begin(), s.end());
  119. CPPUNIT_ASSERT_EQUAL(str3, std::string(p.first, p.second));
  120. s = " ";
  121. p = util::stripIter(s.begin(), s.end());
  122. CPPUNIT_ASSERT_EQUAL(str3, std::string(p.first, p.second));
  123. std::string str4 = "A";
  124. s = "A";
  125. p = util::stripIter(s.begin(), s.end());
  126. CPPUNIT_ASSERT_EQUAL(str4, std::string(p.first, p.second));
  127. s = " A ";
  128. p = util::stripIter(s.begin(), s.end());
  129. CPPUNIT_ASSERT_EQUAL(str4, std::string(p.first, p.second));
  130. s = " A ";
  131. p = util::stripIter(s.begin(), s.end());
  132. CPPUNIT_ASSERT_EQUAL(str4, std::string(p.first, p.second));
  133. }
  134. void UtilTest1::testLstripIter()
  135. {
  136. std::string::iterator r;
  137. std::string s = "foo";
  138. r = util::lstripIter(s.begin(), s.end());
  139. CPPUNIT_ASSERT_EQUAL(std::string("foo"), std::string(r, s.end()));
  140. s = " foo bar ";
  141. r = util::lstripIter(s.begin(), s.end());
  142. CPPUNIT_ASSERT_EQUAL(std::string("foo bar "), std::string(r, s.end()));
  143. s = "f";
  144. r = util::lstripIter(s.begin(), s.end());
  145. CPPUNIT_ASSERT_EQUAL(std::string("f"), std::string(r, s.end()));
  146. s = "foo ";
  147. r = util::lstripIter(s.begin(), s.end());
  148. CPPUNIT_ASSERT_EQUAL(std::string("foo "), std::string(r, s.end()));
  149. }
  150. void UtilTest1::testLstripIter_char()
  151. {
  152. std::string::iterator r;
  153. std::string s = "foo";
  154. r = util::lstripIter(s.begin(), s.end(), '$');
  155. CPPUNIT_ASSERT_EQUAL(std::string("foo"), std::string(r, s.end()));
  156. s = "$$foo$bar$$";
  157. r = util::lstripIter(s.begin(), s.end(), '$');
  158. CPPUNIT_ASSERT_EQUAL(std::string("foo$bar$$"), std::string(r, s.end()));
  159. s = "f";
  160. r = util::lstripIter(s.begin(), s.end(), '$');
  161. CPPUNIT_ASSERT_EQUAL(std::string("f"), std::string(r, s.end()));
  162. s = "foo$$";
  163. r = util::lstripIter(s.begin(), s.end(), '$');
  164. CPPUNIT_ASSERT_EQUAL(std::string("foo$$"), std::string(r, s.end()));
  165. }
  166. void UtilTest1::testDivide() {
  167. std::string s = "name=value";
  168. auto p1 = util::divide(std::begin(s), std::end(s), '=');
  169. CPPUNIT_ASSERT_EQUAL(std::string("name"),
  170. std::string(p1.first.first, p1.first.second));
  171. CPPUNIT_ASSERT_EQUAL(std::string("value"),
  172. std::string(p1.second.first, p1.second.second));
  173. s = " name = value ";
  174. p1 = util::divide(std::begin(s), std::end(s), '=');
  175. CPPUNIT_ASSERT_EQUAL(std::string("name"),
  176. std::string(p1.first.first, p1.first.second));
  177. CPPUNIT_ASSERT_EQUAL(std::string("value"),
  178. std::string(p1.second.first, p1.second.second));
  179. s = "=value";
  180. p1 = util::divide(std::begin(s), std::end(s), '=');
  181. CPPUNIT_ASSERT_EQUAL(std::string(""),
  182. std::string(p1.first.first, p1.first.second));
  183. CPPUNIT_ASSERT_EQUAL(std::string("value"),
  184. std::string(p1.second.first, p1.second.second));
  185. s = "name=";
  186. p1 = util::divide(std::begin(s), std::end(s), '=');
  187. CPPUNIT_ASSERT_EQUAL(std::string("name"),
  188. std::string(p1.first.first, p1.first.second));
  189. CPPUNIT_ASSERT_EQUAL(std::string(""),
  190. std::string(p1.second.first, p1.second.second));
  191. s = "name";
  192. p1 = util::divide(std::begin(s), std::end(s), '=');
  193. CPPUNIT_ASSERT_EQUAL(std::string("name"),
  194. std::string(p1.first.first, p1.first.second));
  195. CPPUNIT_ASSERT_EQUAL(std::string(""),
  196. std::string(p1.second.first, p1.second.second));
  197. }
  198. void UtilTest1::testSplit() {
  199. std::vector<std::string> v;
  200. std::string s = "k1; k2;; k3";
  201. util::split(s.begin(), s.end(), std::back_inserter(v), ';', true);
  202. CPPUNIT_ASSERT_EQUAL((size_t)3, v.size());
  203. std::vector<std::string>::iterator itr = v.begin();
  204. CPPUNIT_ASSERT_EQUAL(std::string("k1"), *itr++);
  205. CPPUNIT_ASSERT_EQUAL(std::string("k2"), *itr++);
  206. CPPUNIT_ASSERT_EQUAL(std::string("k3"), *itr++);
  207. v.clear();
  208. s = "k1; k2; k3";
  209. util::split(s.begin(), s.end(), std::back_inserter(v), ';');
  210. CPPUNIT_ASSERT_EQUAL((size_t)3, v.size());
  211. itr = v.begin();
  212. CPPUNIT_ASSERT_EQUAL(std::string("k1"), *itr++);
  213. CPPUNIT_ASSERT_EQUAL(std::string(" k2"), *itr++);
  214. CPPUNIT_ASSERT_EQUAL(std::string(" k3"), *itr++);
  215. v.clear();
  216. s = "k=v";
  217. util::split(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  218. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  219. itr = v.begin();
  220. CPPUNIT_ASSERT_EQUAL(std::string("k=v"), *itr++);
  221. v.clear();
  222. s = ";;k1;;k2;";
  223. util::split(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  224. CPPUNIT_ASSERT_EQUAL((size_t)6, v.size());
  225. itr = v.begin();
  226. CPPUNIT_ASSERT_EQUAL(std::string(""), *itr++);
  227. CPPUNIT_ASSERT_EQUAL(std::string(""), *itr++);
  228. CPPUNIT_ASSERT_EQUAL(std::string("k1"), *itr++);
  229. CPPUNIT_ASSERT_EQUAL(std::string(""), *itr++);
  230. CPPUNIT_ASSERT_EQUAL(std::string("k2"), *itr++);
  231. CPPUNIT_ASSERT_EQUAL(std::string(""), *itr++);
  232. v.clear();
  233. s = ";;k1;;k2;";
  234. util::split(s.begin(), s.end(), std::back_inserter(v), ';');
  235. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  236. itr = v.begin();
  237. CPPUNIT_ASSERT_EQUAL(std::string("k1"), *itr++);
  238. CPPUNIT_ASSERT_EQUAL(std::string("k2"), *itr++);
  239. v.clear();
  240. s = "k; ";
  241. util::split(s.begin(), s.end(), std::back_inserter(v), ';');
  242. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  243. itr = v.begin();
  244. CPPUNIT_ASSERT_EQUAL(std::string("k"), *itr++);
  245. CPPUNIT_ASSERT_EQUAL(std::string(" "), *itr++);
  246. v.clear();
  247. s = " ";
  248. util::split(s.begin(), s.end(), std::back_inserter(v), ';', true, true);
  249. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  250. CPPUNIT_ASSERT_EQUAL(std::string(""), v[0]);
  251. v.clear();
  252. s = " ";
  253. util::split(s.begin(), s.end(), std::back_inserter(v), ';', true);
  254. CPPUNIT_ASSERT_EQUAL((size_t)0, v.size());
  255. v.clear();
  256. s = " ";
  257. util::split(s.begin(), s.end(), std::back_inserter(v), ';');
  258. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  259. CPPUNIT_ASSERT_EQUAL(std::string(" "), v[0]);
  260. v.clear();
  261. s = ";";
  262. util::split(s.begin(), s.end(), std::back_inserter(v), ';');
  263. CPPUNIT_ASSERT_EQUAL((size_t)0, v.size());
  264. v.clear();
  265. s = ";";
  266. util::split(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  267. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  268. itr = v.begin();
  269. CPPUNIT_ASSERT_EQUAL(std::string(""), *itr++);
  270. CPPUNIT_ASSERT_EQUAL(std::string(""), *itr++);
  271. v.clear();
  272. s = "";
  273. util::split(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  274. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  275. CPPUNIT_ASSERT_EQUAL(std::string(""), v[0]);
  276. }
  277. void UtilTest1::testSplitIter() {
  278. std::vector<Scip> v;
  279. std::string s = "k1; k2;; k3";
  280. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';', true);
  281. CPPUNIT_ASSERT_EQUAL((size_t)3, v.size());
  282. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  283. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[1].first, v[1].second));
  284. CPPUNIT_ASSERT_EQUAL(std::string("k3"), std::string(v[2].first, v[2].second));
  285. v.clear();
  286. s = "k1; k2; k3";
  287. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';');
  288. CPPUNIT_ASSERT_EQUAL((size_t)3, v.size());
  289. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  290. CPPUNIT_ASSERT_EQUAL(std::string(" k2"),
  291. std::string(v[1].first, v[1].second));
  292. CPPUNIT_ASSERT_EQUAL(std::string(" k3"),
  293. std::string(v[2].first, v[2].second));
  294. v.clear();
  295. s = "k=v";
  296. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  297. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  298. CPPUNIT_ASSERT_EQUAL(std::string("k=v"),
  299. std::string(v[0].first, v[0].second));
  300. v.clear();
  301. s = ";;k1;;k2;";
  302. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  303. CPPUNIT_ASSERT_EQUAL((size_t)6, v.size());
  304. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  305. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[1].first, v[1].second));
  306. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[2].first, v[2].second));
  307. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[3].first, v[3].second));
  308. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[4].first, v[4].second));
  309. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[5].first, v[5].second));
  310. v.clear();
  311. s = ";;k1;;k2;";
  312. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';');
  313. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  314. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  315. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[1].first, v[1].second));
  316. v.clear();
  317. s = "k; ";
  318. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';');
  319. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  320. CPPUNIT_ASSERT_EQUAL(std::string("k"), std::string(v[0].first, v[0].second));
  321. CPPUNIT_ASSERT_EQUAL(std::string(" "), std::string(v[1].first, v[1].second));
  322. v.clear();
  323. s = " ";
  324. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';', true, true);
  325. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  326. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  327. v.clear();
  328. s = " ";
  329. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';', true);
  330. CPPUNIT_ASSERT_EQUAL((size_t)0, v.size());
  331. v.clear();
  332. s = " ";
  333. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';');
  334. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  335. CPPUNIT_ASSERT_EQUAL(std::string(" "), std::string(v[0].first, v[0].second));
  336. v.clear();
  337. s = ";";
  338. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';');
  339. CPPUNIT_ASSERT_EQUAL((size_t)0, v.size());
  340. v.clear();
  341. s = ";";
  342. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  343. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  344. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  345. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[1].first, v[1].second));
  346. v.clear();
  347. s = "";
  348. util::splitIter(s.begin(), s.end(), std::back_inserter(v), ';', false, true);
  349. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  350. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  351. }
  352. void UtilTest1::testSplitIterM() {
  353. const char d[] = ";";
  354. const char md[] = "; ";
  355. std::vector<Scip> v;
  356. std::string s = "k1; k2;; k3";
  357. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d, true);
  358. CPPUNIT_ASSERT_EQUAL((size_t)3, v.size());
  359. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  360. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[1].first, v[1].second));
  361. CPPUNIT_ASSERT_EQUAL(std::string("k3"), std::string(v[2].first, v[2].second));
  362. v.clear();
  363. s = "k1; k2; k3";
  364. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d);
  365. CPPUNIT_ASSERT_EQUAL((size_t)3, v.size());
  366. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  367. CPPUNIT_ASSERT_EQUAL(std::string(" k2"),
  368. std::string(v[1].first, v[1].second));
  369. CPPUNIT_ASSERT_EQUAL(std::string(" k3"),
  370. std::string(v[2].first, v[2].second));
  371. v.clear();
  372. s = "k1; k2; k3";
  373. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), md);
  374. CPPUNIT_ASSERT_EQUAL((size_t)3, v.size());
  375. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  376. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[1].first, v[1].second));
  377. CPPUNIT_ASSERT_EQUAL(std::string("k3"), std::string(v[2].first, v[2].second));
  378. v.clear();
  379. s = "k1; k2; k3;";
  380. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), md, false, true);
  381. CPPUNIT_ASSERT_EQUAL((size_t)6, v.size());
  382. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  383. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[1].first, v[1].second));
  384. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[2].first, v[2].second));
  385. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[3].first, v[3].second));
  386. CPPUNIT_ASSERT_EQUAL(std::string("k3"), std::string(v[4].first, v[4].second));
  387. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[5].first, v[5].second));
  388. v.clear();
  389. s = "k=v";
  390. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d, false, true);
  391. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  392. CPPUNIT_ASSERT_EQUAL(std::string("k=v"),
  393. std::string(v[0].first, v[0].second));
  394. v.clear();
  395. s = ";;k1;;k2;";
  396. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d, false, true);
  397. CPPUNIT_ASSERT_EQUAL((size_t)6, v.size());
  398. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  399. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[1].first, v[1].second));
  400. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[2].first, v[2].second));
  401. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[3].first, v[3].second));
  402. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[4].first, v[4].second));
  403. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[5].first, v[5].second));
  404. v.clear();
  405. s = ";;k1;;k2;";
  406. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d);
  407. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  408. CPPUNIT_ASSERT_EQUAL(std::string("k1"), std::string(v[0].first, v[0].second));
  409. CPPUNIT_ASSERT_EQUAL(std::string("k2"), std::string(v[1].first, v[1].second));
  410. v.clear();
  411. s = "k; ";
  412. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d);
  413. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  414. CPPUNIT_ASSERT_EQUAL(std::string("k"), std::string(v[0].first, v[0].second));
  415. CPPUNIT_ASSERT_EQUAL(std::string(" "), std::string(v[1].first, v[1].second));
  416. v.clear();
  417. s = " ";
  418. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d, true, true);
  419. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  420. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  421. v.clear();
  422. s = " ";
  423. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d, true);
  424. CPPUNIT_ASSERT_EQUAL((size_t)0, v.size());
  425. v.clear();
  426. s = " ";
  427. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d);
  428. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  429. CPPUNIT_ASSERT_EQUAL(std::string(" "), std::string(v[0].first, v[0].second));
  430. v.clear();
  431. s = ";";
  432. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d);
  433. CPPUNIT_ASSERT_EQUAL((size_t)0, v.size());
  434. v.clear();
  435. s = ";";
  436. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d, false, true);
  437. CPPUNIT_ASSERT_EQUAL((size_t)2, v.size());
  438. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  439. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[1].first, v[1].second));
  440. v.clear();
  441. s = "";
  442. util::splitIterM(s.begin(), s.end(), std::back_inserter(v), d, false, true);
  443. CPPUNIT_ASSERT_EQUAL((size_t)1, v.size());
  444. CPPUNIT_ASSERT_EQUAL(std::string(""), std::string(v[0].first, v[0].second));
  445. }
  446. void UtilTest1::testEndsWith() {
  447. std::string target = "abcdefg";
  448. std::string part = "fg";
  449. CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
  450. part.begin(), part.end()));
  451. target = "abdefg";
  452. part = "g";
  453. CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
  454. part.begin(), part.end()));
  455. target = "abdefg";
  456. part = "eg";
  457. CPPUNIT_ASSERT(!util::endsWith(target.begin(), target.end(),
  458. part.begin(), part.end()));
  459. target = "g";
  460. part = "eg";
  461. CPPUNIT_ASSERT(!util::endsWith(target.begin(), target.end(),
  462. part.begin(), part.end()));
  463. target = "g";
  464. part = "g";
  465. CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
  466. part.begin(), part.end()));
  467. target = "g";
  468. part = "";
  469. CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
  470. part.begin(), part.end()));
  471. target = "";
  472. part = "";
  473. CPPUNIT_ASSERT(util::endsWith(target.begin(), target.end(),
  474. part.begin(), part.end()));
  475. target = "";
  476. part = "g";
  477. CPPUNIT_ASSERT(!util::endsWith(target.begin(), target.end(),
  478. part.begin(), part.end()));
  479. }
  480. void UtilTest1::testIendsWith() {
  481. std::string target = "abcdefg";
  482. std::string part = "Fg";
  483. CPPUNIT_ASSERT(util::iendsWith(target.begin(), target.end(),
  484. part.begin(), part.end()));
  485. target = "abdefg";
  486. part = "ef";
  487. CPPUNIT_ASSERT(!util::iendsWith(target.begin(), target.end(),
  488. part.begin(), part.end()));
  489. }
  490. void UtilTest1::testStreq()
  491. {
  492. std::string s1, s2;
  493. s1 = "foo";
  494. s2 = "foo";
  495. CPPUNIT_ASSERT(util::streq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  496. CPPUNIT_ASSERT(util::streq(s1.begin(), s1.end(), s2.c_str()));
  497. s2 = "fooo";
  498. CPPUNIT_ASSERT(!util::streq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  499. CPPUNIT_ASSERT(!util::streq(s1.begin(), s1.end(), s2.c_str()));
  500. s2 = "fo";
  501. CPPUNIT_ASSERT(!util::streq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  502. CPPUNIT_ASSERT(!util::streq(s1.begin(), s1.end(), s2.c_str()));
  503. s2 = "";
  504. CPPUNIT_ASSERT(!util::streq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  505. CPPUNIT_ASSERT(!util::streq(s1.begin(), s1.end(), s2.c_str()));
  506. s1 = "";
  507. CPPUNIT_ASSERT(util::streq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  508. CPPUNIT_ASSERT(util::streq(s1.begin(), s1.end(), s2.c_str()));
  509. }
  510. void UtilTest1::testStrieq()
  511. {
  512. std::string s1, s2;
  513. s1 = "foo";
  514. s2 = "foo";
  515. CPPUNIT_ASSERT(util::strieq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  516. CPPUNIT_ASSERT(util::strieq(s1.begin(), s1.end(), s2.c_str()));
  517. s1 = "FoO";
  518. s2 = "fOo";
  519. CPPUNIT_ASSERT(util::strieq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  520. CPPUNIT_ASSERT(util::strieq(s1.begin(), s1.end(), s2.c_str()));
  521. s2 = "fooo";
  522. CPPUNIT_ASSERT(!util::strieq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  523. CPPUNIT_ASSERT(!util::strieq(s1.begin(), s1.end(), s2.c_str()));
  524. s2 = "fo";
  525. CPPUNIT_ASSERT(!util::strieq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  526. CPPUNIT_ASSERT(!util::strieq(s1.begin(), s1.end(), s2.c_str()));
  527. s2 = "";
  528. CPPUNIT_ASSERT(!util::strieq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  529. CPPUNIT_ASSERT(!util::strieq(s1.begin(), s1.end(), s2.c_str()));
  530. s1 = "";
  531. CPPUNIT_ASSERT(util::strieq(s1.begin(), s1.end(), s2.begin(), s2.end()));
  532. CPPUNIT_ASSERT(util::strieq(s1.begin(), s1.end(), s2.c_str()));
  533. }
  534. void UtilTest1::testStrifind()
  535. {
  536. std::string s1, s2;
  537. s1 = "yamagakani mukashi wo toheba hARU no tuki";
  538. s2 = "HaRu";
  539. CPPUNIT_ASSERT(util::strifind(s1.begin(), s1.end(), s2.begin(), s2.end())
  540. != s1.end());
  541. s2 = "aki";
  542. CPPUNIT_ASSERT(util::strifind(s1.begin(), s1.end(), s2.begin(), s2.end())
  543. == s1.end());
  544. s1 = "h";
  545. s2 = "HH";
  546. CPPUNIT_ASSERT(util::strifind(s1.begin(), s1.end(), s2.begin(), s2.end())
  547. == s1.end());
  548. }
  549. void UtilTest1::testReplace() {
  550. CPPUNIT_ASSERT_EQUAL(std::string("abc\n"), util::replace("abc\r\n", "\r", ""));
  551. CPPUNIT_ASSERT_EQUAL(std::string("abc"), util::replace("abc\r\n", "\r\n", ""));
  552. CPPUNIT_ASSERT_EQUAL(std::string(""), util::replace("", "\r\n", ""));
  553. CPPUNIT_ASSERT_EQUAL(std::string("abc"), util::replace("abc", "", "a"));
  554. CPPUNIT_ASSERT_EQUAL(std::string("xbc"), util::replace("abc", "a", "x"));
  555. }
  556. void UtilTest1::testStartsWith() {
  557. std::string target;
  558. std::string part;
  559. target = "abcdefg";
  560. part = "abc";
  561. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(),
  562. part.begin(), part.end()));
  563. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(), part.c_str()));
  564. target = "abcdefg";
  565. part = "abx";
  566. CPPUNIT_ASSERT(!util::startsWith(target.begin(), target.end(),
  567. part.begin(), part.end()));
  568. CPPUNIT_ASSERT(!util::startsWith(target.begin(), target.end(), part.c_str()));
  569. target = "abcdefg";
  570. part = "bcd";
  571. CPPUNIT_ASSERT(!util::startsWith(target.begin(), target.end(),
  572. part.begin(), part.end()));
  573. CPPUNIT_ASSERT(!util::startsWith(target.begin(), target.end(), part.c_str()));
  574. target = "";
  575. part = "a";
  576. CPPUNIT_ASSERT(!util::startsWith(target.begin(), target.end(),
  577. part.begin(), part.end()));
  578. CPPUNIT_ASSERT(!util::startsWith(target.begin(), target.end(), part.c_str()));
  579. target = "";
  580. part = "";
  581. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(),
  582. part.begin(), part.end()));
  583. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(), part.c_str()));
  584. target = "a";
  585. part = "";
  586. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(),
  587. part.begin(), part.end()));
  588. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(), part.c_str()));
  589. target = "a";
  590. part = "a";
  591. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(),
  592. part.begin(), part.end()));
  593. CPPUNIT_ASSERT(util::startsWith(target.begin(), target.end(), part.c_str()));
  594. }
  595. void UtilTest1::testIstartsWith() {
  596. std::string target;
  597. std::string part;
  598. target = "abcdefg";
  599. part = "aBc";
  600. CPPUNIT_ASSERT(util::istartsWith(target.begin(), target.end(),
  601. part.begin(), part.end()));
  602. CPPUNIT_ASSERT(util::istartsWith(target.begin(), target.end(), part.c_str()));
  603. target = "abcdefg";
  604. part = "abx";
  605. CPPUNIT_ASSERT(!util::istartsWith(target.begin(), target.end(),
  606. part.begin(), part.end()));
  607. CPPUNIT_ASSERT(!util::istartsWith(target.begin(), target.end(), part.c_str()));
  608. }
  609. void UtilTest1::testGetContentDispositionFilename() {
  610. std::string val;
  611. val = "attachment; filename=\"aria2.tar.bz2\"";
  612. CPPUNIT_ASSERT_EQUAL(std::string("aria2.tar.bz2"),
  613. util::getContentDispositionFilename(val));
  614. val = "attachment; filename=\"\"";
  615. CPPUNIT_ASSERT_EQUAL(std::string(""),
  616. util::getContentDispositionFilename(val));
  617. val = "attachment; filename=\"";
  618. CPPUNIT_ASSERT_EQUAL(std::string(""),
  619. util::getContentDispositionFilename(val));
  620. val = "attachment; filename= \" aria2.tar.bz2 \"";
  621. CPPUNIT_ASSERT_EQUAL(std::string(" aria2.tar.bz2 "),
  622. util::getContentDispositionFilename(val));
  623. val = "attachment; filename=dir/file";
  624. CPPUNIT_ASSERT_EQUAL(std::string(""),
  625. util::getContentDispositionFilename(val));
  626. val = "attachment; filename=dir\\file";
  627. CPPUNIT_ASSERT_EQUAL(std::string(""),
  628. util::getContentDispositionFilename(val));
  629. val = "attachment; filename=\"dir/file\"";
  630. CPPUNIT_ASSERT_EQUAL(std::string(""),
  631. util::getContentDispositionFilename(val));
  632. val = "attachment; filename=\"dir\\\\file\"";
  633. CPPUNIT_ASSERT_EQUAL(std::string(""),
  634. util::getContentDispositionFilename(val));
  635. val = "attachment; filename=\"/etc/passwd\"";
  636. CPPUNIT_ASSERT_EQUAL(std::string(""),
  637. util::getContentDispositionFilename(val));
  638. val = "attachment; filename=\"..\"";
  639. CPPUNIT_ASSERT_EQUAL(std::string(""),
  640. util::getContentDispositionFilename(val));
  641. val = "attachment; filename=..";
  642. CPPUNIT_ASSERT_EQUAL(std::string(""),
  643. util::getContentDispositionFilename(val));
  644. // Unescaping %2E%2E%2F produces "../". But since we won't unescape,
  645. // we just accept it as is.
  646. val = "attachment; filename=\"%2E%2E%2Ffoo.html\"";
  647. CPPUNIT_ASSERT_EQUAL(std::string("%2E%2E%2Ffoo.html"),
  648. util::getContentDispositionFilename(val));
  649. // iso-8859-1 string will be converted to utf-8.
  650. val = "attachment; filename*=iso-8859-1''foo-%E4.html";
  651. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  652. util::getContentDispositionFilename(val));
  653. val = "attachment; filename*= UTF-8''foo-%c3%a4.html";
  654. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  655. util::getContentDispositionFilename(val));
  656. // iso-8859-1 string will be converted to utf-8.
  657. val = "attachment; filename=\"foo-%E4.html\"";
  658. val = util::percentDecode(val.begin(), val.end());
  659. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  660. util::getContentDispositionFilename(val));
  661. }
  662. void UtilTest1::testParseContentDisposition1() {
  663. char dest[1_k];
  664. size_t destlen = sizeof(dest);
  665. const char *cs;
  666. size_t cslen;
  667. std::string val;
  668. // test cases from http://greenbytes.de/tech/tc2231/
  669. // inlonly
  670. val = "inline";
  671. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  672. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  673. // inlonlyquoted
  674. val = "\"inline\"";
  675. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  676. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  677. // inlwithasciifilename
  678. val = "inline; filename=\"foo.html\"";
  679. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  680. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  681. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  682. std::string(&dest[0], &dest[8]));
  683. // inlwithfnattach
  684. val = "inline; filename=\"Not an attachment!\"";
  685. CPPUNIT_ASSERT_EQUAL((ssize_t)18, util::parse_content_disposition
  686. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  687. CPPUNIT_ASSERT_EQUAL(std::string("Not an attachment!"),
  688. std::string(&dest[0], &dest[18]));
  689. // inlwithasciifilenamepdf
  690. val = "inline; filename=\"foo.pdf\"";
  691. CPPUNIT_ASSERT_EQUAL((ssize_t)7, util::parse_content_disposition
  692. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  693. CPPUNIT_ASSERT_EQUAL(std::string("foo.pdf"),
  694. std::string(&dest[0], &dest[7]));
  695. // attwithasciifilename25
  696. val = "attachment; filename=\"0000000000111111111122222\"";
  697. CPPUNIT_ASSERT_EQUAL((ssize_t)25, util::parse_content_disposition
  698. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  699. CPPUNIT_ASSERT_EQUAL(std::string("0000000000111111111122222"),
  700. std::string(&dest[0], &dest[25]));
  701. // attwithasciifilename35
  702. val = "attachment; filename=\"00000000001111111111222222222233333\"";
  703. CPPUNIT_ASSERT_EQUAL((ssize_t)35, util::parse_content_disposition
  704. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  705. CPPUNIT_ASSERT_EQUAL(std::string("00000000001111111111222222222233333"),
  706. std::string(&dest[0], &dest[35]));
  707. // attwithasciifnescapedchar
  708. val = "attachment; filename=\"f\\oo.html\"";
  709. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  710. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  711. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  712. std::string(&dest[0], &dest[8]));
  713. // attwithasciifnescapedquote
  714. val = "attachment; filename=\"\\\"quoting\\\" tested.html\"";
  715. CPPUNIT_ASSERT_EQUAL((ssize_t)21, util::parse_content_disposition
  716. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  717. CPPUNIT_ASSERT_EQUAL(std::string("\"quoting\" tested.html"),
  718. std::string(&dest[0], &dest[21]));
  719. // attwithquotedsemicolon
  720. val = "attachment; filename=\"Here's a semicolon;.html\"";
  721. CPPUNIT_ASSERT_EQUAL((ssize_t)24, util::parse_content_disposition
  722. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  723. CPPUNIT_ASSERT_EQUAL(std::string("Here's a semicolon;.html"),
  724. std::string(&dest[0], &dest[24]));
  725. // attwithfilenameandextparam
  726. val = "attachment; foo=\"bar\"; filename=\"foo.html\"";
  727. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  728. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  729. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  730. std::string(&dest[0], &dest[8]));
  731. // attwithfilenameandextparamescaped
  732. val = "attachment; foo=\"\\\"\\\\\";filename=\"foo.html\"";
  733. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  734. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  735. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  736. std::string(&dest[0], &dest[8]));
  737. // attwithasciifilenameucase
  738. val = "attachment; FILENAME=\"foo.html\"";
  739. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  740. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  741. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  742. std::string(&dest[0], &dest[8]));
  743. // attwithasciifilenamenq
  744. val = "attachment; filename=foo.html";
  745. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  746. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  747. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  748. std::string(&dest[0], &dest[8]));
  749. // attwithtokfncommanq
  750. val = "attachment; filename=foo,bar.html";
  751. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  752. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  753. // attwithasciifilenamenqs
  754. val = "attachment; filename=foo.html ;";
  755. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  756. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  757. // attemptyparam
  758. val = "attachment; ;filename=foo";
  759. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  760. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  761. // attwithasciifilenamenqws
  762. val = "attachment; filename=foo bar.html";
  763. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  764. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  765. // attwithfntokensq
  766. val = "attachment; filename='foo.bar'";
  767. CPPUNIT_ASSERT_EQUAL((ssize_t)9, util::parse_content_disposition
  768. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  769. CPPUNIT_ASSERT_EQUAL(std::string("'foo.bar'"),
  770. std::string(&dest[0], &dest[9]));
  771. // attwithisofnplain
  772. // attachment; filename="foo-ä.html"
  773. val = "attachment; filename=\"foo-%E4.html\"";
  774. val = util::percentDecode(val.begin(), val.end());
  775. CPPUNIT_ASSERT_EQUAL((ssize_t)10, util::parse_content_disposition
  776. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  777. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  778. util::iso8859p1ToUtf8(std::string(&dest[0], &dest[10])));
  779. // attwithutf8fnplain
  780. // attachment; filename="foo-ä.html"
  781. val = "attachment; filename=\"foo-%C3%A4.html\"";
  782. val = util::percentDecode(val.begin(), val.end());
  783. CPPUNIT_ASSERT_EQUAL((ssize_t)11, util::parse_content_disposition
  784. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  785. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  786. util::iso8859p1ToUtf8(std::string(&dest[0], &dest[11])));
  787. // attwithfnrawpctenca
  788. val = "attachment; filename=\"foo-%41.html\"";
  789. CPPUNIT_ASSERT_EQUAL((ssize_t)12, util::parse_content_disposition
  790. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  791. CPPUNIT_ASSERT_EQUAL(std::string("foo-%41.html"),
  792. std::string(&dest[0], &dest[12]));
  793. // attwithfnusingpct
  794. val = "attachment; filename=\"50%.html\"";
  795. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  796. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  797. CPPUNIT_ASSERT_EQUAL(std::string("50%.html"),
  798. std::string(&dest[0], &dest[8]));
  799. // attwithfnrawpctencaq
  800. val = "attachment; filename=\"foo-%\\41.html\"";
  801. CPPUNIT_ASSERT_EQUAL((ssize_t)12, util::parse_content_disposition
  802. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  803. CPPUNIT_ASSERT_EQUAL(std::string("foo-%41.html"),
  804. std::string(&dest[0], &dest[12]));
  805. // attwithnamepct
  806. val = "attachment; name=\"foo-%41.html\"";
  807. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  808. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  809. // attwithfilenamepctandiso
  810. // attachment; filename="ä-%41.html"
  811. val = "attachment; filename=\"%E4-%2541.html\"";
  812. val = util::percentDecode(val.begin(), val.end());
  813. CPPUNIT_ASSERT_EQUAL((ssize_t)10, util::parse_content_disposition
  814. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  815. CPPUNIT_ASSERT_EQUAL(std::string("ä-%41.html"),
  816. util::iso8859p1ToUtf8(std::string(&dest[0], &dest[10])));
  817. // attwithfnrawpctenclong
  818. val = "attachment; filename=\"foo-%c3%a4-%e2%82%ac.html\"";
  819. CPPUNIT_ASSERT_EQUAL((ssize_t)25, util::parse_content_disposition
  820. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  821. CPPUNIT_ASSERT_EQUAL(std::string("foo-%c3%a4-%e2%82%ac.html"),
  822. std::string(&dest[0], &dest[25]));
  823. // attwithasciifilenamews1
  824. val = "attachment; filename =\"foo.html\"";
  825. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  826. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  827. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  828. std::string(&dest[0], &dest[8]));
  829. // attwith2filenames
  830. val = "attachment; filename=\"foo.html\"; filename=\"bar.html\"";
  831. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  832. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  833. // attfnbrokentoken
  834. val = "attachment; filename=foo[1](2).html";
  835. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  836. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  837. // attfnbrokentokeniso
  838. val = "attachment; filename=foo-%E4.html";
  839. val = util::percentDecode(val.begin(), val.end());
  840. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  841. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  842. // attfnbrokentokenutf
  843. // attachment; filename=foo-ä.html
  844. val = "attachment; filename=foo-ä.html";
  845. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  846. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  847. // attmissingdisposition
  848. val = "filename=foo.html";
  849. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  850. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  851. // attmissingdisposition2
  852. val = "x=y; filename=foo.html";
  853. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  854. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  855. // attmissingdisposition3
  856. val = "\"foo; filename=bar;baz\"; filename=qux";
  857. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  858. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  859. // attmissingdisposition4
  860. val = "filename=foo.html, filename=bar.html";
  861. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  862. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  863. // emptydisposition
  864. val = "; filename=foo.html";
  865. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  866. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  867. // doublecolon
  868. val = ": inline; attachment; filename=foo.html";
  869. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  870. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  871. // attandinline
  872. val = "inline; attachment; filename=foo.html";
  873. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  874. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  875. // attandinline2
  876. val = "attachment; inline; filename=foo.html";
  877. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  878. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  879. // attbrokenquotedfn
  880. val = "attachment; filename=\"foo.html\".txt";
  881. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  882. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  883. // attbrokenquotedfn2
  884. val = "attachment; filename=\"bar";
  885. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  886. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  887. // attbrokenquotedfn3
  888. val = "attachment; filename=foo\"bar;baz\"qux";
  889. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  890. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  891. // attmultinstances
  892. val = "attachment; filename=foo.html, attachment; filename=bar.html";
  893. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  894. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  895. }
  896. void UtilTest1::testParseContentDisposition2() {
  897. char dest[1_k];
  898. size_t destlen = sizeof(dest);
  899. const char *cs;
  900. size_t cslen;
  901. std::string val;
  902. // test cases from http://greenbytes.de/tech/tc2231/
  903. // attmissingdelim
  904. val = "attachment; foo=foo filename=bar";
  905. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  906. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  907. // attmissingdelim2
  908. val = "attachment; filename=bar foo=foo ";
  909. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  910. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  911. // attmissingdelim3
  912. val = "attachment filename=bar";
  913. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  914. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  915. // attreversed
  916. val = "filename=foo.html; attachment";
  917. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  918. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  919. // attconfusedparam
  920. val = "attachment; xfilename=foo.html";
  921. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  922. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  923. // attabspath
  924. val = "attachment; filename=\"/foo.html\"";
  925. CPPUNIT_ASSERT_EQUAL((ssize_t)9, util::parse_content_disposition
  926. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  927. CPPUNIT_ASSERT_EQUAL(std::string("/foo.html"),
  928. std::string(&dest[0], &dest[9]));
  929. // attabspathwin
  930. val = "attachment; filename=\"\\\\foo.html\"";
  931. CPPUNIT_ASSERT_EQUAL((ssize_t)9, util::parse_content_disposition
  932. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  933. CPPUNIT_ASSERT_EQUAL(std::string("\\foo.html"),
  934. std::string(&dest[0], &dest[9]));
  935. // attcdate
  936. val = "attachment; creation-date=\"Wed, 12 Feb 1997 16:29:51 -0500\"";
  937. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  938. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  939. // dispext
  940. val = "foobar";
  941. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  942. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  943. // dispextbadfn
  944. val = "attachment; example=\"filename=example.txt\"";
  945. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  946. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  947. // attwithisofn2231iso
  948. val = "attachment; filename*=iso-8859-1''foo-%E4.html";
  949. CPPUNIT_ASSERT_EQUAL((ssize_t)10, util::parse_content_disposition
  950. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  951. CPPUNIT_ASSERT_EQUAL(std::string("iso-8859-1"), std::string(cs, cslen));
  952. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  953. util::iso8859p1ToUtf8(std::string(&dest[0], &dest[10])));
  954. // attwithfn2231utf8
  955. val = "attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html";
  956. CPPUNIT_ASSERT_EQUAL((ssize_t)15, util::parse_content_disposition
  957. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  958. CPPUNIT_ASSERT_EQUAL(std::string("UTF-8"), std::string(cs, cslen));
  959. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä-€.html"),
  960. std::string(&dest[0], &dest[15]));
  961. // attwithfn2231noc
  962. val = "attachment; filename*=''foo-%c3%a4-%e2%82%ac.html";
  963. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  964. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  965. // attwithfn2231utf8comp
  966. val = "attachment; filename*=UTF-8''foo-a%cc%88.html";
  967. CPPUNIT_ASSERT_EQUAL((ssize_t)12, util::parse_content_disposition
  968. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  969. val = "foo-a%cc%88.html";
  970. CPPUNIT_ASSERT_EQUAL(std::string(util::percentDecode(val.begin(),
  971. val.end())),
  972. std::string(&dest[0], &dest[12]));
  973. // attwithfn2231utf8-bad
  974. val = "attachment; filename*=iso-8859-1''foo-%c3%a4-%e2%82%ac.html";
  975. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  976. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  977. // attwithfn2231iso-bad
  978. val = "attachment; filename*=utf-8''foo-%E4.html";
  979. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  980. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  981. // attwithfn2231ws1
  982. val = "attachment; filename *=UTF-8''foo-%c3%a4.html";
  983. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  984. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  985. // attwithfn2231ws2
  986. val = "attachment; filename*= UTF-8''foo-%c3%a4.html";
  987. CPPUNIT_ASSERT_EQUAL((ssize_t)11, util::parse_content_disposition
  988. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  989. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  990. std::string(&dest[0], &dest[11]));
  991. // attwithfn2231ws3
  992. val = "attachment; filename* =UTF-8''foo-%c3%a4.html";
  993. CPPUNIT_ASSERT_EQUAL((ssize_t)11, util::parse_content_disposition
  994. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  995. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  996. std::string(&dest[0], &dest[11]));
  997. // attwithfn2231quot
  998. val = "attachment; filename*=\"UTF-8''foo-%c3%a4.html\"";
  999. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1000. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1001. // attwithfn2231quot2
  1002. val = "attachment; filename*=\"foo%20bar.html\"";
  1003. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1004. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1005. // attwithfn2231singleqmissing
  1006. val = "attachment; filename*=UTF-8'foo-%c3%a4.html";
  1007. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1008. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1009. // attwithfn2231nbadpct1
  1010. val = "attachment; filename*=UTF-8''foo%";
  1011. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1012. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1013. // attwithfn2231nbadpct2
  1014. val = "attachment; filename*=UTF-8''f%oo.html";
  1015. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1016. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1017. // attwithfn2231dpct
  1018. val = "attachment; filename*=UTF-8''A-%2541.html";
  1019. CPPUNIT_ASSERT_EQUAL((ssize_t)10, util::parse_content_disposition
  1020. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1021. CPPUNIT_ASSERT_EQUAL(std::string("A-%41.html"),
  1022. std::string(&dest[0], &dest[10]));
  1023. // attwithfn2231abspathdisguised
  1024. val = "attachment; filename*=UTF-8''%5cfoo.html";
  1025. CPPUNIT_ASSERT_EQUAL((ssize_t)9, util::parse_content_disposition
  1026. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1027. CPPUNIT_ASSERT_EQUAL(std::string("\\foo.html"),
  1028. std::string(&dest[0], &dest[9]));
  1029. // attfnboth
  1030. val = "attachment; filename=\"foo-ae.html\"; filename*=UTF-8''foo-%c3%a4.html";
  1031. CPPUNIT_ASSERT_EQUAL((ssize_t)11, util::parse_content_disposition
  1032. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1033. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  1034. std::string(&dest[0], &dest[11]));
  1035. // attfnboth2
  1036. val = "attachment; filename*=UTF-8''foo-%c3%a4.html; filename=\"foo-ae.html\"";
  1037. CPPUNIT_ASSERT_EQUAL((ssize_t)11, util::parse_content_disposition
  1038. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1039. CPPUNIT_ASSERT_EQUAL(std::string("foo-ä.html"),
  1040. std::string(&dest[0], &dest[11]));
  1041. // attfnboth3
  1042. val = "attachment; filename*0*=ISO-8859-15''euro-sign%3d%a4; filename*=ISO-8859-1''currency-sign%3d%a4";
  1043. CPPUNIT_ASSERT_EQUAL((ssize_t)15, util::parse_content_disposition
  1044. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1045. CPPUNIT_ASSERT_EQUAL(std::string("ISO-8859-1"), std::string(cs, cslen));
  1046. CPPUNIT_ASSERT_EQUAL(std::string("currency-sign=¤"),
  1047. util::iso8859p1ToUtf8(std::string(&dest[0], &dest[15])));
  1048. // attnewandfn
  1049. val = "attachment; foobar=x; filename=\"foo.html\"";
  1050. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1051. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1052. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1053. std::string(&dest[0], &dest[8]));
  1054. // attrfc2047token
  1055. val = "attachment; filename==?ISO-8859-1?Q?foo-=E4.html?=";
  1056. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1057. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1058. // attrfc2047quoted
  1059. val = "attachment; filename=\"=?ISO-8859-1?Q?foo-=E4.html?=\"";
  1060. CPPUNIT_ASSERT_EQUAL((ssize_t)29, util::parse_content_disposition
  1061. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1062. CPPUNIT_ASSERT_EQUAL(std::string("=?ISO-8859-1?Q?foo-=E4.html?="),
  1063. std::string(&dest[0], &dest[29]));
  1064. // aria2 original testcases
  1065. // zero-length filename. token cannot be empty, so this is invalid.
  1066. val = "attachment; filename=";
  1067. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1068. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1069. // zero-length filename. quoted-string can be empty string, so this
  1070. // is ok.
  1071. val = "attachment; filename=\"\"";
  1072. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  1073. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1074. // empty value is not allowed
  1075. val = "attachment; filename=;";
  1076. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1077. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1078. // / is not valid char in token.
  1079. val = "attachment; filename=dir/file";
  1080. CPPUNIT_ASSERT_EQUAL((ssize_t)-1, util::parse_content_disposition
  1081. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1082. // value-chars is *(pct-encoded / attr-char), so empty string is
  1083. // allowed.
  1084. val = "attachment; filename*=UTF-8''";
  1085. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  1086. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1087. CPPUNIT_ASSERT_EQUAL(std::string("UTF-8"), std::string(cs, cslen));
  1088. val = "attachment; filename*=UTF-8''; filename=foo";
  1089. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  1090. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1091. CPPUNIT_ASSERT_EQUAL(std::string("UTF-8"), std::string(cs, cslen));
  1092. val = "attachment; filename*=UTF-8'' ; filename=foo";
  1093. CPPUNIT_ASSERT_EQUAL((ssize_t)0, util::parse_content_disposition
  1094. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1095. CPPUNIT_ASSERT_EQUAL(std::string("UTF-8"), std::string(cs, cslen));
  1096. // with language
  1097. val = "attachment; filename*=UTF-8'japanese'konnichiwa";
  1098. CPPUNIT_ASSERT_EQUAL((ssize_t)10, util::parse_content_disposition
  1099. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1100. CPPUNIT_ASSERT_EQUAL(std::string("konnichiwa"),
  1101. std::string(&dest[0], &dest[10]));
  1102. // lws before and after "="
  1103. val = "attachment; filename = foo.html";
  1104. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1105. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1106. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1107. std::string(&dest[0], &dest[8]));
  1108. // lws before and after "=" with quoted-string
  1109. val = "attachment; filename = \"foo.html\"";
  1110. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1111. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1112. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1113. std::string(&dest[0], &dest[8]));
  1114. // lws after parm
  1115. val = "attachment; filename=foo.html ";
  1116. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1117. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1118. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1119. std::string(&dest[0], &dest[8]));
  1120. val = "attachment; filename=foo.html ; hello=world";
  1121. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1122. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1123. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1124. std::string(&dest[0], &dest[8]));
  1125. val = "attachment; filename=\"foo.html\" ";
  1126. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1127. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1128. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1129. std::string(&dest[0], &dest[8]));
  1130. val = "attachment; filename=\"foo.html\" ; hello=world";
  1131. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1132. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1133. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1134. std::string(&dest[0], &dest[8]));
  1135. val = "attachment; filename*=UTF-8''foo.html ; hello=world";
  1136. CPPUNIT_ASSERT_EQUAL((ssize_t)8, util::parse_content_disposition
  1137. (dest, destlen, &cs, &cslen, val.c_str(), val.size()));
  1138. CPPUNIT_ASSERT_EQUAL(std::string("foo.html"),
  1139. std::string(&dest[0], &dest[8]));
  1140. }
  1141. } // namespace aria2