HttpTest.C 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * Copyright (C) 2009 Emweb bvba, Kessel-Lo, Belgium.
  3. *
  4. * See the LICENSE file for terms of use.
  5. */
  6. #include <boost/test/unit_test.hpp>
  7. #include "Wt/Http/Request"
  8. using namespace Wt::Http;
  9. BOOST_AUTO_TEST_CASE( http_rangeTest1 )
  10. {
  11. // These are all tests wo filesize
  12. Request::ByteRangeSpecifier ranges;
  13. // Basic tests
  14. ranges = Request::getRanges("bytes=0-24", -1);
  15. BOOST_REQUIRE(ranges.size() == 1);
  16. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  17. BOOST_REQUIRE(ranges[0].lastByte() == 24);
  18. BOOST_REQUIRE(ranges.isSatisfiable());
  19. ranges = Request::getRanges("bytes=1-2, 15-18, 600-900", -1);
  20. BOOST_REQUIRE(ranges.size() == 3);
  21. BOOST_REQUIRE(ranges[0].firstByte() == 1);
  22. BOOST_REQUIRE(ranges[0].lastByte() == 2);
  23. BOOST_REQUIRE(ranges[1].firstByte() == 15);
  24. BOOST_REQUIRE(ranges[1].lastByte() == 18);
  25. BOOST_REQUIRE(ranges[2].firstByte() == 600);
  26. BOOST_REQUIRE(ranges[2].lastByte() == 900);
  27. BOOST_REQUIRE(ranges.isSatisfiable());
  28. // Till end-of-file...
  29. ranges = Request::getRanges("bytes=100-", -1);
  30. BOOST_REQUIRE(ranges.size() == 1);
  31. BOOST_REQUIRE(ranges[0].firstByte() == 100);
  32. BOOST_REQUIRE(ranges[0].lastByte() == std::numeric_limits< ::uint64_t>::max());
  33. BOOST_REQUIRE(ranges.isSatisfiable());
  34. // suffix-byte-range-spec. When filesize is unknown, this does
  35. // not make sense
  36. ranges = Request::getRanges("bytes=-100", -1);
  37. BOOST_REQUIRE(ranges.size() == 0);
  38. BOOST_REQUIRE(ranges.isSatisfiable());
  39. // examples from the RFC
  40. ranges = Request::getRanges("bytes=0-499", -1);
  41. BOOST_REQUIRE(ranges.size() == 1);
  42. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  43. BOOST_REQUIRE(ranges[0].lastByte() == 499);
  44. BOOST_REQUIRE(ranges.isSatisfiable());
  45. ranges = Request::getRanges("bytes=500-999", -1);
  46. BOOST_REQUIRE(ranges.size() == 1);
  47. BOOST_REQUIRE(ranges[0].firstByte() == 500);
  48. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  49. BOOST_REQUIRE(ranges.isSatisfiable());
  50. ranges = Request::getRanges("bytes=-500", -1);
  51. BOOST_REQUIRE(ranges.size() == 0);
  52. BOOST_REQUIRE(ranges.isSatisfiable());
  53. ranges = Request::getRanges("bytes=9500-", -1);
  54. BOOST_REQUIRE(ranges.size() == 1);
  55. BOOST_REQUIRE(ranges[0].firstByte() == 9500);
  56. BOOST_REQUIRE(ranges[0].lastByte() == std::numeric_limits< ::uint64_t>::max());
  57. BOOST_REQUIRE(ranges.isSatisfiable());
  58. ranges = Request::getRanges("bytes=0-0,-1", -1);
  59. BOOST_REQUIRE(ranges.size() == 0);
  60. BOOST_REQUIRE(ranges.isSatisfiable());
  61. ranges = Request::getRanges("bytes=500-600,601-999", -1);
  62. BOOST_REQUIRE(ranges.size() == 2);
  63. BOOST_REQUIRE(ranges[0].firstByte() == 500);
  64. BOOST_REQUIRE(ranges[0].lastByte() == 600);
  65. BOOST_REQUIRE(ranges[1].firstByte() == 601);
  66. BOOST_REQUIRE(ranges[1].lastByte() == 999);
  67. BOOST_REQUIRE(ranges.isSatisfiable());
  68. ranges = Request::getRanges("bytes=500-700,601-999", -1);
  69. BOOST_REQUIRE(ranges.size() == 2);
  70. BOOST_REQUIRE(ranges[0].firstByte() == 500);
  71. BOOST_REQUIRE(ranges[0].lastByte() == 700);
  72. BOOST_REQUIRE(ranges[1].firstByte() == 601);
  73. BOOST_REQUIRE(ranges[1].lastByte() == 999);
  74. BOOST_REQUIRE(ranges.isSatisfiable());
  75. // Whitespace test
  76. ranges = Request::getRanges(" bytes = 0 - 2 ", -1);
  77. BOOST_REQUIRE(ranges.size() == 1);
  78. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  79. BOOST_REQUIRE(ranges[0].lastByte() == 2);
  80. BOOST_REQUIRE(ranges.isSatisfiable());
  81. ranges = Request::getRanges("\tbytes\t=\t0\t-\t2\t", -1);
  82. BOOST_REQUIRE(ranges.size() == 1);
  83. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  84. BOOST_REQUIRE(ranges[0].lastByte() == 2);
  85. BOOST_REQUIRE(ranges.isSatisfiable());
  86. // 'Syntax error' tests
  87. // Starting with some obvious ones
  88. ranges = Request::getRanges("bytes==1,2", -1);
  89. BOOST_REQUIRE(ranges.size() == 0);
  90. BOOST_REQUIRE(ranges.isSatisfiable());
  91. ranges = Request::getRanges("1-2=bytes", -1);
  92. BOOST_REQUIRE(ranges.size() == 0);
  93. BOOST_REQUIRE(ranges.isSatisfiable());
  94. ranges = Request::getRanges("bytes=1-2;", -1);
  95. BOOST_REQUIRE(ranges.size() == 0);
  96. BOOST_REQUIRE(ranges.isSatisfiable());
  97. ranges = Request::getRanges("bytes=1-2-3", -1);
  98. BOOST_REQUIRE(ranges.size() == 0);
  99. BOOST_REQUIRE(ranges.isSatisfiable());
  100. ranges = Request::getRanges("bytes=1,2,3", -1);
  101. BOOST_REQUIRE(ranges.size() == 0);
  102. BOOST_REQUIRE(ranges.isSatisfiable());
  103. ranges = Request::getRanges("octets=1-2", -1);
  104. BOOST_REQUIRE(ranges.size() == 0);
  105. BOOST_REQUIRE(ranges.isSatisfiable());
  106. ranges = Request::getRanges("bytes=0-1,a-b", -1);
  107. BOOST_REQUIRE(ranges.size() == 0);
  108. BOOST_REQUIRE(ranges.isSatisfiable());
  109. ranges = Request::getRanges("bytes=-", -1);
  110. BOOST_REQUIRE(ranges.size() == 0);
  111. BOOST_REQUIRE(ranges.isSatisfiable());
  112. // Explicitly mentioned in the RFC as 'syntactically invalid'
  113. ranges = Request::getRanges("bytes=2-0", -1);
  114. BOOST_REQUIRE(ranges.size() == 0);
  115. BOOST_REQUIRE(ranges.isSatisfiable());
  116. // One invalid range = ignore the complete Range header
  117. ranges = Request::getRanges("bytes=1-2,2-0", -1);
  118. BOOST_REQUIRE(ranges.size() == 0);
  119. BOOST_REQUIRE(ranges.isSatisfiable());
  120. }
  121. BOOST_AUTO_TEST_CASE( http_rangeTest2 )
  122. {
  123. Request::ByteRangeSpecifier ranges;
  124. // Queries past end of file
  125. ranges = Request::getRanges("bytes=10-2000", 1000);
  126. BOOST_REQUIRE(ranges.size() == 1);
  127. BOOST_REQUIRE(ranges[0].firstByte() == 10);
  128. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  129. BOOST_REQUIRE(ranges.isSatisfiable());
  130. ranges = Request::getRanges("bytes=999-2000", 1000);
  131. BOOST_REQUIRE(ranges.size() == 1);
  132. BOOST_REQUIRE(ranges[0].firstByte() == 999);
  133. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  134. BOOST_REQUIRE(ranges.isSatisfiable());
  135. // To the end of file
  136. ranges = Request::getRanges("bytes=100-", 1000);
  137. BOOST_REQUIRE(ranges.size() == 1);
  138. BOOST_REQUIRE(ranges[0].firstByte() == 100);
  139. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  140. BOOST_REQUIRE(ranges.isSatisfiable());
  141. //cornercase queries
  142. ranges = Request::getRanges("bytes=10-999", 1000);
  143. BOOST_REQUIRE(ranges.size() == 1);
  144. BOOST_REQUIRE(ranges[0].firstByte() == 10);
  145. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  146. BOOST_REQUIRE(ranges.isSatisfiable());
  147. ranges = Request::getRanges("bytes=-1000", 1000);
  148. BOOST_REQUIRE(ranges.size() == 1);
  149. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  150. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  151. BOOST_REQUIRE(ranges.isSatisfiable());
  152. // suffix-byte-range-spec. When filesize is unknown, this does
  153. // not make sense
  154. ranges = Request::getRanges("bytes=-100", 1000);
  155. BOOST_REQUIRE(ranges.size() == 1);
  156. BOOST_REQUIRE(ranges[0].firstByte() == 900);
  157. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  158. BOOST_REQUIRE(ranges.isSatisfiable());
  159. ranges = Request::getRanges("bytes=-2000", 1000);
  160. BOOST_REQUIRE(ranges.size() == 1);
  161. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  162. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  163. BOOST_REQUIRE(ranges.isSatisfiable());
  164. ranges = Request::getRanges("bytes=-2000", 0);
  165. BOOST_REQUIRE(ranges.size() == 0); //??
  166. BOOST_REQUIRE(!ranges.isSatisfiable());
  167. ranges = Request::getRanges("bytes=-0", 0);
  168. BOOST_REQUIRE(ranges.size() == 0);
  169. BOOST_REQUIRE(!ranges.isSatisfiable());
  170. ranges = Request::getRanges("bytes=-0", 100);
  171. BOOST_REQUIRE(ranges.size() == 0);
  172. BOOST_REQUIRE(!ranges.isSatisfiable());
  173. // examples from the RFC
  174. ranges = Request::getRanges("bytes=0-499", 10000);
  175. BOOST_REQUIRE(ranges.size() == 1);
  176. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  177. BOOST_REQUIRE(ranges[0].lastByte() == 499);
  178. BOOST_REQUIRE(ranges.isSatisfiable());
  179. ranges = Request::getRanges("bytes=500-999", 10000);
  180. BOOST_REQUIRE(ranges.size() == 1);
  181. BOOST_REQUIRE(ranges[0].firstByte() == 500);
  182. BOOST_REQUIRE(ranges[0].lastByte() == 999);
  183. BOOST_REQUIRE(ranges.isSatisfiable());
  184. ranges = Request::getRanges("bytes=-500", 10000);
  185. BOOST_REQUIRE(ranges.size() == 1);
  186. BOOST_REQUIRE(ranges[0].firstByte() == 9500);
  187. BOOST_REQUIRE(ranges[0].lastByte() == 9999);
  188. BOOST_REQUIRE(ranges.isSatisfiable());
  189. ranges = Request::getRanges("bytes=9500-", 10000);
  190. BOOST_REQUIRE(ranges.size() == 1);
  191. BOOST_REQUIRE(ranges[0].firstByte() == 9500);
  192. BOOST_REQUIRE(ranges[0].lastByte() == 9999);
  193. BOOST_REQUIRE(ranges.isSatisfiable());
  194. ranges = Request::getRanges("bytes=0-0,-1", 10000);
  195. BOOST_REQUIRE(ranges.size() == 2);
  196. BOOST_REQUIRE(ranges[0].firstByte() == 0);
  197. BOOST_REQUIRE(ranges[0].lastByte() == 0);
  198. BOOST_REQUIRE(ranges[1].firstByte() == 9999);
  199. BOOST_REQUIRE(ranges[1].lastByte() == 9999);
  200. BOOST_REQUIRE(ranges.isSatisfiable());
  201. ranges = Request::getRanges("bytes=500-600,601-999", 10000);
  202. BOOST_REQUIRE(ranges.size() == 2);
  203. BOOST_REQUIRE(ranges[0].firstByte() == 500);
  204. BOOST_REQUIRE(ranges[0].lastByte() == 600);
  205. BOOST_REQUIRE(ranges[1].firstByte() == 601);
  206. BOOST_REQUIRE(ranges[1].lastByte() == 999);
  207. BOOST_REQUIRE(ranges.isSatisfiable());
  208. ranges = Request::getRanges("bytes=500-700,601-999", 10000);
  209. BOOST_REQUIRE(ranges.size() == 2);
  210. BOOST_REQUIRE(ranges[0].firstByte() == 500);
  211. BOOST_REQUIRE(ranges[0].lastByte() == 700);
  212. BOOST_REQUIRE(ranges[1].firstByte() == 601);
  213. BOOST_REQUIRE(ranges[1].lastByte() == 999);
  214. BOOST_REQUIRE(ranges.isSatisfiable());
  215. }