HttpHeaderTest.cc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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(testFieldContains);
  12. CPPUNIT_TEST(testRemove);
  13. CPPUNIT_TEST_SUITE_END();
  14. public:
  15. void testGetRange();
  16. void testFindAll();
  17. void testClearField();
  18. void testFieldContains();
  19. void testRemove();
  20. };
  21. CPPUNIT_TEST_SUITE_REGISTRATION( HttpHeaderTest );
  22. void HttpHeaderTest::testGetRange()
  23. {
  24. {
  25. HttpHeader httpHeader;
  26. httpHeader.put(HttpHeader::CONTENT_RANGE,
  27. "9223372036854775800-9223372036854775801/9223372036854775807");
  28. Range range = httpHeader.getRange();
  29. CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775800LL, range.startByte);
  30. CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775801LL, range.endByte);
  31. CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775807LL, range.entityLength);
  32. }
  33. {
  34. HttpHeader httpHeader;
  35. httpHeader.put(HttpHeader::CONTENT_RANGE,
  36. "9223372036854775800-9223372036854775801/9223372036854775807");
  37. Range range = httpHeader.getRange();
  38. CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775800LL, range.startByte);
  39. CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775801LL, range.endByte);
  40. CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775807LL, range.entityLength);
  41. }
  42. {
  43. HttpHeader httpHeader;
  44. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes */1024");
  45. Range range = httpHeader.getRange();
  46. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.startByte);
  47. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.endByte);
  48. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.entityLength);
  49. }
  50. {
  51. HttpHeader httpHeader;
  52. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes 0-9/*");
  53. Range range = httpHeader.getRange();
  54. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.startByte);
  55. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.endByte);
  56. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.entityLength);
  57. }
  58. {
  59. HttpHeader httpHeader;
  60. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes */*");
  61. Range range = httpHeader.getRange();
  62. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.startByte);
  63. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.endByte);
  64. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.entityLength);
  65. }
  66. {
  67. HttpHeader httpHeader;
  68. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes 0");
  69. Range range = httpHeader.getRange();
  70. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.startByte);
  71. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.endByte);
  72. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.entityLength);
  73. }
  74. {
  75. HttpHeader httpHeader;
  76. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes 0/");
  77. Range range = httpHeader.getRange();
  78. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.startByte);
  79. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.endByte);
  80. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.entityLength);
  81. }
  82. {
  83. // Support for non-compliant server
  84. HttpHeader httpHeader;
  85. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes=0-1023/1024");
  86. Range range = httpHeader.getRange();
  87. CPPUNIT_ASSERT_EQUAL((int64_t)0, range.startByte);
  88. CPPUNIT_ASSERT_EQUAL((int64_t)1023, range.endByte);
  89. CPPUNIT_ASSERT_EQUAL((int64_t)1024, range.entityLength);
  90. }
  91. {
  92. HttpHeader httpHeader;
  93. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes 0-/3");
  94. try {
  95. httpHeader.getRange();
  96. CPPUNIT_FAIL("Exception must be thrown");
  97. } catch(const DlAbortEx& e) {
  98. // success
  99. }
  100. }
  101. {
  102. HttpHeader httpHeader;
  103. httpHeader.put(HttpHeader::CONTENT_RANGE, "bytes -0/3");
  104. try {
  105. httpHeader.getRange();
  106. CPPUNIT_FAIL("Exception must be thrown");
  107. } catch(const DlAbortEx& e) {
  108. // success
  109. }
  110. }
  111. }
  112. void HttpHeaderTest::testFindAll()
  113. {
  114. HttpHeader h;
  115. h.put(HttpHeader::LINK, "100");
  116. h.put(HttpHeader::LINK, "101");
  117. h.put(HttpHeader::CONNECTION, "200");
  118. std::vector<std::string> r(h.findAll(HttpHeader::LINK));
  119. CPPUNIT_ASSERT_EQUAL((size_t)2, r.size());
  120. CPPUNIT_ASSERT_EQUAL(std::string("100"), r[0]);
  121. CPPUNIT_ASSERT_EQUAL(std::string("101"), r[1]);
  122. }
  123. void HttpHeaderTest::testClearField()
  124. {
  125. HttpHeader h;
  126. h.setStatusCode(200);
  127. h.setVersion("HTTP/1.1");
  128. h.put(HttpHeader::LINK, "Bar");
  129. CPPUNIT_ASSERT_EQUAL(std::string("Bar"), h.find(HttpHeader::LINK));
  130. h.clearField();
  131. CPPUNIT_ASSERT_EQUAL(std::string(""), h.find(HttpHeader::LINK));
  132. CPPUNIT_ASSERT_EQUAL(200, h.getStatusCode());
  133. CPPUNIT_ASSERT_EQUAL(std::string("HTTP/1.1"), h.getVersion());
  134. }
  135. void HttpHeaderTest::testFieldContains()
  136. {
  137. HttpHeader h;
  138. h.put(HttpHeader::CONNECTION, "Keep-Alive, Upgrade");
  139. h.put(HttpHeader::UPGRADE, "WebSocket");
  140. h.put(HttpHeader::SEC_WEBSOCKET_VERSION, "13");
  141. h.put(HttpHeader::SEC_WEBSOCKET_VERSION, "8, 7");
  142. CPPUNIT_ASSERT(h.fieldContains(HttpHeader::CONNECTION, "upgrade"));
  143. CPPUNIT_ASSERT(h.fieldContains(HttpHeader::CONNECTION, "keep-alive"));
  144. CPPUNIT_ASSERT(!h.fieldContains(HttpHeader::CONNECTION, "close"));
  145. CPPUNIT_ASSERT(h.fieldContains(HttpHeader::UPGRADE, "websocket"));
  146. CPPUNIT_ASSERT(!h.fieldContains(HttpHeader::UPGRADE, "spdy"));
  147. CPPUNIT_ASSERT(h.fieldContains(HttpHeader::SEC_WEBSOCKET_VERSION, "13"));
  148. CPPUNIT_ASSERT(h.fieldContains(HttpHeader::SEC_WEBSOCKET_VERSION, "8"));
  149. CPPUNIT_ASSERT(!h.fieldContains(HttpHeader::SEC_WEBSOCKET_VERSION, "6"));
  150. }
  151. void HttpHeaderTest::testRemove()
  152. {
  153. HttpHeader h;
  154. h.put(HttpHeader::CONNECTION, "close");
  155. h.put(HttpHeader::TRANSFER_ENCODING, "chunked");
  156. h.put(HttpHeader::TRANSFER_ENCODING, "gzip");
  157. h.remove(HttpHeader::TRANSFER_ENCODING);
  158. CPPUNIT_ASSERT(!h.defined(HttpHeader::TRANSFER_ENCODING));
  159. CPPUNIT_ASSERT(h.defined(HttpHeader::CONNECTION));
  160. }
  161. } // namespace aria2