| #include "http2/adapter/oghttp2_adapter.h" |
| |
| #include "absl/memory/memory.h" |
| #include "absl/strings/str_cat.h" |
| #include "http2/adapter/http2_util.h" |
| #include "common/platform/api/quiche_bug_tracker.h" |
| #include "spdy/core/spdy_protocol.h" |
| |
| namespace http2 { |
| namespace adapter { |
| |
| namespace { |
| |
| using spdy::SpdyFrameIR; |
| using spdy::SpdyGoAwayIR; |
| using spdy::SpdyPingIR; |
| using spdy::SpdyPriorityIR; |
| using spdy::SpdySettingsIR; |
| using spdy::SpdyWindowUpdateIR; |
| |
| } // namespace |
| |
| /* static */ |
| std::unique_ptr<OgHttp2Adapter> OgHttp2Adapter::Create( |
| Http2VisitorInterface& visitor, |
| Options options) { |
| // Using `new` to access a non-public constructor. |
| return absl::WrapUnique(new OgHttp2Adapter(visitor, std::move(options))); |
| } |
| |
| OgHttp2Adapter::~OgHttp2Adapter() {} |
| |
| bool OgHttp2Adapter::IsServerSession() const { |
| return session_->IsServerSession(); |
| } |
| |
| int64_t OgHttp2Adapter::ProcessBytes(absl::string_view bytes) { |
| return session_->ProcessBytes(bytes); |
| } |
| |
| void OgHttp2Adapter::SubmitSettings(absl::Span<const Http2Setting> settings) { |
| auto settings_ir = absl::make_unique<SpdySettingsIR>(); |
| for (const Http2Setting& setting : settings) { |
| settings_ir->AddSetting(setting.id, setting.value); |
| } |
| session_->EnqueueFrame(std::move(settings_ir)); |
| } |
| |
| void OgHttp2Adapter::SubmitPriorityForStream(Http2StreamId stream_id, |
| Http2StreamId parent_stream_id, |
| int weight, |
| bool exclusive) { |
| session_->EnqueueFrame(absl::make_unique<SpdyPriorityIR>( |
| stream_id, parent_stream_id, weight, exclusive)); |
| } |
| |
| void OgHttp2Adapter::SubmitPing(Http2PingId ping_id) { |
| session_->EnqueueFrame(absl::make_unique<SpdyPingIR>(ping_id)); |
| } |
| |
| void OgHttp2Adapter::SubmitShutdownNotice() { |
| session_->StartGracefulShutdown(); |
| } |
| |
| void OgHttp2Adapter::SubmitGoAway(Http2StreamId last_accepted_stream_id, |
| Http2ErrorCode error_code, |
| absl::string_view opaque_data) { |
| session_->EnqueueFrame(absl::make_unique<SpdyGoAwayIR>( |
| last_accepted_stream_id, TranslateErrorCode(error_code), |
| std::string(opaque_data))); |
| } |
| void OgHttp2Adapter::SubmitWindowUpdate(Http2StreamId stream_id, |
| int window_increment) { |
| session_->EnqueueFrame( |
| absl::make_unique<SpdyWindowUpdateIR>(stream_id, window_increment)); |
| } |
| |
| void OgHttp2Adapter::SubmitMetadata(Http2StreamId stream_id, |
| size_t /* max_frame_size */, |
| std::unique_ptr<MetadataSource> source) { |
| // Not necessary to pass max_frame_size along, since OgHttp2Session tracks the |
| // peer's advertised max frame size. |
| session_->SubmitMetadata(stream_id, std::move(source)); |
| } |
| |
| int OgHttp2Adapter::Send() { return session_->Send(); } |
| |
| int OgHttp2Adapter::GetSendWindowSize() const { |
| return session_->GetRemoteWindowSize(); |
| } |
| |
| int OgHttp2Adapter::GetStreamSendWindowSize(Http2StreamId stream_id) const { |
| return session_->GetStreamSendWindowSize(stream_id); |
| } |
| |
| int OgHttp2Adapter::GetStreamReceiveWindowLimit(Http2StreamId stream_id) const { |
| return session_->GetStreamReceiveWindowLimit(stream_id); |
| } |
| |
| int OgHttp2Adapter::GetStreamReceiveWindowSize(Http2StreamId stream_id) const { |
| return session_->GetStreamReceiveWindowSize(stream_id); |
| } |
| |
| int OgHttp2Adapter::GetReceiveWindowSize() const { |
| return session_->GetReceiveWindowSize(); |
| } |
| |
| int OgHttp2Adapter::GetHpackEncoderDynamicTableSize() const { |
| return session_->GetHpackEncoderDynamicTableSize(); |
| } |
| |
| int OgHttp2Adapter::GetHpackDecoderDynamicTableSize() const { |
| return session_->GetHpackDecoderDynamicTableSize(); |
| } |
| |
| Http2StreamId OgHttp2Adapter::GetHighestReceivedStreamId() const { |
| return session_->GetHighestReceivedStreamId(); |
| } |
| |
| void OgHttp2Adapter::MarkDataConsumedForStream(Http2StreamId stream_id, |
| size_t num_bytes) { |
| session_->Consume(stream_id, num_bytes); |
| } |
| |
| void OgHttp2Adapter::SubmitRst(Http2StreamId stream_id, |
| Http2ErrorCode error_code) { |
| session_->EnqueueFrame(absl::make_unique<spdy::SpdyRstStreamIR>( |
| stream_id, TranslateErrorCode(error_code))); |
| } |
| |
| int32_t OgHttp2Adapter::SubmitRequest( |
| absl::Span<const Header> headers, |
| std::unique_ptr<DataFrameSource> data_source, void* user_data) { |
| return session_->SubmitRequest(headers, std::move(data_source), user_data); |
| } |
| |
| int OgHttp2Adapter::SubmitResponse( |
| Http2StreamId stream_id, absl::Span<const Header> headers, |
| std::unique_ptr<DataFrameSource> data_source) { |
| return session_->SubmitResponse(stream_id, headers, std::move(data_source)); |
| } |
| |
| int OgHttp2Adapter::SubmitTrailer(Http2StreamId stream_id, |
| absl::Span<const Header> trailers) { |
| return session_->SubmitTrailer(stream_id, trailers); |
| } |
| |
| void OgHttp2Adapter::SetStreamUserData(Http2StreamId stream_id, |
| void* user_data) { |
| session_->SetStreamUserData(stream_id, user_data); |
| } |
| |
| void* OgHttp2Adapter::GetStreamUserData(Http2StreamId stream_id) { |
| return session_->GetStreamUserData(stream_id); |
| } |
| |
| bool OgHttp2Adapter::ResumeStream(Http2StreamId stream_id) { |
| return session_->ResumeStream(stream_id); |
| } |
| |
| OgHttp2Adapter::OgHttp2Adapter(Http2VisitorInterface& visitor, Options options) |
| : Http2Adapter(visitor), |
| session_(absl::make_unique<OgHttp2Session>(visitor, std::move(options))) { |
| } |
| |
| } // namespace adapter |
| } // namespace http2 |