headers.h 4.3 KB

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