فهرست منبع

Supported multi-line HTTP header field value.

See http://tools.ietf.org/html/rfc2616#section-4.2
Tatsuhiro Tsujikawa 14 سال پیش
والد
کامیت
1d71626bea
2فایلهای تغییر یافته به همراه47 افزوده شده و 6 حذف شده
  1. 16 5
      src/HttpHeader.cc
  2. 31 1
      test/HttpHeaderTest.cc

+ 16 - 5
src/HttpHeader.cc

@@ -193,14 +193,25 @@ void HttpHeader::setRequestPath(const std::string& requestPath)
 void HttpHeader::fill(std::istream& in)
 {
   std::string line;
-  while(std::getline(in, line)) {
+  std::getline(in, line);
+  while(in) {
     line = util::strip(line);
     if(line.empty()) {
-      continue;
+      std::getline(in, line);
+    } else {
+      std::pair<std::string, std::string> hp;
+      util::divide(hp, line, ':');
+      while(std::getline(in, line)) {
+        if(!line.empty() && (line[0] == ' ' || line[0] == '\t')) {
+          line = util::strip(line);
+          hp.second += " ";
+          hp.second += line;
+        } else {
+          break;
+        }
+      }
+      put(hp.first, hp.second);
     }
-    std::pair<std::string, std::string> hp;
-    util::divide(hp, line, ':');
-    put(hp.first, hp.second);
   }
 }
 

+ 31 - 1
test/HttpHeaderTest.cc

@@ -1,7 +1,11 @@
 #include "HttpHeader.h"
-#include "Range.h"
+
+#include <sstream>
+
 #include <cppunit/extensions/HelperMacros.h>
 
+#include "Range.h"
+
 namespace aria2 {
 
 class HttpHeaderTest:public CppUnit::TestFixture {
@@ -10,12 +14,14 @@ class HttpHeaderTest:public CppUnit::TestFixture {
   CPPUNIT_TEST(testGetRange);
   CPPUNIT_TEST(testGet);
   CPPUNIT_TEST(testClearField);
+  CPPUNIT_TEST(testFill);
   CPPUNIT_TEST_SUITE_END();
   
 public:
   void testGetRange();
   void testGet();
   void testClearField();
+  void testFill();
 };
 
 
@@ -96,4 +102,28 @@ void HttpHeaderTest::testClearField()
   CPPUNIT_ASSERT_EQUAL(std::string(HttpHeader::HTTP_1_1), h.getVersion());
 }
 
+void HttpHeaderTest::testFill()
+{
+  std::stringstream ss;
+  ss << "Host: aria2.sourceforge.net\r\n"
+     << "Connection: close \r\n" // trailing white space
+     << "Multi-Line: text1\r\n"
+     << "  text2\r\n"
+     << "  text3\r\n"
+     << "Duplicate: foo\r\n"
+     << "Duplicate: bar\r\n";
+  HttpHeader h;
+  h.fill(ss);
+  CPPUNIT_ASSERT_EQUAL(std::string("aria2.sourceforge.net"),
+                       h.getFirst("Host"));
+  CPPUNIT_ASSERT_EQUAL(std::string("close"),
+                       h.getFirst("Connection"));
+  CPPUNIT_ASSERT_EQUAL(std::string("text1 text2 text3"),
+                       h.getFirst("Multi-Line"));
+  CPPUNIT_ASSERT_EQUAL(std::string("foo"),
+                       h.get("Duplicate")[0]);
+  CPPUNIT_ASSERT_EQUAL(std::string("bar"),
+                       h.get("Duplicate")[1]);
+}
+
 } // namespace aria2