xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/http2/adapter/event_forwarder.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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