blob: 257f01a8425b9e704681820fa571ce75634f4c7a [file] [log] [blame]
#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;
// Removes references to the `stream_id` from this adapter.
void RemoveStream(Http2StreamId stream_id);
// Accessor for testing.
size_t sources_size() const { return sources_.size(); }
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_