Use error label, instead of returning directly

event_stream
Ryan Dahl 16 years ago
parent 2fc9c8d801
commit 0cbc9101d0

@ -251,13 +251,12 @@ enum flags
, F_TRAILING = 0x0010 , F_TRAILING = 0x0010
}; };
#define ERROR (p - data)
#define CR '\r' #define CR '\r'
#define LF '\n' #define LF '\n'
#define LOWER(c) (unsigned char)(c | 0x20) #define LOWER(c) (unsigned char)(c | 0x20)
#if HTTP_PARSER_STRICT #if HTTP_PARSER_STRICT
# define STRICT_CHECK(cond) if (cond) return ERROR # define STRICT_CHECK(cond) if (cond) goto error
# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) # define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead)
#else #else
# define STRICT_CHECK(cond) # define STRICT_CHECK(cond)
@ -297,7 +296,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
/* this state is used after a 'Connection: close' message /* this state is used after a 'Connection: close' message
* the parser will error out if it reads another message * the parser will error out if it reads another message
*/ */
return ERROR; goto error;
case s_start_res: case s_start_res:
{ {
@ -316,7 +315,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -342,7 +341,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
case s_res_first_http_major: case s_res_first_http_major:
if (ch < '1' || ch > '9') return ERROR; if (ch < '1' || ch > '9') goto error;
parser->http_major = ch - '0'; parser->http_major = ch - '0';
state = s_res_http_major; state = s_res_http_major;
break; break;
@ -355,18 +354,18 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
} }
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->http_major *= 10; parser->http_major *= 10;
parser->http_major += ch - '0'; parser->http_major += ch - '0';
if (parser->http_major > 999) return ERROR; if (parser->http_major > 999) goto error;
break; break;
} }
/* first digit of minor HTTP version */ /* first digit of minor HTTP version */
case s_res_first_http_minor: case s_res_first_http_minor:
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->http_minor = ch - '0'; parser->http_minor = ch - '0';
state = s_res_http_minor; state = s_res_http_minor;
break; break;
@ -379,12 +378,12 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
} }
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->http_minor *= 10; parser->http_minor *= 10;
parser->http_minor += ch - '0'; parser->http_minor += ch - '0';
if (parser->http_minor > 999) return ERROR; if (parser->http_minor > 999) goto error;
break; break;
} }
@ -394,7 +393,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
if (ch == ' ') { if (ch == ' ') {
break; break;
} }
return ERROR; goto error;
} }
parser->status_code = ch - '0'; parser->status_code = ch - '0';
state = s_res_status_code; state = s_res_status_code;
@ -415,7 +414,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
state = s_header_field_start; state = s_header_field_start;
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -423,7 +422,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
parser->status_code *= 10; parser->status_code *= 10;
parser->status_code += ch - '0'; parser->status_code += ch - '0';
if (parser->status_code > 999) return ERROR; if (parser->status_code > 999) goto error;
break; break;
} }
@ -479,7 +478,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -528,7 +527,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
@ -601,7 +600,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
} }
return ERROR; goto error;
} }
case s_req_schema: case s_req_schema:
@ -615,7 +614,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
} }
return ERROR; goto error;
} }
case s_req_schema_slash: case s_req_schema_slash:
@ -650,7 +649,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
state = s_req_http_start; state = s_req_http_start;
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -672,7 +671,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
state = s_req_http_start; state = s_req_http_start;
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -708,7 +707,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
state = s_req_fragment_start; state = s_req_fragment_start;
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -742,7 +741,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
state = s_req_fragment_start; state = s_req_fragment_start;
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -774,7 +773,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
state = s_req_fragment_start; state = s_req_fragment_start;
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -809,7 +808,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
case '#': case '#':
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -840,7 +839,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
case '#': case '#':
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
} }
@ -853,7 +852,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
case ' ': case ' ':
break; break;
default: default:
return ERROR; goto error;
} }
break; break;
@ -879,7 +878,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
/* first digit of major HTTP version */ /* first digit of major HTTP version */
case s_req_first_http_major: case s_req_first_http_major:
if (ch < '1' || ch > '9') return ERROR; if (ch < '1' || ch > '9') goto error;
parser->http_major = ch - '0'; parser->http_major = ch - '0';
state = s_req_http_major; state = s_req_http_major;
break; break;
@ -892,18 +891,18 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
} }
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->http_major *= 10; parser->http_major *= 10;
parser->http_major += ch - '0'; parser->http_major += ch - '0';
if (parser->http_major > 999) return ERROR; if (parser->http_major > 999) goto error;
break; break;
} }
/* first digit of minor HTTP version */ /* first digit of minor HTTP version */
case s_req_first_http_minor: case s_req_first_http_minor:
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->http_minor = ch - '0'; parser->http_minor = ch - '0';
state = s_req_http_minor; state = s_req_http_minor;
break; break;
@ -923,19 +922,19 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
/* XXX allow spaces after digit? */ /* XXX allow spaces after digit? */
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->http_minor *= 10; parser->http_minor *= 10;
parser->http_minor += ch - '0'; parser->http_minor += ch - '0';
if (parser->http_minor > 999) return ERROR; if (parser->http_minor > 999) goto error;
break; break;
} }
/* end of request line */ /* end of request line */
case s_req_line_almost_done: case s_req_line_almost_done:
{ {
if (ch != LF) return ERROR; if (ch != LF) goto error;
state = s_header_field_start; state = s_header_field_start;
break; break;
} }
@ -954,7 +953,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
c = LOWER(ch); c = LOWER(ch);
if (c < 'a' || 'z' < c) return ERROR; if (c < 'a' || 'z' < c) goto error;
MARK(header_field); MARK(header_field);
@ -1078,7 +1077,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
} }
return ERROR; goto error;
} }
case s_header_value_start: case s_header_value_start:
@ -1119,7 +1118,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
case h_content_length: case h_content_length:
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->content_length = ch - '0'; parser->content_length = ch - '0';
break; break;
@ -1171,7 +1170,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
break; break;
case h_content_length: case h_content_length:
if (ch < '0' || ch > '9') return ERROR; if (ch < '0' || ch > '9') goto error;
parser->content_length *= 10; parser->content_length *= 10;
parser->content_length += ch - '0'; parser->content_length += ch - '0';
break; break;
@ -1313,7 +1312,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
assert(parser->flags & F_CHUNKED); assert(parser->flags & F_CHUNKED);
c = unhex[(int)ch]; c = unhex[(int)ch];
if (c == -1) return ERROR; if (c == -1) goto error;
parser->content_length = c; parser->content_length = c;
state = s_chunk_size; state = s_chunk_size;
break; break;
@ -1335,7 +1334,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
state = s_chunk_parameters; state = s_chunk_parameters;
break; break;
} }
return ERROR; goto error;
} }
parser->content_length *= 16; parser->content_length *= 16;
@ -1401,7 +1400,7 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
default: default:
assert(0 && "unhandled state"); assert(0 && "unhandled state");
return ERROR; goto error;
} }
} }
@ -1417,6 +1416,9 @@ size_t parse (http_parser *parser, const char *data, size_t len, int start_state
parser->header_index = header_index; parser->header_index = header_index;
return len; return len;
error:
return (p - data);
} }

Loading…
Cancel
Save