aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/http/io/headers.h
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/http/io/headers.h
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/http/io/headers.h')
-rw-r--r--library/cpp/http/io/headers.h125
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_;
+};
+
+/// @}