Mercurial > hg > nginx
diff src/http/ngx_http_parse.c @ 7:b5481d6fbbd4
nginx-0.0.1-2002-08-29-20:59:54 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 29 Aug 2002 16:59:54 +0000 |
parents | d220029ac7f3 |
children | 6f58641241bb |
line wrap: on
line diff
--- a/src/http/ngx_http_parse.c +++ b/src/http/ngx_http_parse.c @@ -1,47 +1,47 @@ #include <ngx_config.h> +#include <ngx_core.h> #include <ngx_http.h> int ngx_read_http_request_line(ngx_http_request_t *r) { char ch; - char *buff = r->buff->buff; - char *p = r->buff->pos; + char *p = r->header_in->pos.mem; enum { - rl_start = 0, - rl_space_after_method, - rl_spaces_before_uri, - rl_after_slash_in_uri, - rl_check_uri, - rl_uri, - rl_http_09, - rl_http_version, - rl_first_major_digit, - rl_major_digit, - rl_first_minor_digit, - rl_minor_digit, - rl_almost_done, - rl_done + sw_start = 0, + sw_space_after_method, + sw_spaces_before_uri, + sw_after_slash_in_uri, + sw_check_uri, + sw_uri, + sw_http_09, + sw_http_version, + sw_first_major_digit, + sw_major_digit, + sw_first_minor_digit, + sw_minor_digit, + sw_almost_done, + sw_done } state = r->state; - while (p < r->buff->last && state < rl_done) { + while (p < r->header_in->last.mem && state < sw_done) { ch = *p++; /* printf("\nstate: %d, pos: %x, end: %x, char: '%c' buf: %s", - state, p, r->buff->last, ch, p); + state, p, r->header_in->last, ch, p); */ - /* GCC complie it as jump table */ + /* GCC compiles switch as jump table */ switch (state) { /* HTTP methods: GET, HEAD, POST */ - case rl_start: + case sw_start: switch (ch) { case 'G': - if (p + 1 >= r->buff->last) - return 0; + if (p + 1 >= r->header_in->last.mem) + return NGX_AGAIN; if (*p != 'E' || *(p + 1) != 'T') return NGX_HTTP_INVALID_METHOD; @@ -51,8 +51,8 @@ printf("\nstate: %d, pos: %x, end: %x, c break; case 'H': - if (p + 2 >= r->buff->last) - return 0; + if (p + 2 >= r->header_in->last.mem) + return NGX_AGAIN; if (*p != 'E' || *(p + 1) != 'A' || *(p + 2) != 'D') return NGX_HTTP_INVALID_METHOD; @@ -62,8 +62,8 @@ printf("\nstate: %d, pos: %x, end: %x, c break; case 'P': - if (p + 2 >= r->buff->last) - return 0; + if (p + 2 >= r->header_in->last.mem) + return NGX_AGAIN; if (*p != 'O' || *(p + 1) != 'S' || *(p + 2) != 'T') return NGX_HTTP_INVALID_METHOD; @@ -76,14 +76,14 @@ printf("\nstate: %d, pos: %x, end: %x, c return NGX_HTTP_INVALID_METHOD; } - state = rl_space_after_method; + state = sw_space_after_method; break; /* single space after method */ - case rl_space_after_method: + case sw_space_after_method: switch (ch) { case ' ': - state = rl_spaces_before_uri; + state = sw_spaces_before_uri; break; default: return NGX_HTTP_INVALID_METHOD; @@ -91,123 +91,123 @@ printf("\nstate: %d, pos: %x, end: %x, c break; /* space* before URI */ - case rl_spaces_before_uri: + case sw_spaces_before_uri: switch (ch) { case '/': r->uri_start = p - 1; - state = rl_after_slash_in_uri; + state = sw_after_slash_in_uri; break; case ' ': break; default: r->unusual_uri = 1; r->uri_start = p - 1; - state = rl_uri; + state = sw_uri; break; } break; /* check dot after slash */ - case rl_after_slash_in_uri: + case sw_after_slash_in_uri: switch (ch) { case CR: r->uri_end = p - 1; r->http_minor = 9; - state = rl_almost_done; + state = sw_almost_done; break; case LF: r->uri_end = p - 1; r->http_minor = 9; - state = rl_done; + state = sw_done; break; case ' ': r->uri_end = p - 1; - state = rl_http_09; + state = sw_http_09; break; case '.': r->complex_uri = 1; - state = rl_uri; + state = sw_uri; break; case '/': r->complex_uri = 1; - state = rl_uri; + state = sw_uri; break; case '?': r->args_start = p; - state = rl_uri; + state = sw_uri; break; default: - state = rl_check_uri; + state = sw_check_uri; break; } break; /* check slash in URI */ - case rl_check_uri: + case sw_check_uri: switch (ch) { case CR: r->uri_end = p - 1; r->http_minor = 9; - state = rl_almost_done; + state = sw_almost_done; break; case LF: r->uri_end = p - 1; r->http_minor = 9; - state = rl_done; + state = sw_done; break; case ' ': r->uri_end = p - 1; - state = rl_http_09; + state = sw_http_09; break; case '.': r->uri_ext = p; break; case '/': r->uri_ext = NULL; - state = rl_after_slash_in_uri; + state = sw_after_slash_in_uri; break; case '?': r->args_start = p; - state = rl_uri; + state = sw_uri; break; } break; /* URI */ - case rl_uri: + case sw_uri: switch (ch) { case CR: r->uri_end = p - 1; r->http_minor = 9; - state = rl_almost_done; + state = sw_almost_done; break; case LF: r->uri_end = p - 1; r->http_minor = 9; - state = rl_done; + state = sw_done; break; case ' ': r->uri_end = p - 1; - state = rl_http_09; + state = sw_http_09; break; } break; /* space+ after URI */ - case rl_http_09: + case sw_http_09: switch (ch) { case ' ': break; case CR: r->http_minor = 9; - state = rl_almost_done; + state = sw_almost_done; break; case LF: r->http_minor = 9; - state = rl_done; + state = sw_done; break; case 'H': - state = rl_http_version; + state = sw_http_version; break; default: return NGX_HTTP_INVALID_REQUEST; @@ -215,33 +215,33 @@ printf("\nstate: %d, pos: %x, end: %x, c break; /* TTP/ */ - case rl_http_version: - if (p + 2 >= r->buff->last) { - r->state = rl_http_version; - r->buff->pos = p - 1; - return 0; + case sw_http_version: + if (p + 2 >= r->header_in->last.mem) { + r->state = sw_http_version; + r->header_in->pos.mem = p - 1; + return NGX_AGAIN; } if (ch != 'T' || *p != 'T' || *(p + 1) != 'P' || *(p + 2) != '/') return NGX_HTTP_INVALID_REQUEST; p += 3; - state = rl_first_major_digit; + state = sw_first_major_digit; break; /* first digit of major HTTP version */ - case rl_first_major_digit: + case sw_first_major_digit: if (ch < '1' || ch > '9') return NGX_HTTP_INVALID_REQUEST; r->http_major = ch - '0'; - state = rl_major_digit; + state = sw_major_digit; break; /* major HTTP version or dot */ - case rl_major_digit: + case sw_major_digit: if (ch == '.') { - state = rl_first_minor_digit; + state = sw_first_minor_digit; break; } @@ -252,24 +252,24 @@ printf("\nstate: %d, pos: %x, end: %x, c break; /* first digit of minor HTTP version */ - case rl_first_minor_digit: + case sw_first_minor_digit: if (ch < '0' || ch > '9') return NGX_HTTP_INVALID_REQUEST; r->http_minor = ch - '0'; - state = rl_minor_digit; + state = sw_minor_digit; break; /* minor HTTP version or end of request line */ - case rl_minor_digit: + case sw_minor_digit: if (ch == CR) { - state = rl_almost_done; + state = sw_almost_done; break; } if (ch == LF) { - state = rl_done; + state = sw_done; break; } @@ -280,70 +280,72 @@ printf("\nstate: %d, pos: %x, end: %x, c break; /* end of request line */ - case rl_almost_done: + case sw_almost_done: switch (ch) { case LF: - state = rl_done; + state = sw_done; break; default: - return NGX_HTTP_INVALID_METHOD; + return NGX_HTTP_INVALID_REQUEST; } break; } } - r->buff->pos = p; + r->header_in->pos.mem = p; - if (state == rl_done) { + if (state == sw_done) { r->http_version = r->http_major * 1000 + r->http_minor; - r->state = rl_start; - return 1; + r->state = sw_start; + if (r->http_version == 9 && r->method == NGX_HTTP_HEAD) + return NGX_HTTP_INVALID_HEAD; + else + return NGX_OK; } else { r->state = state; - return 0; + return NGX_AGAIN; } } int ngx_read_http_header_line(ngx_http_request_t *r) { char c, ch; - char *buff = r->buff->buff; - char *p = r->buff->pos; + char *p = r->header_in->pos.mem; enum { - hl_start = 0, - hl_name, - hl_space_before_value, - hl_value, - hl_space_after_value, - hl_almost_done, - header_almost_done, - hl_done, - header_done + sw_start = 0, + sw_name, + sw_space_before_value, + sw_value, + sw_space_after_value, + sw_almost_done, + sw_header_almost_done, + sw_done, + sw_header_done } state = r->state; - while (p < r->buff->last && state < hl_done) { + while (p < r->header_in->last.mem && state < sw_done) { ch = *p++; /* printf("\nstate: %d, pos: %x, end: %x, char: '%c' buf: %s", - state, p, r->buff->last, ch, p); + state, p, r->header_in->last.mem, ch, p); */ switch (state) { /* first char */ - case hl_start: + case sw_start: switch (ch) { case CR: r->header_end = p - 1; - state = header_almost_done; + state = sw_header_almost_done; break; case LF: r->header_end = p - 1; - state = header_done; + state = sw_header_done; break; default: - state = hl_name; + state = sw_name; r->header_name_start = p - 1; c = ch | 0x20; @@ -362,14 +364,14 @@ printf("\nstate: %d, pos: %x, end: %x, c break; /* header name */ - case hl_name: + case sw_name: c = ch | 0x20; if (c >= 'a' && c <= 'z') break; if (ch == ':') { r->header_name_end = p - 1; - state = hl_space_before_value; + state = sw_space_before_value; break; } @@ -382,65 +384,65 @@ printf("\nstate: %d, pos: %x, end: %x, c return NGX_HTTP_INVALID_HEADER; /* space* before header value */ - case hl_space_before_value: + case sw_space_before_value: switch (ch) { case ' ': break; case CR: r->header_start = r->header_end = p - 1; - state = hl_almost_done; + state = sw_almost_done; break; case LF: r->header_start = r->header_end = p - 1; - state = hl_done; + state = sw_done; break; default: r->header_start = p - 1; - state = hl_value; + state = sw_value; break; } break; /* header value */ - case hl_value: + case sw_value: switch (ch) { case ' ': r->header_end = p - 1; - state = hl_space_after_value; + state = sw_space_after_value; break; case CR: r->header_end = p - 1; - state = hl_almost_done; + state = sw_almost_done; break; case LF: r->header_end = p - 1; - state = hl_done; + state = sw_done; break; } break; /* space* before end of header line */ - case hl_space_after_value: + case sw_space_after_value: switch (ch) { case ' ': break; case CR: - state = hl_almost_done; + state = sw_almost_done; break; case LF: - state = hl_done; + state = sw_done; break; default: - state = hl_value; + state = sw_value; break; } break; /* end of header line */ - case hl_almost_done: + case sw_almost_done: switch (ch) { case LF: - state = hl_done; + state = sw_done; break; default: return NGX_HTTP_INVALID_HEADER; @@ -448,10 +450,10 @@ printf("\nstate: %d, pos: %x, end: %x, c break; /* end of header */ - case header_almost_done: + case sw_header_almost_done: switch (ch) { case LF: - state = header_done; + state = sw_header_done; break; default: return NGX_HTTP_INVALID_HEADER; @@ -460,16 +462,16 @@ printf("\nstate: %d, pos: %x, end: %x, c } } - r->buff->pos = p; + r->header_in->pos.mem = p; - if (state == hl_done) { - r->state = hl_start; - return 1; - } else if (state == header_done) { - r->state = hl_start; - return 2; + if (state == sw_done) { + r->state = sw_start; + return NGX_OK; + } else if (state == sw_header_done) { + r->state = sw_start; + return NGX_HTTP_HEADER_DONE; } else { r->state = state; - return 0; + return NGX_AGAIN; } }