4 * Copyright (c) 2011-2012 project bchan
6 * This software is provided 'as-is', without any express or implied
7 * warranty. In no event will the authors be held liable for any damages
8 * arising from the use of this software.
10 * Permission is granted to anyone to use this software for any purpose,
11 * including commercial applications, and to alter it and redistribute it
12 * freely, subject to the following restrictions:
14 * 1. The origin of this software must not be misrepresented; you must not
15 * claim that you wrote the original software. If you use this software
16 * in a product, an acknowledgment in the product documentation would be
17 * appreciated but is not required.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
27 #include "http_headerlexer.h"
33 #ifdef BCHAN_CONFIG_DEBUG
34 # define DP(arg) printf arg
35 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
38 # define DP_ER(msg, err) /**/
42 #define DP_STATE(arg) printf arg
44 #define DP_STATE(arg) /**/
47 EXPORT VOID http_headerlexer_inputchar(http_headerlexer_t *lexer, UB ch, HTTP_HEADERLEXER_RESULT *result)
49 *result = HTTP_HEADERLEXER_RESULT_NONE;
51 switch (lexer->state) {
52 case HTTP_HEADERLEXER_STATE_SEARCH_HEADER:
53 DP_STATE(("state = SEARCH_HEADER: %c[%02x]\n", ch, ch));
55 lexer->state = HTTP_HEADERLEXER_STATE_SEARCH_HEADER_CR;
58 if ((ch == ' ')&&(ch = '\t')) {
59 lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDVALUE_LWS;
60 *result = HTTP_HEADERLEXER_RESULT_LWS;
61 /* TODO: return value in "LWS CRLF LWS". */
64 /* TODO: handling error charactors for "token" */
65 lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDNAME;
66 *result = HTTP_HEADERLEXER_RESULT_FIELDNAME;
68 case HTTP_HEADERLEXER_STATE_SEARCH_HEADER_CR:
69 DP_STATE(("state = SEARCH_HEADER_CR: %c[%02x]\n", ch, ch));
71 lexer->state = HTTP_HEADERLEXER_STATE_READ_VALUE_MESSAGE;
72 *result = HTTP_HEADERLEXER_RESULT_MESSAGEHEADER_END;
75 /* TODO: below error case. */
76 if ((ch == ' ')&&(ch = '\t')) {
77 lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDVALUE_LWS;
78 *result = HTTP_HEADERLEXER_RESULT_LWS;
81 lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDNAME;
82 *result = HTTP_HEADERLEXER_RESULT_FIELDNAME;
84 case HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDNAME:
85 DP_STATE(("state = READ_HEADER_FIELDNAME: %c[%02x]\n", ch, ch));
87 lexer->state = HTTP_HEADERLEXER_STATE_HERDER_CR;
91 lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDVALUE;
92 *result = HTTP_HEADERLEXER_RESULT_FIELDNAME_END;
95 /* TODO: handling error charactors for "token" */
96 *result = HTTP_HEADERLEXER_RESULT_FIELDNAME;
98 case HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDVALUE:
99 DP_STATE(("state = READ_HEADER_FIELDVALUE: %c[%02x]\n", ch, ch));
101 lexer->state = HTTP_HEADERLEXER_STATE_HERDER_CR;
104 if ((ch == ' ')&&(ch = '\t')) {
105 lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDVALUE_LWS;
106 *result = HTTP_HEADERLEXER_RESULT_LWS;
109 *result = HTTP_HEADERLEXER_RESULT_FIELDCONTENT;
111 case HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDVALUE_LWS:
112 DP_STATE(("state = READ_HEADER_FIELDVALUE_LWS: %c[%02x]\n", ch, ch));
114 lexer->state = HTTP_HEADERLEXER_STATE_HERDER_CR;
117 if ((ch != ' ')&&(ch != '\t')) {
118 lexer->state = HTTP_HEADERLEXER_STATE_READ_HEADER_FIELDVALUE;
119 *result = HTTP_HEADERLEXER_RESULT_FIELDCONTENT;
123 case HTTP_HEADERLEXER_STATE_HERDER_CR:
124 DP_STATE(("state = HERDER_CR: %c[%02x]\n", ch, ch));
126 lexer->state = HTTP_HEADERLEXER_STATE_SEARCH_HEADER;
129 case HTTP_HEADERLEXER_STATE_READ_VALUE_MESSAGE:
130 DP_STATE(("state = READ_VALUE_MESSAGE: %c[%02x]\n", ch, ch));
136 EXPORT W http_headerlexer_initialize(http_headerlexer_t *lexer)
138 lexer->state = HTTP_HEADERLEXER_STATE_SEARCH_HEADER;
142 EXPORT VOID http_headerlexer_finalize(http_headerlexer_t *lexer)