From 1d71626bea62f10e723609e32dce46fb86179749 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Thu, 20 Jan 2011 00:25:01 +0900 Subject: [PATCH] Supported multi-line HTTP header field value. See http://tools.ietf.org/html/rfc2616#section-4.2 --- src/HttpHeader.cc | 21 ++++++++++++++++----- test/HttpHeaderTest.cc | 32 +++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/HttpHeader.cc b/src/HttpHeader.cc index 9e191ab1..a4158dff 100644 --- a/src/HttpHeader.cc +++ b/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 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 hp; - util::divide(hp, line, ':'); - put(hp.first, hp.second); } } diff --git a/test/HttpHeaderTest.cc b/test/HttpHeaderTest.cc index 93a6064f..baef6d00 100644 --- a/test/HttpHeaderTest.cc +++ b/test/HttpHeaderTest.cc @@ -1,7 +1,11 @@ #include "HttpHeader.h" -#include "Range.h" + +#include + #include +#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