|  | // Copyright 2021 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef QUICHE_BALSA_BALSA_VISITOR_INTERFACE_H_ | 
|  | #define QUICHE_BALSA_BALSA_VISITOR_INTERFACE_H_ | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <memory> | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "quiche/balsa/balsa_enums.h" | 
|  | #include "quiche/balsa/balsa_headers.h" | 
|  | #include "quiche/common/platform/api/quiche_export.h" | 
|  |  | 
|  | namespace quiche { | 
|  |  | 
|  | // By default the BalsaFrame instantiates a class derived from this interface | 
|  | // that does absolutely nothing. If you'd prefer to have interesting | 
|  | // functionality execute when any of the below functions are called by the | 
|  | // BalsaFrame, then you should subclass it, and set an instantiation of your | 
|  | // subclass as the current visitor for the BalsaFrame class using | 
|  | // BalsaFrame::set_visitor(). | 
|  | class QUICHE_EXPORT BalsaVisitorInterface { | 
|  | public: | 
|  | virtual ~BalsaVisitorInterface() {} | 
|  |  | 
|  | // Summary: | 
|  | //   This is how the BalsaFrame passes you the raw input that it knows to be a | 
|  | //   part of the body. To be clear, every byte of the Balsa that isn't part of | 
|  | //   the header (or its framing), or trailers will be passed through this | 
|  | //   function.  This includes data as well as chunking framing. | 
|  | // Arguments: | 
|  | //   input - the raw input that is part of the body. | 
|  | virtual void OnRawBodyInput(absl::string_view input) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   This is like OnRawBodyInput, but it will only include those parts of the | 
|  | //   body that would be stored by a program such as wget, i.e. the bytes | 
|  | //   indicating chunking will have been removed. Trailers will not be passed | 
|  | //   in through this function-- they'll be passed in through OnTrailerInput. | 
|  | // Arguments: | 
|  | //   input - the part of the body. | 
|  | virtual void OnBodyChunkInput(absl::string_view input) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   BalsaFrame passes the raw header data through this function. This is not | 
|  | //   cleaned up in any way. | 
|  | // Arguments: | 
|  | //   input - raw header data. | 
|  | virtual void OnHeaderInput(absl::string_view input) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   BalsaFrame passes the raw trailer data through this function. This is not | 
|  | //   cleaned up in any way.  Note that trailers only occur in a message if | 
|  | //   there was a chunked encoding, and not always then. | 
|  | // Arguments: | 
|  | //   input - raw trailer data. | 
|  | virtual void OnTrailerInput(absl::string_view input) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Since the BalsaFrame already has to parse the headers in order to | 
|  | //   determine proper framing, it might as well pass the parsed and cleaned-up | 
|  | //   results to whatever might need it.  This function exists for that | 
|  | //   purpose-- parsed headers are passed into this function. | 
|  | // Arguments: | 
|  | //   headers - contains the parsed headers in the order in which | 
|  | //             they occurred in the header. | 
|  | virtual void ProcessHeaders(const BalsaHeaders& headers) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when the trailers are framed and processed. This callback is only | 
|  | //   called when the trailers option is set in the framer. | 
|  | // Arguments: | 
|  | //   trailers - contains the parsed headers in the order in which they | 
|  | //              occurred in the trailers. | 
|  | virtual void OnTrailers(std::unique_ptr<BalsaHeaders> trailers) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when the first line of the message is parsed, in this case, for a | 
|  | //   request. | 
|  | // Arguments: | 
|  | //   line_input        - the first line string, | 
|  | //   method_input      - the method substring, | 
|  | //   request_uri_input - request uri substring, | 
|  | //   version_input     - the version substring. | 
|  | virtual void OnRequestFirstLineInput(absl::string_view line_input, | 
|  | absl::string_view method_input, | 
|  | absl::string_view request_uri, | 
|  | absl::string_view version_input) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when the first line of the message is parsed, in this case, for a | 
|  | //   response. | 
|  | // Arguments: | 
|  | //   line_input    - the first line string, | 
|  | //   version_input - the version substring, | 
|  | //   status_input  - the status substring, | 
|  | //   reason_input  - the reason substring. | 
|  | virtual void OnResponseFirstLineInput(absl::string_view line_input, | 
|  | absl::string_view version_input, | 
|  | absl::string_view status_input, | 
|  | absl::string_view reason_input) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when a chunk length is parsed. | 
|  | // Arguments: | 
|  | //   chunk length - the length of the next incoming chunk. | 
|  | virtual void OnChunkLength(size_t chunk_length) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   BalsaFrame passes the raw chunk extension data through this function. | 
|  | //   The data is not cleaned up at all. | 
|  | // Arguments: | 
|  | //   input - contains the bytes available for read. | 
|  | virtual void OnChunkExtensionInput(absl::string_view input) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when an interim response (response code 1xx) is framed and | 
|  | //   processed. This callback is mutually exclusive with ContinueHeaderDone(). | 
|  | // Arguments: | 
|  | //   headers - contains the parsed headers in the order in which they occurred | 
|  | //             in the interim response. | 
|  | virtual void OnInterimHeaders(std::unique_ptr<BalsaHeaders> headers) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when the 100 Continue headers are framed and processed. This | 
|  | //   callback is mutually exclusive with OnInterimHeaders(). | 
|  | // TODO(b/68801833): Remove this and update the OnInterimHeaders() comment. | 
|  | virtual void ContinueHeaderDone() = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when the header is framed and processed. | 
|  | virtual void HeaderDone() = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when the message is framed and processed. | 
|  | virtual void MessageDone() = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when an error is detected | 
|  | // Arguments: | 
|  | //   error_code - the error which is to be reported. | 
|  | virtual void HandleError(BalsaFrameEnums::ErrorCode error_code) = 0; | 
|  |  | 
|  | // Summary: | 
|  | //   Called when something meriting a warning is detected | 
|  | // Arguments: | 
|  | //   error_code - the warning which is to be reported. | 
|  | virtual void HandleWarning(BalsaFrameEnums::ErrorCode error_code) = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace quiche | 
|  |  | 
|  | #endif  // QUICHE_BALSA_BALSA_VISITOR_INTERFACE_H_ |