headers.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #pragma once
  2. #include <util/generic/string.h>
  3. #include <util/generic/strbuf.h>
  4. #include <util/generic/deque.h>
  5. #include <util/generic/vector.h>
  6. #include <util/string/cast.h>
  7. class IInputStream;
  8. class IOutputStream;
  9. /// @addtogroup Streams_HTTP
  10. /// @{
  11. /// Объект, содержащий информацию о HTTP-заголовке.
  12. class THttpInputHeader {
  13. public:
  14. THttpInputHeader() = delete;
  15. THttpInputHeader(const THttpInputHeader&) = default;
  16. THttpInputHeader(THttpInputHeader&&) = default;
  17. THttpInputHeader& operator=(const THttpInputHeader&) = default;
  18. THttpInputHeader& operator=(THttpInputHeader&&) = default;
  19. /// @param[in] header - строка вида 'параметр: значение'.
  20. THttpInputHeader(TStringBuf header);
  21. /// @param[in] name - имя параметра.
  22. /// @param[in] value - значение параметра.
  23. THttpInputHeader(TString name, TString value);
  24. /// Возвращает имя параметра.
  25. inline const TString& Name() const noexcept {
  26. return Name_;
  27. }
  28. /// Возвращает значение параметра.
  29. inline const TString& Value() const noexcept {
  30. return Value_;
  31. }
  32. /// Записывает заголовок вида "имя параметра: значение\r\n" в поток.
  33. void OutTo(IOutputStream* stream) const;
  34. /// Возвращает строку "имя параметра: значение".
  35. inline TString ToString() const {
  36. return Name_ + TStringBuf(": ") + Value_;
  37. }
  38. private:
  39. TString Name_;
  40. TString Value_;
  41. };
  42. /// Контейнер для хранения HTTP-заголовков
  43. class THttpHeaders {
  44. using THeaders = TDeque<THttpInputHeader>;
  45. public:
  46. using TConstIterator = THeaders::const_iterator;
  47. THttpHeaders() = default;
  48. THttpHeaders(const THttpHeaders&) = default;
  49. THttpHeaders& operator=(const THttpHeaders&) = default;
  50. THttpHeaders(THttpHeaders&&) = default;
  51. THttpHeaders& operator=(THttpHeaders&&) = default;
  52. /// Добавляет каждую строку из потока в контейнер, считая ее правильным заголовком.
  53. THttpHeaders(IInputStream* stream);
  54. /// Стандартный итератор.
  55. inline TConstIterator Begin() const noexcept {
  56. return Headers_.begin();
  57. }
  58. inline TConstIterator begin() const noexcept {
  59. return Headers_.begin();
  60. }
  61. /// Стандартный итератор.
  62. inline TConstIterator End() const noexcept {
  63. return Headers_.end();
  64. }
  65. inline TConstIterator end() const noexcept {
  66. return Headers_.end();
  67. }
  68. /// Возвращает количество заголовков в контейнере.
  69. inline size_t Count() const noexcept {
  70. return Headers_.size();
  71. }
  72. /// Проверяет, содержит ли контейнер хотя бы один заголовок.
  73. inline bool Empty() const noexcept {
  74. return Headers_.empty();
  75. }
  76. /// Добавляет заголовок в контейнер.
  77. void AddHeader(THttpInputHeader header);
  78. template <typename ValueType>
  79. void AddHeader(TString name, const ValueType& value) {
  80. AddHeader(THttpInputHeader(std::move(name), ToString(value)));
  81. }
  82. /// Добавляет заголовок в контейнер, если тот не содержит заголовка
  83. /// c таким же параметром. В противном случае, заменяет существующий
  84. /// заголовок на новый.
  85. void AddOrReplaceHeader(const THttpInputHeader& header);
  86. template <typename ValueType>
  87. void AddOrReplaceHeader(TString name, const ValueType& value) {
  88. AddOrReplaceHeader(THttpInputHeader(std::move(name), ToString(value)));
  89. }
  90. // Проверяет, есть ли такой заголовок
  91. bool HasHeader(TStringBuf header) const;
  92. /// Удаляет заголовок, если он есть.
  93. void RemoveHeader(TStringBuf header);
  94. /// Ищет заголовок по указанному имени
  95. /// Возвращает nullptr, если не нашел
  96. const THttpInputHeader* FindHeader(TStringBuf header) const;
  97. /// Записывает все заголовки контейнера в поток.
  98. /// @details Каждый заголовк записывается в виде "имя параметра: значение\r\n".
  99. void OutTo(IOutputStream* stream) const;
  100. /// Обменивает наборы заголовков двух контейнеров.
  101. void Swap(THttpHeaders& headers) noexcept {
  102. Headers_.swap(headers.Headers_);
  103. }
  104. private:
  105. THeaders Headers_;
  106. };
  107. /// @}