• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef NET_TOOLS_FLIP_SERVER_BALSA_VISITOR_INTERFACE_H_
6 #define NET_TOOLS_FLIP_SERVER_BALSA_VISITOR_INTERFACE_H_
7 #pragma once
8 
9 #include <cstddef>
10 
11 namespace net {
12 
13 class BalsaFrame;
14 class BalsaHeaders;
15 
16 // By default the BalsaFrame instantiates a class derived from this interface
17 // which does absolutely nothing. If you'd prefer to have interesting
18 // functionality execute when any of the below functions are called by the
19 // BalsaFrame, then you should subclass it, and set an instantiation of your
20 // subclass as the current visitor for the BalsaFrame class using
21 // BalsaFrame::set_visitor().
22 class BalsaVisitorInterface {
23  public:
~BalsaVisitorInterface()24   virtual ~BalsaVisitorInterface() {}
25 
26   // Summary:
27   //   This is how the BalsaFrame passes you the raw input which it knows to
28   //   be a part of the body. To be clear, every byte of the Balsa which isn't
29   //   part of the header (or it's framing), or trailers will be passed through
30   //   this function.  This includes data as well as chunking framing.
31   // Arguments:
32   //   input - contains the bytes available for read.
33   //   size - contains the number of bytes it is safe to read from input.
34   virtual void ProcessBodyInput(const char *input, size_t size) = 0;
35 
36   // Summary:
37   //   This is like ProcessBodyInput, but it will only include those parts of
38   //   the body which would be stored by a program such as wget, i.e. the bytes
39   //   indicating chunking (it will have been omitted). Trailers will not be
40   //   passed in through this function-- they'll be passed in through
41   //   ProcessTrailers.
42   // Arguments:
43   //  input - contains the bytes available for read.
44   //  size - contains the number of bytes it is safe to read from input.
45   virtual void ProcessBodyData(const char *input, size_t size) = 0;
46 
47   // Summary:
48   //   BalsaFrame passes the raw header data through this function. This is
49   //   not cleaned up in any way.
50   // Arguments:
51   //  input - contains the bytes available for read.
52   //  size - contains the number of bytes it is safe to read from input.
53   virtual void ProcessHeaderInput(const char *input, size_t size) = 0;
54 
55   // Summary:
56   //   BalsaFrame passes the raw trailer data through this function. This is
57   //   not cleaned up in any way.  Note that trailers only occur in a message
58   //   if there was a chunked encoding, and not always then.
59   //
60   // Arguments:
61   //  input - contains the bytes available for read.
62   //  size - contains the number of bytes it is safe to read from input.
63   virtual void ProcessTrailerInput(const char *input, size_t size) = 0;
64 
65   // Summary:
66   //   Since the BalsaFrame already has to parse the headers in order to
67   //   determine proper framing, it might as well pass the parsed and
68   //   cleaned-up results to whatever might need it.  This function exists for
69   //   that purpose-- parsed headers are passed into this function.
70   // Arguments:
71   //   headers - contains the parsed headers in the order in which
72   //             they occured in the header.
73   virtual void ProcessHeaders(const BalsaHeaders& headers) = 0;
74 
75   // Summary:
76   //   Called when the first line of the message is parsed, in this case, for a
77   //   request.
78   // Arguments:
79   //   line_input - pointer to the beginning of the first line string.
80   //   line_length - length of the first line string. (i.e. the numer of
81   //                 bytes it is safe to read from line_ptr)
82   //   method_input - pointer to the beginning of the method string
83   //   method_length - length of the method string (i.e. the number
84   //                   of bytes it is safe to read from method_input)
85   //   request_uri_input - pointer to the beginning of the request uri
86   //                       string.
87   //   request_uri_length - length of the method string (i.e. the number
88   //                        of bytes it is safe to read from method_input)
89   //   version_input - pointer to the beginning of the version string.
90   //   version_length - length of the version string (i.e. the number
91   //                    of bytes it i ssafe to read from version_input)
92   virtual void ProcessRequestFirstLine(const char* line_input,
93                                        size_t line_length,
94                                        const char* method_input,
95                                        size_t method_length,
96                                        const char* request_uri_input,
97                                        size_t request_uri_length,
98                                        const char* version_input,
99                                        size_t version_length) = 0;
100 
101   // Summary:
102   //   Called when the first line of the message is parsed, in this case, for a
103   //   response.
104   // Arguments:
105   //   line_input - pointer to the beginning of the first line string.
106   //   line_length - length of the first line string. (i.e. the numer of
107   //                 bytes it is safe to read from line_ptr)
108   //   version_input - pointer to the beginning of the version string.
109   //   version_length - length of the version string (i.e. the number
110   //                    of bytes it i ssafe to read from version_input)
111   //   status_input - pointer to the beginning of the status string
112   //   status_length - length of the status string (i.e. the number
113   //                   of bytes it is safe to read from status_input)
114   //   reason_input - pointer to the beginning of the reason string
115   //   reason_length - length of the reason string (i.e. the number
116   //                   of bytes it is safe to read from reason_input)
117   virtual void ProcessResponseFirstLine(const char *line_input,
118                                         size_t line_length,
119                                         const char *version_input,
120                                         size_t version_length,
121                                         const char *status_input,
122                                         size_t status_length,
123                                         const char *reason_input,
124                                         size_t reason_length) = 0;
125 
126   // Called when a chunk length is parsed.
127   // Arguments:
128   //   chunk length - the length of the next incoming chunk.
129   virtual void ProcessChunkLength(size_t chunk_length) = 0;
130 
131   // Summary:
132   //   BalsaFrame passes the raw chunk extension data through this function.
133   //   The data is not cleaned up at all, use
134   //   BalsaFrame::ProcessChunkExtentions to get the parsed and cleaned up
135   //   chunk extensions.
136   //
137   // Arguments:
138   //  input - contains the bytes available for read.
139   //  size - contains the number of bytes it is safe to read from input.
140   virtual void ProcessChunkExtensions(const char* input, size_t size) = 0;
141 
142   // Summary:
143   //   Called when the header is framed and processed.
144   virtual void HeaderDone() = 0;
145 
146   // Summary:
147   //   Called when the message is framed and processed.
148   virtual void MessageDone() = 0;
149 
150   // Summary:
151   //   Called when an error is detected while parsing the header.
152   // Arguments:
153   //   framer - the framer in which an error occured.
154   virtual void HandleHeaderError(BalsaFrame* framer) = 0;
155 
156   // Summary:
157   //   Called when something meriting a warning is detected while
158   //   parsing the header.
159   // Arguments:
160   //   framer - the framer in which an error occured.
161   virtual void HandleHeaderWarning(BalsaFrame* framer) = 0;
162 
163   // Summary:
164   //   Called when an error is detected while parsing a chunk.
165   // Arguments:
166   //   framer - the framer in which an error occured.
167   virtual void HandleChunkingError(BalsaFrame* framer) = 0;
168 
169   // Summary:
170   //   Called when an error is detected while handling the entity-body.
171   //   Currently, this can only be called when there is an error
172   //   with the BytesSpliced() function, but in the future other interesting
173   //   errors could occur.
174   // Arguments:
175   //   framer - the framer in which an error occured.
176   virtual void HandleBodyError(BalsaFrame* framer) = 0;
177 };
178 
179 }  // namespace net
180 
181 #endif  // NET_TOOLS_FLIP_SERVER_BALSA_VISITOR_INTERFACE_H_
182 
183