diff options
Diffstat (limited to 'chromium/net/third_party/quiche/src/http2/adapter/nghttp2_adapter.cc')
-rw-r--r-- | chromium/net/third_party/quiche/src/http2/adapter/nghttp2_adapter.cc | 306 |
1 files changed, 0 insertions, 306 deletions
diff --git a/chromium/net/third_party/quiche/src/http2/adapter/nghttp2_adapter.cc b/chromium/net/third_party/quiche/src/http2/adapter/nghttp2_adapter.cc deleted file mode 100644 index a6ba0b27957..00000000000 --- a/chromium/net/third_party/quiche/src/http2/adapter/nghttp2_adapter.cc +++ /dev/null @@ -1,306 +0,0 @@ -#include "http2/adapter/nghttp2_adapter.h" - -#include "absl/algorithm/container.h" -#include "absl/strings/str_cat.h" -#include "absl/strings/string_view.h" -#include "http2/adapter/http2_visitor_interface.h" -#include "http2/adapter/nghttp2.h" -#include "http2/adapter/nghttp2_callbacks.h" -#include "http2/adapter/nghttp2_data_provider.h" -#include "common/platform/api/quiche_logging.h" -#include "common/quiche_endian.h" - -namespace http2 { -namespace adapter { - -namespace { - -using ConnectionError = Http2VisitorInterface::ConnectionError; - -// A metadata source that deletes itself upon completion. -class SelfDeletingMetadataSource : public MetadataSource { - public: - explicit SelfDeletingMetadataSource(std::unique_ptr<MetadataSource> source) - : source_(std::move(source)) {} - - size_t NumFrames(size_t max_frame_size) const override { - return source_->NumFrames(max_frame_size); - } - - std::pair<int64_t, bool> Pack(uint8_t* dest, size_t dest_len) override { - const auto result = source_->Pack(dest, dest_len); - if (result.first < 0 || result.second) { - delete this; - } - return result; - } - - void OnFailure() override { - source_->OnFailure(); - delete this; - } - - private: - std::unique_ptr<MetadataSource> source_; -}; - -} // anonymous namespace - -/* static */ -std::unique_ptr<NgHttp2Adapter> NgHttp2Adapter::CreateClientAdapter( - Http2VisitorInterface& visitor, const nghttp2_option* options) { - auto adapter = new NgHttp2Adapter(visitor, Perspective::kClient, options); - adapter->Initialize(); - return absl::WrapUnique(adapter); -} - -/* static */ -std::unique_ptr<NgHttp2Adapter> NgHttp2Adapter::CreateServerAdapter( - Http2VisitorInterface& visitor, const nghttp2_option* options) { - auto adapter = new NgHttp2Adapter(visitor, Perspective::kServer, options); - adapter->Initialize(); - return absl::WrapUnique(adapter); -} - -bool NgHttp2Adapter::IsServerSession() const { - int result = nghttp2_session_check_server_session(session_->raw_ptr()); - QUICHE_DCHECK_EQ(perspective_ == Perspective::kServer, result > 0); - return result > 0; -} - -int64_t NgHttp2Adapter::ProcessBytes(absl::string_view bytes) { - const int64_t processed_bytes = session_->ProcessBytes(bytes); - if (processed_bytes < 0) { - visitor_.OnConnectionError(ConnectionError::kParseError); - } - return processed_bytes; -} - -void NgHttp2Adapter::SubmitSettings(absl::Span<const Http2Setting> settings) { - // Submit SETTINGS, converting each Http2Setting to an nghttp2_settings_entry. - std::vector<nghttp2_settings_entry> nghttp2_settings; - absl::c_transform(settings, std::back_inserter(nghttp2_settings), - [](const Http2Setting& setting) { - return nghttp2_settings_entry{setting.id, setting.value}; - }); - nghttp2_submit_settings(session_->raw_ptr(), NGHTTP2_FLAG_NONE, - nghttp2_settings.data(), nghttp2_settings.size()); -} - -void NgHttp2Adapter::SubmitPriorityForStream(Http2StreamId stream_id, - Http2StreamId parent_stream_id, - int weight, - bool exclusive) { - nghttp2_priority_spec priority_spec; - nghttp2_priority_spec_init(&priority_spec, parent_stream_id, weight, - static_cast<int>(exclusive)); - nghttp2_submit_priority(session_->raw_ptr(), NGHTTP2_FLAG_NONE, stream_id, - &priority_spec); -} - -void NgHttp2Adapter::SubmitPing(Http2PingId ping_id) { - uint8_t opaque_data[8] = {}; - Http2PingId ping_id_to_serialize = quiche::QuicheEndian::HostToNet64(ping_id); - std::memcpy(opaque_data, &ping_id_to_serialize, sizeof(Http2PingId)); - nghttp2_submit_ping(session_->raw_ptr(), NGHTTP2_FLAG_NONE, opaque_data); -} - -void NgHttp2Adapter::SubmitShutdownNotice() { - nghttp2_submit_shutdown_notice(session_->raw_ptr()); -} - -void NgHttp2Adapter::SubmitGoAway(Http2StreamId last_accepted_stream_id, - Http2ErrorCode error_code, - absl::string_view opaque_data) { - nghttp2_submit_goaway(session_->raw_ptr(), NGHTTP2_FLAG_NONE, - last_accepted_stream_id, - static_cast<uint32_t>(error_code), - ToUint8Ptr(opaque_data.data()), opaque_data.size()); -} - -void NgHttp2Adapter::SubmitWindowUpdate(Http2StreamId stream_id, - int window_increment) { - nghttp2_submit_window_update(session_->raw_ptr(), NGHTTP2_FLAG_NONE, - stream_id, window_increment); -} - -void NgHttp2Adapter::SubmitMetadata(Http2StreamId stream_id, - size_t max_frame_size, - std::unique_ptr<MetadataSource> source) { - auto* wrapped_source = new SelfDeletingMetadataSource(std::move(source)); - const size_t num_frames = wrapped_source->NumFrames(max_frame_size); - size_t num_successes = 0; - for (size_t i = 1; i <= num_frames; ++i) { - const int result = nghttp2_submit_extension( - session_->raw_ptr(), kMetadataFrameType, - i == num_frames ? kMetadataEndFlag : 0, stream_id, wrapped_source); - if (result != 0) { - QUICHE_LOG(DFATAL) << "Failed to submit extension frame " << i << " of " - << num_frames; - break; - } - ++num_successes; - } - if (num_successes == 0) { - delete wrapped_source; - } -} - -int NgHttp2Adapter::Send() { - const int result = nghttp2_session_send(session_->raw_ptr()); - if (result != 0) { - QUICHE_VLOG(1) << "nghttp2_session_send returned " << result; - visitor_.OnConnectionError(ConnectionError::kSendError); - } - return result; -} - -int NgHttp2Adapter::GetSendWindowSize() const { - return session_->GetRemoteWindowSize(); -} - -int NgHttp2Adapter::GetStreamSendWindowSize(Http2StreamId stream_id) const { - return nghttp2_session_get_stream_remote_window_size(session_->raw_ptr(), - stream_id); -} - -int NgHttp2Adapter::GetStreamReceiveWindowLimit(Http2StreamId stream_id) const { - return nghttp2_session_get_stream_effective_local_window_size( - session_->raw_ptr(), stream_id); -} - -int NgHttp2Adapter::GetStreamReceiveWindowSize(Http2StreamId stream_id) const { - return nghttp2_session_get_stream_local_window_size(session_->raw_ptr(), - stream_id); -} - -int NgHttp2Adapter::GetReceiveWindowSize() const { - return nghttp2_session_get_local_window_size(session_->raw_ptr()); -} - -int NgHttp2Adapter::GetHpackEncoderDynamicTableSize() const { - return nghttp2_session_get_hd_deflate_dynamic_table_size(session_->raw_ptr()); -} - -int NgHttp2Adapter::GetHpackDecoderDynamicTableSize() const { - return nghttp2_session_get_hd_inflate_dynamic_table_size(session_->raw_ptr()); -} - -Http2StreamId NgHttp2Adapter::GetHighestReceivedStreamId() const { - return nghttp2_session_get_last_proc_stream_id(session_->raw_ptr()); -} - -void NgHttp2Adapter::MarkDataConsumedForStream(Http2StreamId stream_id, - size_t num_bytes) { - int rc = session_->Consume(stream_id, num_bytes); - if (rc != 0) { - QUICHE_LOG(ERROR) << "Error " << rc << " marking " << num_bytes - << " bytes consumed for stream " << stream_id; - } -} - -void NgHttp2Adapter::SubmitRst(Http2StreamId stream_id, - Http2ErrorCode error_code) { - int status = - nghttp2_submit_rst_stream(session_->raw_ptr(), NGHTTP2_FLAG_NONE, - stream_id, static_cast<uint32_t>(error_code)); - if (status < 0) { - QUICHE_LOG(WARNING) << "Reset stream failed: " << stream_id - << " with status code " << status; - } -} - -int32_t NgHttp2Adapter::SubmitRequest( - absl::Span<const Header> headers, - std::unique_ptr<DataFrameSource> data_source, void* stream_user_data) { - auto nvs = GetNghttp2Nvs(headers); - std::unique_ptr<nghttp2_data_provider> provider = - MakeDataProvider(data_source.get()); - - int32_t stream_id = - nghttp2_submit_request(session_->raw_ptr(), nullptr, nvs.data(), - nvs.size(), provider.get(), stream_user_data); - // TODO(birenroy): clean up data source on stream close - sources_.emplace(stream_id, std::move(data_source)); - QUICHE_VLOG(1) << "Submitted request with " << nvs.size() - << " request headers and user data " << stream_user_data - << "; resulted in stream " << stream_id; - return stream_id; -} - -int NgHttp2Adapter::SubmitResponse( - Http2StreamId stream_id, absl::Span<const Header> headers, - std::unique_ptr<DataFrameSource> data_source) { - auto nvs = GetNghttp2Nvs(headers); - std::unique_ptr<nghttp2_data_provider> provider = - MakeDataProvider(data_source.get()); - - // TODO(birenroy): clean up data source on stream close - sources_.emplace(stream_id, std::move(data_source)); - - int result = nghttp2_submit_response(session_->raw_ptr(), stream_id, - nvs.data(), nvs.size(), provider.get()); - QUICHE_VLOG(1) << "Submitted response with " << nvs.size() - << " response headers; result = " << result; - return result; -} - -int NgHttp2Adapter::SubmitTrailer(Http2StreamId stream_id, - absl::Span<const Header> trailers) { - auto nvs = GetNghttp2Nvs(trailers); - int result = nghttp2_submit_trailer(session_->raw_ptr(), stream_id, - nvs.data(), nvs.size()); - QUICHE_VLOG(1) << "Submitted trailers with " << nvs.size() - << " response trailers; result = " << result; - return result; -} - -void NgHttp2Adapter::SetStreamUserData(Http2StreamId stream_id, - void* stream_user_data) { - nghttp2_session_set_stream_user_data(session_->raw_ptr(), stream_id, - stream_user_data); -} - -void* NgHttp2Adapter::GetStreamUserData(Http2StreamId stream_id) { - return nghttp2_session_get_stream_user_data(session_->raw_ptr(), stream_id); -} - -bool NgHttp2Adapter::ResumeStream(Http2StreamId stream_id) { - return 0 == nghttp2_session_resume_data(session_->raw_ptr(), stream_id); -} - -NgHttp2Adapter::NgHttp2Adapter(Http2VisitorInterface& visitor, - Perspective perspective, - const nghttp2_option* options) - : Http2Adapter(visitor), - visitor_(visitor), - options_(options), - perspective_(perspective) {} - -NgHttp2Adapter::~NgHttp2Adapter() {} - -void NgHttp2Adapter::Initialize() { - nghttp2_option* owned_options = nullptr; - if (options_ == nullptr) { - nghttp2_option_new(&owned_options); - // Set some common options for compatibility. - nghttp2_option_set_no_closed_streams(owned_options, 1); - nghttp2_option_set_no_auto_window_update(owned_options, 1); - nghttp2_option_set_max_send_header_block_length(owned_options, 0x2000000); - nghttp2_option_set_max_outbound_ack(owned_options, 10000); - nghttp2_option_set_user_recv_extension_type(owned_options, - kMetadataFrameType); - options_ = owned_options; - } - - session_ = absl::make_unique<NgHttp2Session>(perspective_, - callbacks::Create(), options_, - static_cast<void*>(&visitor_)); - if (owned_options != nullptr) { - nghttp2_option_del(owned_options); - } - options_ = nullptr; -} - -} // namespace adapter -} // namespace http2 |