HttpHeaderTest.cc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "HttpHeader.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "Range.h"
  4. #include "DlAbortEx.h"
  5. namespace aria2 {
  6. class HttpHeaderTest:public CppUnit::TestFixture {
  7. CPPUNIT_TEST_SUITE(HttpHeaderTest);
  8. CPPUNIT_TEST(testGetRange);
  9. CPPUNIT_TEST(testFindAll);
  10. CPPUNIT_TEST(testClearField);
  11. CPPUNIT_TEST(testFill);
  12. CPPUNIT_TEST(testFieldContains);
  13. CPPUNIT_TEST_SUITE_END();
  14. public:
  15. void testGetRange();
  16. void testFindAll();
  17. void testClearField();
  18. void testFill();
  19. void testFieldContains();
  20. };
  21. CPPUNIT_TEST_SUITE_REGISTRATION( HttpHeaderTest );
  22. void HttpHeaderTest::testGetRange()
  23. {
  24. {
  25. HttpHeader httpHeader;
  26. httpHeader.put("content-range",
  27. "9223372036854775800-9223372036854775801/9223372036854775807");
  28. SharedHandle<Range> range = httpHeader.getRange();
  29. CPPUNIT_ASSERT_EQUAL((off_t)9223372036854775800LL, range->getStartByte());
  30. CPPUNIT_ASSERT_EQUAL((off_t)9223372036854775801LL, range->getEndByte());
  31. CPPUNIT_ASSERT_EQUAL((off_t)9223372036854775807LL, range->getEntityLength());
  32. }
  33. {
  34. HttpHeader httpHeader;
  35. httpHeader.put("content-range",
  36. "9223372036854775800-9223372036854775801/9223372036854775807");
  37. SharedHandle<Range> range = httpHeader.getRange();
  38. CPPUNIT_ASSERT_EQUAL((off_t)9223372036854775800LL, range->getStartByte());
  39. CPPUNIT_ASSERT_EQUAL((off_t)9223372036854775801LL, range->getEndByte());
  40. CPPUNIT_ASSERT_EQUAL((off_t)9223372036854775807LL, range->getEntityLength());
  41. }
  42. {
  43. HttpHeader httpHeader;
  44. httpHeader.put("content-range", "bytes */1024");
  45. SharedHandle<Range> range = httpHeader.getRange();
  46. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getStartByte());
  47. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEndByte());
  48. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEntityLength());
  49. }
  50. {
  51. HttpHeader httpHeader;
  52. httpHeader.put("content-range", "bytes 0-9/*");
  53. SharedHandle<Range> range = httpHeader.getRange();
  54. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getStartByte());
  55. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEndByte());
  56. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEntityLength());
  57. }
  58. {
  59. HttpHeader httpHeader;
  60. httpHeader.put("content-range", "bytes */*");
  61. SharedHandle<Range> range = httpHeader.getRange();
  62. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getStartByte());
  63. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEndByte());
  64. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEntityLength());
  65. }
  66. {
  67. HttpHeader httpHeader;
  68. httpHeader.put("content-range", "bytes 0");
  69. SharedHandle<Range> range = httpHeader.getRange();
  70. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getStartByte());
  71. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEndByte());
  72. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEntityLength());
  73. }
  74. {
  75. HttpHeader httpHeader;
  76. httpHeader.put("content-range", "bytes 0/");
  77. SharedHandle<Range> range = httpHeader.getRange();
  78. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getStartByte());
  79. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEndByte());
  80. CPPUNIT_ASSERT_EQUAL((off_t)0, range->getEntityLength());
  81. }
  82. {
  83. HttpHeader httpHeader;
  84. httpHeader.put("content-range", "bytes 0-/3");
  85. try {
  86. httpHeader.getRange();
  87. CPPUNIT_FAIL("Exception must be thrown");
  88. } catch(const DlAbortEx& e) {
  89. // success
  90. }
  91. }
  92. {
  93. HttpHeader httpHeader;
  94. httpHeader.put("content-range", "bytes -0/3");
  95. try {
  96. httpHeader.getRange();
  97. CPPUNIT_FAIL("Exception must be thrown");
  98. } catch(const DlAbortEx& e) {
  99. // success
  100. }
  101. }
  102. }
  103. void HttpHeaderTest::testFindAll()
  104. {
  105. HttpHeader h;
  106. h.put("A", "100");
  107. h.put("A", "101");
  108. h.put("B", "200");
  109. std::vector<std::string> r(h.findAll("A"));
  110. CPPUNIT_ASSERT_EQUAL((size_t)2, r.size());
  111. CPPUNIT_ASSERT_EQUAL(std::string("100"), r[0]);
  112. CPPUNIT_ASSERT_EQUAL(std::string("101"), r[1]);
  113. }
  114. void HttpHeaderTest::testClearField()
  115. {
  116. HttpHeader h;
  117. h.setStatusCode(200);
  118. h.setVersion(HttpHeader::HTTP_1_1);
  119. h.put("Foo", "Bar");
  120. CPPUNIT_ASSERT_EQUAL(std::string("Bar"), h.find("Foo"));
  121. h.clearField();
  122. CPPUNIT_ASSERT_EQUAL(std::string(""), h.find("Foo"));
  123. CPPUNIT_ASSERT_EQUAL(200, h.getStatusCode());
  124. CPPUNIT_ASSERT_EQUAL(std::string(HttpHeader::HTTP_1_1), h.getVersion());
  125. }
  126. void HttpHeaderTest::testFill()
  127. {
  128. std::string s =
  129. "Host: aria2.sourceforge.net\r\n"
  130. "Connection: close \r\n" // trailing white space
  131. "Multi-Line: text1\r\n"
  132. " text2\r\n"
  133. " text3\r\n"
  134. "Duplicate: foo\r\n"
  135. "Duplicate: bar\r\n";
  136. HttpHeader h;
  137. h.fill(s.begin(), s.end());
  138. CPPUNIT_ASSERT_EQUAL(std::string("aria2.sourceforge.net"),
  139. h.find("host"));
  140. CPPUNIT_ASSERT_EQUAL(std::string("close"),
  141. h.find("connection"));
  142. CPPUNIT_ASSERT_EQUAL(std::string("text1 text2 text3"),
  143. h.find("multi-line"));
  144. CPPUNIT_ASSERT_EQUAL(std::string("foo"),
  145. h.findAll("duplicate")[0]);
  146. CPPUNIT_ASSERT_EQUAL(std::string("bar"),
  147. h.findAll("duplicate")[1]);
  148. }
  149. void HttpHeaderTest::testFieldContains()
  150. {
  151. HttpHeader h;
  152. h.put("connection", "Keep-Alive, Upgrade");
  153. h.put("upgrade", "WebSocket");
  154. h.put("sec-websocket-version", "13");
  155. h.put("sec-websocket-version", "8, 7");
  156. CPPUNIT_ASSERT(h.fieldContains("connection", "upgrade"));
  157. CPPUNIT_ASSERT(h.fieldContains("connection", "keep-alive"));
  158. CPPUNIT_ASSERT(!h.fieldContains("connection", "close"));
  159. CPPUNIT_ASSERT(h.fieldContains("upgrade", "websocket"));
  160. CPPUNIT_ASSERT(!h.fieldContains("upgrade", "spdy"));
  161. CPPUNIT_ASSERT(h.fieldContains("sec-websocket-version", "13"));
  162. CPPUNIT_ASSERT(h.fieldContains("sec-websocket-version", "8"));
  163. CPPUNIT_ASSERT(!h.fieldContains("sec-websocket-version", "6"));
  164. }
  165. } // namespace aria2