1 #ifndef QUICHE_HTTP2_ADAPTER_EVENT_FORWARDER_H_ 2 #define QUICHE_HTTP2_ADAPTER_EVENT_FORWARDER_H_ 3 4 #include <functional> 5 6 #include "quiche/common/platform/api/quiche_export.h" 7 #include "quiche/spdy/core/http2_frame_decoder_adapter.h" 8 9 namespace http2 { 10 namespace adapter { 11 12 // Forwards events to a provided SpdyFramerVisitorInterface receiver if the 13 // provided predicate succeeds. Currently, OnHeaderFrameStart() is always 14 // forwarded regardless of the predicate. 15 // TODO(diannahu): Add a NoOpHeadersHandler if needed. 16 class QUICHE_EXPORT EventForwarder : public spdy::SpdyFramerVisitorInterface { 17 public: 18 // Whether the forwarder can forward events to the receiver. 19 using ForwardPredicate = std::function<bool()>; 20 21 EventForwarder(ForwardPredicate can_forward, 22 spdy::SpdyFramerVisitorInterface& receiver); 23 24 void OnError(Http2DecoderAdapter::SpdyFramerError error, 25 std::string detailed_error) override; 26 void OnCommonHeader(spdy::SpdyStreamId stream_id, size_t length, uint8_t type, 27 uint8_t flags) override; 28 void OnDataFrameHeader(spdy::SpdyStreamId stream_id, size_t length, 29 bool fin) override; 30 void OnStreamFrameData(spdy::SpdyStreamId stream_id, const char* data, 31 size_t len) override; 32 void OnStreamEnd(spdy::SpdyStreamId stream_id) override; 33 void OnStreamPadLength(spdy::SpdyStreamId stream_id, size_t value) override; 34 void OnStreamPadding(spdy::SpdyStreamId stream_id, size_t len) override; 35 spdy::SpdyHeadersHandlerInterface* OnHeaderFrameStart( 36 spdy::SpdyStreamId stream_id) override; 37 void OnHeaderFrameEnd(spdy::SpdyStreamId stream_id) override; 38 void OnRstStream(spdy::SpdyStreamId stream_id, 39 spdy::SpdyErrorCode error_code) override; 40 void OnSettings() override; 41 void OnSetting(spdy::SpdySettingsId id, uint32_t value) override; 42 void OnSettingsEnd() override; 43 void OnSettingsAck() override; 44 void OnPing(spdy::SpdyPingId unique_id, bool is_ack) override; 45 void OnGoAway(spdy::SpdyStreamId last_accepted_stream_id, 46 spdy::SpdyErrorCode error_code) override; 47 bool OnGoAwayFrameData(const char* goaway_data, size_t len) override; 48 void OnHeaders(spdy::SpdyStreamId stream_id, size_t payload_length, 49 bool has_priority, int weight, 50 spdy::SpdyStreamId parent_stream_id, bool exclusive, bool fin, 51 bool end) override; 52 void OnWindowUpdate(spdy::SpdyStreamId stream_id, 53 int delta_window_size) override; 54 void OnPushPromise(spdy::SpdyStreamId stream_id, 55 spdy::SpdyStreamId promised_stream_id, bool end) override; 56 void OnContinuation(spdy::SpdyStreamId stream_id, size_t payload_length, 57 bool end) override; 58 void OnAltSvc(spdy::SpdyStreamId stream_id, absl::string_view origin, 59 const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& 60 altsvc_vector) override; 61 void OnPriority(spdy::SpdyStreamId stream_id, 62 spdy::SpdyStreamId parent_stream_id, int weight, 63 bool exclusive) override; 64 void OnPriorityUpdate(spdy::SpdyStreamId prioritized_stream_id, 65 absl::string_view priority_field_value) override; 66 bool OnUnknownFrame(spdy::SpdyStreamId stream_id, 67 uint8_t frame_type) override; 68 void OnUnknownFrameStart(spdy::SpdyStreamId stream_id, size_t length, 69 uint8_t type, uint8_t flags) override; 70 void OnUnknownFramePayload(spdy::SpdyStreamId stream_id, 71 absl::string_view payload) override; 72 73 private: 74 ForwardPredicate can_forward_; 75 spdy::SpdyFramerVisitorInterface& receiver_; 76 }; 77 78 } // namespace adapter 79 } // namespace http2 80 81 #endif // QUICHE_HTTP2_ADAPTER_EVENT_FORWARDER_H_ 82