From ea11c4b61ef4e491c701847533ff93d3de81f127 Mon Sep 17 00:00:00 2001 From: vadim-xd Date: Tue, 16 Apr 2024 09:38:35 +0300 Subject: Add THttpHeaders constructor from TArrayRef 351519c01d45a22beceb491029a8f516619673a0 --- library/cpp/http/io/compression.h | 1 + library/cpp/http/io/headers.cpp | 7 +++++++ library/cpp/http/io/headers.h | 9 +++++++-- library/cpp/http/io/headers_ut.cpp | 22 ++++++++++++++++++++++ library/cpp/http/server/response.cpp | 1 + 5 files changed, 38 insertions(+), 2 deletions(-) (limited to 'library/cpp/http') diff --git a/library/cpp/http/io/compression.h b/library/cpp/http/io/compression.h index f16c4a18ebb..038ac47629b 100644 --- a/library/cpp/http/io/compression.h +++ b/library/cpp/http/io/compression.h @@ -4,6 +4,7 @@ #include #include +#include class TCompressionCodecFactory { public: diff --git a/library/cpp/http/io/headers.cpp b/library/cpp/http/io/headers.cpp index f2baf640218..3f3a5a2d07d 100644 --- a/library/cpp/http/io/headers.cpp +++ b/library/cpp/http/io/headers.cpp @@ -66,6 +66,13 @@ THttpHeaders::THttpHeaders(IInputStream* stream) { } } +THttpHeaders::THttpHeaders(TArrayRef headers) { + for (const auto& header : headers) { + AddHeader(header); + } +} + + bool THttpHeaders::HasHeader(const TStringBuf header) const { return FindHeader(header); } diff --git a/library/cpp/http/io/headers.h b/library/cpp/http/io/headers.h index cfb4a9c054e..3ae40683e2d 100644 --- a/library/cpp/http/io/headers.h +++ b/library/cpp/http/io/headers.h @@ -1,9 +1,10 @@ #pragma once +#include +#include #include #include -#include -#include +#include // XXX unused - remove after fixing transitive includes. #include class IInputStream; @@ -65,6 +66,10 @@ public: /// Добавляет каждую строку из потока в контейнер, считая ее правильным заголовком. THttpHeaders(IInputStream* stream); + /// Создаёт контейнер из initializer-list'а или массива/вектора хедеров. + /// Пример: `THttpHeaders headers({{"Host", "example.com"}});` + THttpHeaders(TArrayRef headers); + /// Стандартный итератор. inline TConstIterator Begin() const noexcept { return Headers_.begin(); diff --git a/library/cpp/http/io/headers_ut.cpp b/library/cpp/http/io/headers_ut.cpp index 1d23ef8fdcb..6205efb1544 100644 --- a/library/cpp/http/io/headers_ut.cpp +++ b/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 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); } diff --git a/library/cpp/http/server/response.cpp b/library/cpp/http/server/response.cpp index 52d64c91cec..ff4d3e07f35 100644 --- a/library/cpp/http/server/response.cpp +++ b/library/cpp/http/server/response.cpp @@ -1,5 +1,6 @@ #include "response.h" +#include #include #include #include -- cgit v1.3