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