| #ifndef QUICHE_HTTP2_ADAPTER_EVENT_FORWARDER_H_ |
| #define QUICHE_HTTP2_ADAPTER_EVENT_FORWARDER_H_ |
| |
| #include <functional> |
| |
| #include "common/platform/api/quiche_export.h" |
| #include "spdy/core/http2_frame_decoder_adapter.h" |
| |
| namespace http2 { |
| namespace adapter { |
| |
| // Forwards events to a provided SpdyFramerVisitorInterface receiver if the |
| // provided predicate succeeds. Currently, OnHeaderFrameStart() is always |
| // forwarded regardless of the predicate. |
| // TODO(diannahu): Add a NoOpHeadersHandler if needed. |
| class QUICHE_EXPORT_PRIVATE EventForwarder |
| : public spdy::SpdyFramerVisitorInterface { |
| public: |
| // Whether the forwarder can forward events to the receiver. |
| using ForwardPredicate = std::function<bool()>; |
| |
| EventForwarder(ForwardPredicate can_forward, |
| spdy::SpdyFramerVisitorInterface& receiver); |
| |
| void OnError(Http2DecoderAdapter::SpdyFramerError error, |
| std::string detailed_error) override; |
| void OnCommonHeader(spdy::SpdyStreamId stream_id, size_t length, uint8_t type, |
| uint8_t flags) override; |
| void OnDataFrameHeader(spdy::SpdyStreamId stream_id, size_t length, |
| bool fin) override; |
| void OnStreamFrameData(spdy::SpdyStreamId stream_id, const char* data, |
| size_t len) override; |
| void OnStreamEnd(spdy::SpdyStreamId stream_id) override; |
| void OnStreamPadLength(spdy::SpdyStreamId stream_id, size_t value) override; |
| void OnStreamPadding(spdy::SpdyStreamId stream_id, size_t len) override; |
| spdy::SpdyHeadersHandlerInterface* OnHeaderFrameStart( |
| spdy::SpdyStreamId stream_id) override; |
| void OnHeaderFrameEnd(spdy::SpdyStreamId stream_id) override; |
| void OnRstStream(spdy::SpdyStreamId stream_id, |
| spdy::SpdyErrorCode error_code) override; |
| void OnSettings() override; |
| void OnSetting(spdy::SpdySettingsId id, uint32_t value) override; |
| void OnSettingsEnd() override; |
| void OnSettingsAck() override; |
| void OnPing(spdy::SpdyPingId unique_id, bool is_ack) override; |
| void OnGoAway(spdy::SpdyStreamId last_accepted_stream_id, |
| spdy::SpdyErrorCode error_code) override; |
| bool OnGoAwayFrameData(const char* goaway_data, size_t len) override; |
| void OnHeaders(spdy::SpdyStreamId stream_id, bool has_priority, int weight, |
| spdy::SpdyStreamId parent_stream_id, bool exclusive, bool fin, |
| bool end) override; |
| void OnWindowUpdate(spdy::SpdyStreamId stream_id, |
| int delta_window_size) override; |
| void OnPushPromise(spdy::SpdyStreamId stream_id, |
| spdy::SpdyStreamId promised_stream_id, bool end) override; |
| void OnContinuation(spdy::SpdyStreamId stream_id, bool end) override; |
| void OnAltSvc(spdy::SpdyStreamId stream_id, absl::string_view origin, |
| const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& |
| altsvc_vector) override; |
| void OnPriority(spdy::SpdyStreamId stream_id, |
| spdy::SpdyStreamId parent_stream_id, int weight, |
| bool exclusive) override; |
| void OnPriorityUpdate(spdy::SpdyStreamId prioritized_stream_id, |
| absl::string_view priority_field_value) override; |
| bool OnUnknownFrame(spdy::SpdyStreamId stream_id, |
| uint8_t frame_type) override; |
| |
| private: |
| ForwardPredicate can_forward_; |
| spdy::SpdyFramerVisitorInterface& receiver_; |
| }; |
| |
| } // namespace adapter |
| } // namespace http2 |
| |
| #endif // QUICHE_HTTP2_ADAPTER_EVENT_FORWARDER_H_ |