Просмотр исходного кода

Add THttpHeaders constructor from TArrayRef
351519c01d45a22beceb491029a8f516619673a0

vadim-xd 11 месяцев назад
Родитель
Сommit
ea11c4b61e

+ 1 - 0
library/cpp/http/io/compression.h

@@ -4,6 +4,7 @@
 
 #include <util/generic/deque.h>
 #include <util/generic/hash.h>
+#include <util/generic/vector.h>
 
 class TCompressionCodecFactory {
 public:

+ 7 - 0
library/cpp/http/io/headers.cpp

@@ -66,6 +66,13 @@ THttpHeaders::THttpHeaders(IInputStream* stream) {
     }
 }
 
+THttpHeaders::THttpHeaders(TArrayRef<const THttpInputHeader> headers) {
+    for (const auto& header : headers) {
+        AddHeader(header);
+    }
+}
+
+
 bool THttpHeaders::HasHeader(const TStringBuf header) const {
     return FindHeader(header);
 }

+ 7 - 2
library/cpp/http/io/headers.h

@@ -1,9 +1,10 @@
 #pragma once
 
+#include <util/generic/array_ref.h>
+#include <util/generic/deque.h>
 #include <util/generic/string.h>
 #include <util/generic/strbuf.h>
-#include <util/generic/deque.h>
-#include <util/generic/vector.h>
+#include <util/generic/vector.h>  // XXX unused - remove after fixing transitive includes.
 #include <util/string/cast.h>
 
 class IInputStream;
@@ -65,6 +66,10 @@ public:
     /// Добавляет каждую строку из потока в контейнер, считая ее правильным заголовком.
     THttpHeaders(IInputStream* stream);
 
+    /// Создаёт контейнер из initializer-list'а или массива/вектора хедеров.
+    /// Пример: `THttpHeaders headers({{"Host", "example.com"}});`
+    THttpHeaders(TArrayRef<const THttpInputHeader> headers);
+
     /// Стандартный итератор.
     inline TConstIterator Begin() const noexcept {
         return Headers_.begin();

+ 22 - 0
library/cpp/http/io/headers_ut.cpp

@@ -44,6 +44,7 @@ bool operator==(const THttpHeaders& lhs, const THeadersExistence& rhs) {
 
 class THttpHeadersTest: public TTestBase {
     UNIT_TEST_SUITE(THttpHeadersTest);
+    UNIT_TEST(TestConstructorFromArrayRef);
     UNIT_TEST(TestAddOperation1Arg);
     UNIT_TEST(TestAddOperation2Args);
     UNIT_TEST(TestAddOrReplaceOperation1Arg);
@@ -57,6 +58,7 @@ private:
     typedef void (*TAddOrReplaceHeaderFunction)(THttpHeaders&, TStringBuf name, TStringBuf value);
 
 public:
+    void TestConstructorFromArrayRef();
     void TestAddOperation1Arg();
     void TestAddOperation2Args();
     void TestAddOrReplaceOperation1Arg();
@@ -87,6 +89,26 @@ private:
 
 UNIT_TEST_SUITE_REGISTRATION(THttpHeadersTest);
 
+void THttpHeadersTest::TestConstructorFromArrayRef() {
+    THeadersExistence expected;
+    expected.Add("h1", "v1");
+    expected.Add("h2", "v2");
+
+    // Construct from vector
+    TVector<THttpInputHeader> headerVec{
+        {"h1", "v1"},
+        {"h2", "v2"}
+    };
+    THttpHeaders h1(headerVec);
+    UNIT_ASSERT(expected == h1);
+
+    // Construct from initializer list
+    THttpHeaders h2({
+        {"h1", "v1"},
+        {"h2", "v2"}
+    });
+    UNIT_ASSERT(expected == h2);
+}
 void THttpHeadersTest::TestAddOperation1Arg() {
     DoTestAddOperation(AddHeaderImpl1Arg);
 }

+ 1 - 0
library/cpp/http/server/response.cpp

@@ -1,5 +1,6 @@
 #include "response.h"
 
+#include <util/generic/vector.h>
 #include <util/stream/output.h>
 #include <util/stream/mem.h>
 #include <util/string/cast.h>