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