• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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