| #ifndef QUICHE_HTTP2_ADAPTER_HTTP2_VISITOR_INTERFACE_H_ | 
 | #define QUICHE_HTTP2_ADAPTER_HTTP2_VISITOR_INTERFACE_H_ | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "absl/strings/string_view.h" | 
 | #include "http2/adapter/http2_protocol.h" | 
 |  | 
 | namespace http2 { | 
 | namespace adapter { | 
 |  | 
 | // Http2VisitorInterface contains callbacks for receiving HTTP/2-level events. A | 
 | // processor like NghttpAdapter parses HTTP/2 frames and invokes the callbacks | 
 | // on an instance of this interface. Prefer a void return type for these | 
 | // callbacks, instead setting output parameters as needed. | 
 | // | 
 | // Example sequences of calls/events: | 
 | //   GET: | 
 | //     - OnBeginHeadersForStream() | 
 | //     - OnHeaderForStream() | 
 | //     - OnEndHeadersForStream() | 
 | //     - OnEndStream() | 
 | // | 
 | //   POST: | 
 | //     - OnBeginHeadersForStream() | 
 | //     - OnHeaderForStream() | 
 | //     - OnEndHeadersForStream() | 
 | //     - OnBeginDataForStream() | 
 | //     - OnDataForStream() | 
 | //     - OnEndStream() | 
 | // | 
 | //   Request canceled mid-stream, e.g, with error code CANCEL: | 
 | //     - OnBeginHeadersForStream() | 
 | //     - OnHeaderForStream() | 
 | //     - OnEndHeadersForStream() | 
 | //     - OnRstStream() | 
 | //     - OnCloseStream() | 
 | // | 
 | //   Request closed mid-stream, e.g., with error code NO_ERROR: | 
 | //     - OnBeginHeadersForStream() | 
 | //     - OnHeaderForStream() | 
 | //     - OnEndHeadersForStream() | 
 | //     - OnRstStream() | 
 | //     - OnCloseStream() | 
 | // | 
 | // More details are at RFC 7540 (go/http2spec). | 
 | class Http2VisitorInterface { | 
 |  public: | 
 |   Http2VisitorInterface(const Http2VisitorInterface&) = delete; | 
 |   Http2VisitorInterface& operator=(const Http2VisitorInterface&) = delete; | 
 |   virtual ~Http2VisitorInterface() = default; | 
 |  | 
 |   // Called when a connection-level processing error has been encountered. | 
 |   virtual void OnConnectionError() = 0; | 
 |  | 
 |   // Called when the header for a frame is received. | 
 |   virtual void OnFrameHeader(Http2StreamId stream_id, | 
 |                              size_t length, | 
 |                              uint8_t type, | 
 |                              uint8_t flags) {} | 
 |  | 
 |   // Called when a non-ack SETTINGS frame is received. | 
 |   virtual void OnSettingsStart() = 0; | 
 |  | 
 |   // Called for each SETTINGS id-value pair. | 
 |   virtual void OnSetting(Http2Setting setting) = 0; | 
 |  | 
 |   // Called at the end of a non-ack SETTINGS frame. | 
 |   virtual void OnSettingsEnd() = 0; | 
 |  | 
 |   // Called when a SETTINGS ack frame is received. | 
 |   virtual void OnSettingsAck() = 0; | 
 |  | 
 |   // Called when the connection receives the header block for a HEADERS frame on | 
 |   // a stream but has not yet parsed individual headers. | 
 |   virtual void OnBeginHeadersForStream(Http2StreamId stream_id) = 0; | 
 |  | 
 |   // Called when the connection receives the header |key| and |value| for a | 
 |   // stream. The HTTP/2 pseudo-headers defined in RFC 7540 Sections 8.1.2.3 and | 
 |   // 8.1.2.4 are also conveyed in this callback. This method is called after | 
 |   // OnBeginHeadersForStream(). | 
 |   virtual void OnHeaderForStream(Http2StreamId stream_id, absl::string_view key, | 
 |                                  absl::string_view value) = 0; | 
 |  | 
 |   // Called when the connection has received the complete header block for a | 
 |   // logical HEADERS frame on a stream (which may contain CONTINUATION frames, | 
 |   // transparent to the user). | 
 |   virtual void OnEndHeadersForStream(Http2StreamId stream_id) = 0; | 
 |  | 
 |   // Called when the connection receives the beginning of a DATA frame. The data | 
 |   // payload will be provided via subsequent calls to OnDataForStream(). | 
 |   virtual void OnBeginDataForStream(Http2StreamId stream_id, | 
 |                                     size_t payload_length) = 0; | 
 |  | 
 |   // Called when the connection receives some |data| (as part of a DATA frame | 
 |   // payload) for a stream. | 
 |   virtual void OnDataForStream(Http2StreamId stream_id, | 
 |                                absl::string_view data) = 0; | 
 |  | 
 |   // Called when the peer sends the END_STREAM flag on a stream, indicating that | 
 |   // the peer will not send additional headers or data for that stream. | 
 |   virtual void OnEndStream(Http2StreamId stream_id) = 0; | 
 |  | 
 |   // Called when the connection receives a RST_STREAM for a stream. This call | 
 |   // will be followed by either OnCloseStream(). | 
 |   virtual void OnRstStream(Http2StreamId stream_id, | 
 |                            Http2ErrorCode error_code) = 0; | 
 |  | 
 |   // Called when a stream is closed. | 
 |   virtual void OnCloseStream(Http2StreamId stream_id, | 
 |                              Http2ErrorCode error_code) = 0; | 
 |  | 
 |   // Called when the connection receives a PRIORITY frame. | 
 |   virtual void OnPriorityForStream(Http2StreamId stream_id, | 
 |                                    Http2StreamId parent_stream_id, int weight, | 
 |                                    bool exclusive) = 0; | 
 |  | 
 |   // Called when the connection receives a PING frame. | 
 |   virtual void OnPing(Http2PingId ping_id, bool is_ack) = 0; | 
 |  | 
 |   // Called when the connection receives a PUSH_PROMISE frame. The server push | 
 |   // request headers follow in calls to OnHeaderForStream() with |stream_id|. | 
 |   virtual void OnPushPromiseForStream(Http2StreamId stream_id, | 
 |                                       Http2StreamId promised_stream_id) = 0; | 
 |  | 
 |   // Called when the connection receives a GOAWAY frame. | 
 |   virtual void OnGoAway(Http2StreamId last_accepted_stream_id, | 
 |                         Http2ErrorCode error_code, | 
 |                         absl::string_view opaque_data) = 0; | 
 |  | 
 |   // Called when the connection receives a WINDOW_UPDATE frame. For | 
 |   // connection-level window updates, the |stream_id| will be 0. | 
 |   virtual void OnWindowUpdate(Http2StreamId stream_id, | 
 |                               int window_increment) = 0; | 
 |  | 
 |   // Called when the connection is ready to send data for a stream. The | 
 |   // implementation should write at most |length| bytes of the data payload to | 
 |   // the |destination_buffer| and set |end_stream| to true IFF there will be no | 
 |   // more data sent on this stream. Sets |written| to the number of bytes | 
 |   // written to the |destination_buffer| or a negative value if an error occurs. | 
 |   virtual void OnReadyToSendDataForStream(Http2StreamId stream_id, | 
 |                                              char* destination_buffer, | 
 |                                              size_t length, | 
 |                                              ssize_t* written, | 
 |                                              bool* end_stream) = 0; | 
 |  | 
 |   // Called when the connection is ready to write metadata for |stream_id| to | 
 |   // the wire. The implementation should write at most |length| bytes of the | 
 |   // serialized metadata payload to the |buffer| and set |written| to the number | 
 |   // of bytes written or a negative value if there was an error. | 
 |   virtual void OnReadyToSendMetadataForStream(Http2StreamId stream_id, | 
 |                                               char* buffer, size_t length, | 
 |                                               ssize_t* written) = 0; | 
 |  | 
 |   // Called when the connection receives the beginning of a METADATA frame | 
 |   // (which may itself be the middle of a logical metadata block). The metadata | 
 |   // payload will be provided via subsequent calls to OnMetadataForStream(). | 
 |   virtual void OnBeginMetadataForStream(Http2StreamId stream_id, | 
 |                                         size_t payload_length) = 0; | 
 |  | 
 |   // Called when the connection receives |metadata| as part of a METADATA frame | 
 |   // payload for a stream. | 
 |   virtual void OnMetadataForStream(Http2StreamId stream_id, | 
 |                                    absl::string_view metadata) = 0; | 
 |  | 
 |   // Called when the connection has finished receiving a logical metadata block | 
 |   // for a stream. Note that there may be multiple metadata blocks for a stream. | 
 |   virtual void OnMetadataEndForStream(Http2StreamId stream_id) = 0; | 
 |  | 
 |  protected: | 
 |   Http2VisitorInterface() = default; | 
 | }; | 
 |  | 
 | }  // namespace adapter | 
 | }  // namespace http2 | 
 |  | 
 | #endif  // QUICHE_HTTP2_ADAPTER_HTTP2_VISITOR_INTERFACE_H_ |