// Copyright 2013 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 NET_TOOLS_BALSA_BALSA_VISITOR_INTERFACE_H_ #define NET_TOOLS_BALSA_BALSA_VISITOR_INTERFACE_H_ #include <cstddef> namespace net { class BalsaFrame; class BalsaHeaders; // By default the BalsaFrame instantiates a class derived from this interface // which 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 BalsaVisitorInterface { public: virtual ~BalsaVisitorInterface() {} // Summary: // This is how the BalsaFrame passes you the raw input which it knows to // be a part of the body. To be clear, every byte of the Balsa which 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 - contains the bytes available for read. // size - contains the number of bytes it is safe to read from input. virtual void ProcessBodyInput(const char *input, size_t size) = 0; // Summary: // This is like ProcessBodyInput, but it will only include those parts of // the body which would be stored by a program such as wget, i.e. the bytes // indicating chunking (it will have been omitted). Trailers will not be // passed in through this function-- they'll be passed in through // ProcessTrailers. // Arguments: // input - contains the bytes available for read. // size - contains the number of bytes it is safe to read from input. virtual void ProcessBodyData(const char *input, size_t size) = 0; // Summary: // BalsaFrame passes the raw header data through this function. This is // not cleaned up in any way. // Arguments: // input - contains the bytes available for read. // size - contains the number of bytes it is safe to read from input. virtual void ProcessHeaderInput(const char *input, size_t size) = 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 - contains the bytes available for read. // size - contains the number of bytes it is safe to read from input. virtual void ProcessTrailerInput(const char *input, size_t size) = 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 occured in the header. virtual void ProcessHeaders(const BalsaHeaders& headers) = 0; // Summary: // Called when the first line of the message is parsed, in this case, for a // request. // Arguments: // line_input - pointer to the beginning of the first line string. // line_length - length of the first line string. (i.e. the numer of // bytes it is safe to read from line_ptr) // method_input - pointer to the beginning of the method string // method_length - length of the method string (i.e. the number // of bytes it is safe to read from method_input) // request_uri_input - pointer to the beginning of the request uri // string. // request_uri_length - length of the method string (i.e. the number // of bytes it is safe to read from method_input) // version_input - pointer to the beginning of the version string. // version_length - length of the version string (i.e. the number // of bytes it i ssafe to read from version_input) virtual void ProcessRequestFirstLine(const char* line_input, size_t line_length, const char* method_input, size_t method_length, const char* request_uri_input, size_t request_uri_length, const char* version_input, size_t version_length) = 0; // Summary: // Called when the first line of the message is parsed, in this case, for a // response. // Arguments: // line_input - pointer to the beginning of the first line string. // line_length - length of the first line string. (i.e. the numer of // bytes it is safe to read from line_ptr) // version_input - pointer to the beginning of the version string. // version_length - length of the version string (i.e. the number // of bytes it i ssafe to read from version_input) // status_input - pointer to the beginning of the status string // status_length - length of the status string (i.e. the number // of bytes it is safe to read from status_input) // reason_input - pointer to the beginning of the reason string // reason_length - length of the reason string (i.e. the number // of bytes it is safe to read from reason_input) virtual void ProcessResponseFirstLine(const char *line_input, size_t line_length, const char *version_input, size_t version_length, const char *status_input, size_t status_length, const char *reason_input, size_t reason_length) = 0; // Called when a chunk length is parsed. // Arguments: // chunk length - the length of the next incoming chunk. virtual void ProcessChunkLength(size_t chunk_length) = 0; // Summary: // BalsaFrame passes the raw chunk extension data through this function. // The data is not cleaned up at all, use // BalsaFrame::ProcessChunkExtentions to get the parsed and cleaned up // chunk extensions. // // Arguments: // input - contains the bytes available for read. // size - contains the number of bytes it is safe to read from input. virtual void ProcessChunkExtensions(const char* input, size_t size) = 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 while parsing the header. // Arguments: // framer - the framer in which an error occured. virtual void HandleHeaderError(BalsaFrame* framer) = 0; // Summary: // Called when something meriting a warning is detected while // parsing the header. // Arguments: // framer - the framer in which an error occured. virtual void HandleHeaderWarning(BalsaFrame* framer) = 0; // Summary: // Called when an error is detected while parsing a chunk. // Arguments: // framer - the framer in which an error occured. virtual void HandleChunkingError(BalsaFrame* framer) = 0; // Summary: // Called when an error is detected while handling the entity-body. // Currently, this can only be called when there is an error // with the BytesSpliced() function, but in the future other interesting // errors could occur. // Arguments: // framer - the framer in which an error occured. virtual void HandleBodyError(BalsaFrame* framer) = 0; }; } // namespace net #endif // NET_TOOLS_BALSA_BALSA_VISITOR_INTERFACE_H_