diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/http/io/headers.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/http/io/headers.h')
-rw-r--r-- | library/cpp/http/io/headers.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/library/cpp/http/io/headers.h b/library/cpp/http/io/headers.h new file mode 100644 index 0000000000..a71793d1c6 --- /dev/null +++ b/library/cpp/http/io/headers.h @@ -0,0 +1,125 @@ +#pragma once + +#include <util/generic/string.h> +#include <util/generic/strbuf.h> +#include <util/generic/deque.h> +#include <util/generic/vector.h> +#include <util/string/cast.h> + +class IInputStream; +class IOutputStream; + +/// @addtogroup Streams_HTTP +/// @{ +/// Объект, содержащий информацию о HTTP-заголовке. +class THttpInputHeader { +public: + /// @param[in] header - строка вида 'параметр: значение'. + THttpInputHeader(TStringBuf header); + /// @param[in] name - имя параметра. + /// @param[in] value - значение параметра. + THttpInputHeader(TString name, TString value); + + /// Возвращает имя параметра. + inline const TString& Name() const noexcept { + return Name_; + } + + /// Возвращает значение параметра. + inline const TString& Value() const noexcept { + return Value_; + } + + /// Записывает заголовок вида "имя параметра: значение\r\n" в поток. + void OutTo(IOutputStream* stream) const; + + /// Возвращает строку "имя параметра: значение". + inline TString ToString() const { + return Name_ + TStringBuf(": ") + Value_; + } + +private: + TString Name_; + TString Value_; +}; + +/// Контейнер для хранения HTTP-заголовков +class THttpHeaders { + using THeaders = TDeque<THttpInputHeader>; + +public: + using TConstIterator = THeaders::const_iterator; + + THttpHeaders() = default; + + /// Добавляет каждую строку из потока в контейнер, считая ее правильным заголовком. + THttpHeaders(IInputStream* stream); + + /// Стандартный итератор. + inline TConstIterator Begin() const noexcept { + return Headers_.begin(); + } + inline TConstIterator begin() const noexcept { + return Headers_.begin(); + } + + /// Стандартный итератор. + inline TConstIterator End() const noexcept { + return Headers_.end(); + } + inline TConstIterator end() const noexcept { + return Headers_.end(); + } + + /// Возвращает количество заголовков в контейнере. + inline size_t Count() const noexcept { + return Headers_.size(); + } + + /// Проверяет, содержит ли контейнер хотя бы один заголовок. + inline bool Empty() const noexcept { + return Headers_.empty(); + } + + /// Добавляет заголовок в контейнер. + void AddHeader(THttpInputHeader header); + + template <typename ValueType> + void AddHeader(TString name, const ValueType& value) { + AddHeader(THttpInputHeader(std::move(name), ToString(value))); + } + + /// Добавляет заголовок в контейнер, если тот не содержит заголовка + /// c таким же параметром. В противном случае, заменяет существующий + /// заголовок на новый. + void AddOrReplaceHeader(const THttpInputHeader& header); + + template <typename ValueType> + void AddOrReplaceHeader(TString name, const ValueType& value) { + AddOrReplaceHeader(THttpInputHeader(std::move(name), ToString(value))); + } + + // Проверяет, есть ли такой заголовок + bool HasHeader(TStringBuf header) const; + + /// Удаляет заголовок, если он есть. + void RemoveHeader(TStringBuf header); + + /// Ищет заголовок по указанному имени + /// Возвращает nullptr, если не нашел + const THttpInputHeader* FindHeader(TStringBuf header) const; + + /// Записывает все заголовки контейнера в поток. + /// @details Каждый заголовк записывается в виде "имя параметра: значение\r\n". + void OutTo(IOutputStream* stream) const; + + /// Обменивает наборы заголовков двух контейнеров. + void Swap(THttpHeaders& headers) noexcept { + Headers_.swap(headers.Headers_); + } + +private: + THeaders Headers_; +}; + +/// @} |