#ifndef QUICHE_HTTP2_ADAPTER_NGHTTP2_ADAPTER_H_ #define QUICHE_HTTP2_ADAPTER_NGHTTP2_ADAPTER_H_ #include "absl/container/flat_hash_map.h" #include "http2/adapter/http2_adapter.h" #include "http2/adapter/http2_protocol.h" #include "http2/adapter/nghttp2_session.h" #include "http2/adapter/nghttp2_util.h" #include "common/platform/api/quiche_export.h" namespace http2 { namespace adapter { class QUICHE_EXPORT_PRIVATE NgHttp2Adapter : public Http2Adapter { public: ~NgHttp2Adapter() override; // Creates an adapter that functions as a client. Does not take ownership of // |options|. static std::unique_ptr CreateClientAdapter( Http2VisitorInterface& visitor, const nghttp2_option* options = nullptr); // Creates an adapter that functions as a server. Does not take ownership of // |options|. static std::unique_ptr CreateServerAdapter( Http2VisitorInterface& visitor, const nghttp2_option* options = nullptr); bool IsServerSession() const override; ssize_t ProcessBytes(absl::string_view bytes) override; void SubmitSettings(absl::Span settings) override; void SubmitPriorityForStream(Http2StreamId stream_id, Http2StreamId parent_stream_id, int weight, bool exclusive) override; // Submits a PING on the connection. Note that nghttp2 automatically submits // PING acks upon receiving non-ack PINGs from the peer, so callers only use // this method to originate PINGs. See nghttp2_option_set_no_auto_ping_ack(). void SubmitPing(Http2PingId ping_id) override; void SubmitShutdownNotice() override; void SubmitGoAway(Http2StreamId last_accepted_stream_id, Http2ErrorCode error_code, absl::string_view opaque_data) override; void SubmitWindowUpdate(Http2StreamId stream_id, int window_increment) override; void SubmitRst(Http2StreamId stream_id, Http2ErrorCode error_code) override; void SubmitMetadata(Http2StreamId stream_id, std::unique_ptr source) override; int Send() override; int GetSendWindowSize() const override; int GetStreamSendWindowSize(Http2StreamId stream_id) const override; int GetStreamReceiveWindowLimit(Http2StreamId stream_id) const override; int GetStreamReceiveWindowSize(Http2StreamId stream_id) const override; int GetReceiveWindowSize() const override; int GetHpackEncoderDynamicTableSize() const override; int GetHpackDecoderDynamicTableSize() const override; Http2StreamId GetHighestReceivedStreamId() const override; void MarkDataConsumedForStream(Http2StreamId stream_id, size_t num_bytes) override; int32_t SubmitRequest(absl::Span headers, std::unique_ptr data_source, void* user_data) override; int SubmitResponse(Http2StreamId stream_id, absl::Span headers, std::unique_ptr data_source) override; int SubmitTrailer(Http2StreamId stream_id, absl::Span trailers) override; void SetStreamUserData(Http2StreamId stream_id, void* user_data) override; void* GetStreamUserData(Http2StreamId stream_id) override; bool ResumeStream(Http2StreamId stream_id) override; // TODO(b/181586191): Temporary accessor until equivalent functionality is // available in this adapter class. NgHttp2Session& session() { return *session_; } private: NgHttp2Adapter(Http2VisitorInterface& visitor, Perspective perspective, const nghttp2_option* options); // Performs any necessary initialization of the underlying HTTP/2 session, // such as preparing initial SETTINGS. void Initialize(); std::unique_ptr session_; Http2VisitorInterface& visitor_; const nghttp2_option* options_; Perspective perspective_; absl::flat_hash_map> sources_; }; } // namespace adapter } // namespace http2 #endif // QUICHE_HTTP2_ADAPTER_NGHTTP2_ADAPTER_H_