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