| #ifndef QUICHE_HTTP2_ADAPTER_NGHTTP2_ADAPTER_H_ |
| #define QUICHE_HTTP2_ADAPTER_NGHTTP2_ADAPTER_H_ |
| |
| #include <cstdint> |
| |
| #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<NgHttp2Adapter> 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<NgHttp2Adapter> CreateServerAdapter( |
| Http2VisitorInterface& visitor, const nghttp2_option* options = nullptr); |
| |
| bool IsServerSession() const override; |
| bool want_read() const override { return session_->want_read(); } |
| bool want_write() const override { return session_->want_write(); } |
| |
| int64_t ProcessBytes(absl::string_view bytes) override; |
| void SubmitSettings(absl::Span<const Http2Setting> 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, size_t max_frame_size, |
| std::unique_ptr<MetadataSource> 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<const Header> headers, |
| std::unique_ptr<DataFrameSource> data_source, |
| void* user_data) override; |
| |
| int SubmitResponse(Http2StreamId stream_id, absl::Span<const Header> headers, |
| std::unique_ptr<DataFrameSource> data_source) override; |
| |
| int SubmitTrailer(Http2StreamId stream_id, |
| absl::Span<const Header> trailers) override; |
| |
| void SetStreamUserData(Http2StreamId stream_id, void* user_data) override; |
| void* GetStreamUserData(Http2StreamId stream_id) override; |
| |
| bool ResumeStream(Http2StreamId stream_id) override; |
| |
| 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<NgHttp2Session> session_; |
| Http2VisitorInterface& visitor_; |
| const nghttp2_option* options_; |
| Perspective perspective_; |
| |
| absl::flat_hash_map<int32_t, std::unique_ptr<DataFrameSource>> sources_; |
| }; |
| |
| } // namespace adapter |
| } // namespace http2 |
| |
| #endif // QUICHE_HTTP2_ADAPTER_NGHTTP2_ADAPTER_H_ |