| #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_ |