56class ResponseDataAccounter
final {
58 void StartRequest(std::size_t size, std::chrono::steady_clock::time_point create_time);
60 void StopRequest(std::size_t size, std::chrono::steady_clock::time_point create_time);
62 std::size_t GetPendingResponsesSizeInBytes()
const {
return pending_responses_size_in_bytes_; }
64 std::size_t GetMaxPendingResponsesSizeInBytes()
const {
return max_pending_responses_size_in_bytes_; }
66 void SetMaxPendingResponsesSizeInBytes(size_t size) { max_pending_responses_size_in_bytes_ = size; }
68 std::chrono::milliseconds GetAvgRequestTime()
const;
71 std::atomic<std::size_t> pending_responses_size_in_bytes_{0};
72 std::atomic<std::size_t> max_pending_responses_size_in_bytes_{std::numeric_limits<std::size_t>::max()};
82 explicit ResponseBase(ResponseDataAccounter& data_accounter);
85 virtual ~ResponseBase()
noexcept;
87 void SetData(std::string data);
88 const std::string& GetData()
const {
return data_; }
89 std::string&& ExtractData() {
return std::move(data_); }
91 virtual bool IsBodyStreamed()
const = 0;
92 virtual bool WaitForHeadersEnd() = 0;
93 virtual void SetHeadersEnd() = 0;
98 void SetReady(std::chrono::steady_clock::time_point now);
99 virtual void SetSendFailed(std::chrono::steady_clock::time_point failure_time);
100 bool IsLimitReached()
const;
102 bool IsReady()
const {
return is_ready_; }
103 bool IsSent()
const noexcept {
return is_sent_; }
104 size_t BytesSent()
const {
return bytes_sent_; }
105 std::chrono::steady_clock::time_point ReadyTime()
const {
return ready_time_; }
106 std::chrono::steady_clock::time_point SentTime()
const {
return sent_time_; }
107 virtual void SendResponse(engine::
io::
RwBase& socket) = 0;
109 virtual void SetStatusServiceUnavailable() = 0;
110 virtual void SetStatusOk() = 0;
111 virtual void SetStatusNotFound() = 0;
114 void SetStreamId(std::int32_t stream_id);
115 std::optional<std::int32_t> GetStreamId()
const {
return stream_id_; }
116 void SetStreamProdicer(
http::impl::Http2StreamEventProducer&& producer);
117 http::impl::Http2StreamEventProducer GetStreamProducer();
121 ResponseBase(ResponseDataAccounter& data_account, std::chrono::steady_clock::time_point now);
123 void SetSent(std::size_t bytes_sent, std::chrono::steady_clock::time_point sent_time);
128 Guard(ResponseDataAccounter& accounter, std::chrono::steady_clock::time_point create_time, size_t size)
129 : accounter_(accounter),
130 create_time_(create_time),
133 accounter_.StartRequest(size_, create_time_);
136 ~Guard() { accounter_.StopRequest(size_, create_time_); }
139 ResponseDataAccounter& accounter_;
140 std::chrono::steady_clock::time_point create_time_;
144 ResponseDataAccounter& accounter_;
145 std::optional<Guard> guard_;
147 std::chrono::steady_clock::time_point create_time_;
148 std::chrono::steady_clock::time_point ready_time_;
149 std::chrono::steady_clock::time_point sent_time_;
150 size_t bytes_sent_ = 0;
151 bool is_ready_ =
false;
152 bool is_sent_ =
false;
153 std::optional<std::int32_t> stream_id_;
154 std::optional<
http::impl::Http2StreamEventProducer> producer_{};