xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/http2/adapter/oghttp2_adapter.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 #include "quiche/http2/adapter/oghttp2_adapter.h"
2 
3 #include <memory>
4 
5 #include "absl/memory/memory.h"
6 #include "absl/strings/str_cat.h"
7 #include "quiche/http2/adapter/http2_util.h"
8 #include "quiche/common/platform/api/quiche_bug_tracker.h"
9 #include "quiche/spdy/core/spdy_protocol.h"
10 
11 namespace http2 {
12 namespace adapter {
13 
14 namespace {
15 
16 using spdy::SpdyGoAwayIR;
17 using spdy::SpdyPingIR;
18 using spdy::SpdyPriorityIR;
19 using spdy::SpdyWindowUpdateIR;
20 
21 }  // namespace
22 
23 /* static */
Create(Http2VisitorInterface & visitor,Options options)24 std::unique_ptr<OgHttp2Adapter> OgHttp2Adapter::Create(
25     Http2VisitorInterface& visitor, Options options) {
26   // Using `new` to access a non-public constructor.
27   return absl::WrapUnique(new OgHttp2Adapter(visitor, std::move(options)));
28 }
29 
~OgHttp2Adapter()30 OgHttp2Adapter::~OgHttp2Adapter() {}
31 
IsServerSession() const32 bool OgHttp2Adapter::IsServerSession() const {
33   return session_->IsServerSession();
34 }
35 
ProcessBytes(absl::string_view bytes)36 int64_t OgHttp2Adapter::ProcessBytes(absl::string_view bytes) {
37   return session_->ProcessBytes(bytes);
38 }
39 
SubmitSettings(absl::Span<const Http2Setting> settings)40 void OgHttp2Adapter::SubmitSettings(absl::Span<const Http2Setting> settings) {
41   session_->SubmitSettings(settings);
42 }
43 
SubmitPriorityForStream(Http2StreamId stream_id,Http2StreamId parent_stream_id,int weight,bool exclusive)44 void OgHttp2Adapter::SubmitPriorityForStream(Http2StreamId stream_id,
45                                              Http2StreamId parent_stream_id,
46                                              int weight, bool exclusive) {
47   session_->EnqueueFrame(std::make_unique<SpdyPriorityIR>(
48       stream_id, parent_stream_id, weight, exclusive));
49 }
50 
SubmitPing(Http2PingId ping_id)51 void OgHttp2Adapter::SubmitPing(Http2PingId ping_id) {
52   session_->EnqueueFrame(std::make_unique<SpdyPingIR>(ping_id));
53 }
54 
SubmitShutdownNotice()55 void OgHttp2Adapter::SubmitShutdownNotice() {
56   session_->StartGracefulShutdown();
57 }
58 
SubmitGoAway(Http2StreamId last_accepted_stream_id,Http2ErrorCode error_code,absl::string_view opaque_data)59 void OgHttp2Adapter::SubmitGoAway(Http2StreamId last_accepted_stream_id,
60                                   Http2ErrorCode error_code,
61                                   absl::string_view opaque_data) {
62   session_->EnqueueFrame(std::make_unique<SpdyGoAwayIR>(
63       last_accepted_stream_id, TranslateErrorCode(error_code),
64       std::string(opaque_data)));
65 }
SubmitWindowUpdate(Http2StreamId stream_id,int window_increment)66 void OgHttp2Adapter::SubmitWindowUpdate(Http2StreamId stream_id,
67                                         int window_increment) {
68   session_->EnqueueFrame(
69       std::make_unique<SpdyWindowUpdateIR>(stream_id, window_increment));
70 }
71 
SubmitMetadata(Http2StreamId stream_id,size_t,std::unique_ptr<MetadataSource> source)72 void OgHttp2Adapter::SubmitMetadata(Http2StreamId stream_id,
73                                     size_t /* max_frame_size */,
74                                     std::unique_ptr<MetadataSource> source) {
75   // Not necessary to pass max_frame_size along, since OgHttp2Session tracks the
76   // peer's advertised max frame size.
77   session_->SubmitMetadata(stream_id, std::move(source));
78 }
79 
Send()80 int OgHttp2Adapter::Send() { return session_->Send(); }
81 
GetSendWindowSize() const82 int OgHttp2Adapter::GetSendWindowSize() const {
83   return session_->GetRemoteWindowSize();
84 }
85 
GetStreamSendWindowSize(Http2StreamId stream_id) const86 int OgHttp2Adapter::GetStreamSendWindowSize(Http2StreamId stream_id) const {
87   return session_->GetStreamSendWindowSize(stream_id);
88 }
89 
GetStreamReceiveWindowLimit(Http2StreamId stream_id) const90 int OgHttp2Adapter::GetStreamReceiveWindowLimit(Http2StreamId stream_id) const {
91   return session_->GetStreamReceiveWindowLimit(stream_id);
92 }
93 
GetStreamReceiveWindowSize(Http2StreamId stream_id) const94 int OgHttp2Adapter::GetStreamReceiveWindowSize(Http2StreamId stream_id) const {
95   return session_->GetStreamReceiveWindowSize(stream_id);
96 }
97 
GetReceiveWindowSize() const98 int OgHttp2Adapter::GetReceiveWindowSize() const {
99   return session_->GetReceiveWindowSize();
100 }
101 
GetHpackEncoderDynamicTableSize() const102 int OgHttp2Adapter::GetHpackEncoderDynamicTableSize() const {
103   return session_->GetHpackEncoderDynamicTableSize();
104 }
105 
GetHpackEncoderDynamicTableCapacity() const106 int OgHttp2Adapter::GetHpackEncoderDynamicTableCapacity() const {
107   return session_->GetHpackEncoderDynamicTableCapacity();
108 }
109 
GetHpackDecoderDynamicTableSize() const110 int OgHttp2Adapter::GetHpackDecoderDynamicTableSize() const {
111   return session_->GetHpackDecoderDynamicTableSize();
112 }
113 
GetHpackDecoderSizeLimit() const114 int OgHttp2Adapter::GetHpackDecoderSizeLimit() const {
115   return session_->GetHpackDecoderSizeLimit();
116 }
117 
GetHighestReceivedStreamId() const118 Http2StreamId OgHttp2Adapter::GetHighestReceivedStreamId() const {
119   return session_->GetHighestReceivedStreamId();
120 }
121 
MarkDataConsumedForStream(Http2StreamId stream_id,size_t num_bytes)122 void OgHttp2Adapter::MarkDataConsumedForStream(Http2StreamId stream_id,
123                                                size_t num_bytes) {
124   session_->Consume(stream_id, num_bytes);
125 }
126 
SubmitRst(Http2StreamId stream_id,Http2ErrorCode error_code)127 void OgHttp2Adapter::SubmitRst(Http2StreamId stream_id,
128                                Http2ErrorCode error_code) {
129   session_->EnqueueFrame(std::make_unique<spdy::SpdyRstStreamIR>(
130       stream_id, TranslateErrorCode(error_code)));
131 }
132 
SubmitRequest(absl::Span<const Header> headers,std::unique_ptr<DataFrameSource> data_source,void * user_data)133 int32_t OgHttp2Adapter::SubmitRequest(
134     absl::Span<const Header> headers,
135     std::unique_ptr<DataFrameSource> data_source, void* user_data) {
136   return session_->SubmitRequest(headers, std::move(data_source), user_data);
137 }
138 
SubmitResponse(Http2StreamId stream_id,absl::Span<const Header> headers,std::unique_ptr<DataFrameSource> data_source)139 int OgHttp2Adapter::SubmitResponse(
140     Http2StreamId stream_id, absl::Span<const Header> headers,
141     std::unique_ptr<DataFrameSource> data_source) {
142   return session_->SubmitResponse(stream_id, headers, std::move(data_source));
143 }
144 
SubmitTrailer(Http2StreamId stream_id,absl::Span<const Header> trailers)145 int OgHttp2Adapter::SubmitTrailer(Http2StreamId stream_id,
146                                   absl::Span<const Header> trailers) {
147   return session_->SubmitTrailer(stream_id, trailers);
148 }
149 
SetStreamUserData(Http2StreamId stream_id,void * user_data)150 void OgHttp2Adapter::SetStreamUserData(Http2StreamId stream_id,
151                                        void* user_data) {
152   session_->SetStreamUserData(stream_id, user_data);
153 }
154 
GetStreamUserData(Http2StreamId stream_id)155 void* OgHttp2Adapter::GetStreamUserData(Http2StreamId stream_id) {
156   return session_->GetStreamUserData(stream_id);
157 }
158 
ResumeStream(Http2StreamId stream_id)159 bool OgHttp2Adapter::ResumeStream(Http2StreamId stream_id) {
160   return session_->ResumeStream(stream_id);
161 }
162 
OgHttp2Adapter(Http2VisitorInterface & visitor,Options options)163 OgHttp2Adapter::OgHttp2Adapter(Http2VisitorInterface& visitor, Options options)
164     : Http2Adapter(visitor),
165       session_(std::make_unique<OgHttp2Session>(visitor, std::move(options))) {}
166 
167 }  // namespace adapter
168 }  // namespace http2
169