• 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_ENUMS_H_
6 #define NET_TOOLS_FLIP_SERVER_BALSA_ENUMS_H_
7 #pragma once
8 
9 namespace net {
10 
11 struct BalsaFrameEnums {
12   enum ParseState {
13     PARSE_ERROR,
14     READING_HEADER_AND_FIRSTLINE,
15     READING_CHUNK_LENGTH,
16     READING_CHUNK_EXTENSION,
17     READING_CHUNK_DATA,
18     READING_CHUNK_TERM,
19     READING_LAST_CHUNK_TERM,
20     READING_TRAILER,
21     READING_UNTIL_CLOSE,
22     READING_CONTENT,
23     MESSAGE_FULLY_READ,
24     NUM_STATES,
25   };
26 
27   enum ErrorCode {
28     NO_ERROR = 0,  // A sentinel value for convenience, none of the callbacks
29     //                should ever see this error code.
30     // Header parsing errors
31     // Note that adding one to many of the REQUEST errors yields the
32     // appropriate RESPONSE error.
33     // Particularly, when parsing the first line of a request or response,
34     // there are three sequences of non-whitespace regardless of whether or
35     // not it is a request or response. These are listed below, in order.
36     //
37     //        firstline_a     firstline_b    firstline_c
38     //    REQ: method         request_uri    version
39     //   RESP: version        statuscode     reason
40     //
41     // As you can see, the first token is the 'method' field for a request,
42     // and 'version' field for a response. We call the first non whitespace
43     // token firstline_a, the second firstline_b, and the third token
44     // followed by [^\r\n]*) firstline_c.
45     //
46     // This organization is important, as it lets us determine the error code
47     // to use without a branch based on is_response. Instead, we simply add
48     // is_response to the response error code-- If is_response is true, then
49     // we'll get the response error code, thanks to the fact that the error
50     // code numbers are organized to ensure that response error codes always
51     // precede request error codes.
52     //                                                  | Triggered
53     //                                                  | while processing
54     //                                                  | this NONWS
55     //                                                  | sequence...
56     NO_STATUS_LINE_IN_RESPONSE,                      // |
57     NO_REQUEST_LINE_IN_REQUEST,                      // |
58     FAILED_TO_FIND_WS_AFTER_RESPONSE_VERSION,        // |  firstline_a
59     FAILED_TO_FIND_WS_AFTER_REQUEST_METHOD,          // |  firstline_a
60     FAILED_TO_FIND_WS_AFTER_RESPONSE_STATUSCODE,     // |  firstline_b
61     FAILED_TO_FIND_WS_AFTER_REQUEST_REQUEST_URI,     // |  firstline_b
62     FAILED_TO_FIND_NL_AFTER_RESPONSE_REASON_PHRASE,  // |  firstline_c
63     FAILED_TO_FIND_NL_AFTER_REQUEST_HTTP_VERSION,    // |  firstline_c
64 
65     FAILED_CONVERTING_STATUS_CODE_TO_INT,
66     REQUEST_URI_TOO_LONG,  // Request URI greater than kMaxUrlLen.
67 
68     HEADERS_TOO_LONG,
69     UNPARSABLE_CONTENT_LENGTH,
70     // Warning: there may be a body but there was no content-length/chunked
71     // encoding
72     MAYBE_BODY_BUT_NO_CONTENT_LENGTH,
73 
74     // This is used if a body is required for a request.
75     REQUIRED_BODY_BUT_NO_CONTENT_LENGTH,
76 
77     HEADER_MISSING_COLON,
78 
79     // Chunking errors
80     INVALID_CHUNK_LENGTH,
81     CHUNK_LENGTH_OVERFLOW,
82 
83     // Other errors.
84     CALLED_BYTES_SPLICED_WHEN_UNSAFE_TO_DO_SO,
85     CALLED_BYTES_SPLICED_AND_EXCEEDED_SAFE_SPLICE_AMOUNT,
86     MULTIPLE_CONTENT_LENGTH_KEYS,
87     MULTIPLE_TRANSFER_ENCODING_KEYS,
88     UNKNOWN_TRANSFER_ENCODING,
89     INVALID_HEADER_FORMAT,
90 
91     // A detected internal inconsistency was found.
92     INTERNAL_LOGIC_ERROR,
93 
94     NUM_ERROR_CODES
95   };
96   static const char* ParseStateToString(ParseState error_code);
97   static const char* ErrorCodeToString(ErrorCode error_code);
98 };
99 
100 struct BalsaHeadersEnums {
101   enum ContentLengthStatus {
102     INVALID_CONTENT_LENGTH,
103     CONTENT_LENGTH_OVERFLOW,
104     NO_CONTENT_LENGTH,
105     VALID_CONTENT_LENGTH,
106   };
107 };
108 
109 }  // namespace net
110 
111 #endif  // NET_TOOLS_FLIP_SERVER_BALSA_ENUMS_H_
112 
113