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