56class ResponseDataAccounter
final {
58 void StartRequest(std::chrono::steady_clock::time_point create_time);
60 void StopRequest(std::size_t size, std::chrono::steady_clock::time_point create_time);
62 void ReaccountRequest(
64 std::chrono::steady_clock::time_point old_create_time,
66 std::chrono::steady_clock::time_point new_create_time
69 std::size_t GetPendingResponsesSizeInBytes()
const {
return pending_responses_size_in_bytes_; }
71 std::size_t GetPendingResponsesCount()
const {
return pending_responses_count_
.NonNegativeRead(); }
73 std::size_t GetMaxPendingResponsesSizeInBytes()
const {
return max_pending_responses_size_in_bytes_; }
75 void SetMaxPendingResponsesSizeInBytes(size_t size) { max_pending_responses_size_in_bytes_ = size; }
77 std::chrono::milliseconds GetAvgRequestTime()
const;
80 std::atomic<std::size_t> pending_responses_size_in_bytes_{0};
81 std::atomic<std::size_t> max_pending_responses_size_in_bytes_{std::numeric_limits<std::size_t>::max()};
91 explicit ResponseBase(ResponseDataAccounter& data_accounter);
94 virtual ~ResponseBase()
noexcept;
96 void SetData(std::string data);
97 const std::string& GetData()
const {
return data_; }
98 std::string&& ExtractData() {
return std::move(data_); }
100 virtual bool IsBodyStreamed()
const = 0;
101 virtual bool WaitForHeadersEnd() = 0;
102 virtual void SetHeadersEnd() = 0;
107 void SetReady(std::chrono::steady_clock::time_point now);
108 virtual void SetSendFailed(std::chrono::steady_clock::time_point failure_time);
109 bool IsLimitReached()
const;
111 bool IsReady()
const {
return ready_time_ != kUnset; }
112 bool IsSent()
const noexcept {
return sent_time_ != kUnset; }
113 size_t BytesSent()
const {
return bytes_sent_; }
114 std::chrono::steady_clock::time_point ReadyTime()
const {
return ready_time_; }
115 std::chrono::steady_clock::time_point SentTime()
const {
return sent_time_; }
116 virtual void SendResponse(engine::
io::
RwBase& socket) = 0;
118 virtual void SetStatusServiceUnavailable() = 0;
119 virtual void SetStatusOk() = 0;
120 virtual void SetStatusNotFound() = 0;
123 void SetStreamId(std::int32_t stream_id);
124 std::optional<std::int32_t> GetStreamId()
const {
return stream_id_; }
125 void SetStreamProdicer(
http::impl::Http2StreamEventProducer&& producer);
126 http::impl::Http2StreamEventProducer GetStreamProducer();
130 ResponseBase(ResponseDataAccounter& data_account, std::chrono::steady_clock::time_point now);
132 void SetSent(std::size_t bytes_sent, std::chrono::steady_clock::time_point sent_time);
135 static constexpr auto kUnset = std::chrono::steady_clock::time_point::min();
137 ResponseDataAccounter& accounter_;
139 std::chrono::steady_clock::time_point create_time_;
140 std::chrono::steady_clock::time_point ready_time_{kUnset};
141 std::chrono::steady_clock::time_point sent_time_{kUnset};
142 std::size_t accounted_size_ = 0;
143 size_t bytes_sent_ = 0;
144 std::optional<std::int32_t> stream_id_;
145 std::optional<
http::impl::Http2StreamEventProducer> producer_{};