diff src/http/ngx_http_parse.c @ 91:637625a2acdb

nginx-0.0.1-2003-05-19-20:39:14 import
author Igor Sysoev <igor@sysoev.ru>
date Mon, 19 May 2003 16:39:14 +0000
parents 29bf798b583f
children a059e1aa65d4
line wrap: on
line diff
--- a/src/http/ngx_http_parse.c
+++ b/src/http/ngx_http_parse.c
@@ -9,13 +9,24 @@ int ngx_parse_http_request_line(ngx_http
     char  *p;
     enum {
         sw_start = 0,
+        sw_G,
+        sw_GE,
+        sw_H,
+        sw_HE,
+        sw_HEA,
+        sw_P,
+        sw_PO,
+        sw_POS,
         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_http_H,
+        sw_http_HT,
+        sw_http_HTT,
+        sw_http_HTTP,
         sw_first_major_digit,
         sw_major_digit,
         sw_first_minor_digit,
@@ -30,7 +41,7 @@ int ngx_parse_http_request_line(ngx_http
     while (p < r->header_in->last && state < sw_done) {
         ch = *p++;
 
-        /* GCC 2.95.2 and VC 6.0 compile this switch as jump table */
+        /* gcc 2.95.2 and vc 6.0 compile this switch as an jump table */
 
         switch (state) {
 
@@ -40,49 +51,100 @@ int ngx_parse_http_request_line(ngx_http
 
             switch (ch) {
             case 'G':
-                if (p + 1 >= r->header_in->last) {
-                    return NGX_AGAIN;
-                }
-
-                if (*p != 'E' || *(p + 1) != 'T') {
-                    return NGX_HTTP_PARSE_INVALID_METHOD;
-                }
-
-                r->method = NGX_HTTP_GET;
-                p += 2;
+                state = sw_G;
+                break;
+            case 'H':
+                state = sw_H;
                 break;
-
-            case 'H':
-                if (p + 2 >= r->header_in->last) {
-                    return NGX_AGAIN;
-                }
+            case 'P':
+                state = sw_P;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
+            break;
 
-                if (*p != 'E' || *(p + 1) != 'A' || *(p + 2) != 'D') {
-                    return NGX_HTTP_PARSE_INVALID_METHOD;
-                }
-
-                r->method = NGX_HTTP_HEAD;
-                p += 3;
+        case sw_G:
+            switch (ch) {
+            case 'E':
+                state = sw_GE;
                 break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
+            break;
 
-            case 'P':
-                if (p + 2 >= r->header_in->last) {
-                    return NGX_AGAIN;
-                }
+        case sw_GE:
+            switch (ch) {
+            case 'T':
+                r->method = NGX_HTTP_GET;
+                state = sw_space_after_method;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
+            break;
 
-                if (*p != 'O' || *(p + 1) != 'S' || *(p + 2) != 'T') {
-                    return NGX_HTTP_PARSE_INVALID_METHOD;
-                }
-
-                r->method = NGX_HTTP_POST;
-                p += 3;
+        case sw_H:
+            switch (ch) {
+            case 'E':
+                state = sw_HE;
                 break;
-
             default:
                 return NGX_HTTP_PARSE_INVALID_METHOD;
             }
+            break;
 
-            state = sw_space_after_method;
+        case sw_HE:
+            switch (ch) {
+            case 'A':
+                state = sw_HEA;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
+            break;
+
+        case sw_HEA:
+            switch (ch) {
+            case 'D':
+                r->method = NGX_HTTP_HEAD;
+                state = sw_space_after_method;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
+            break;
+
+        case sw_P:
+            switch (ch) {
+            case 'O':
+                state = sw_PO;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
+            break;
+
+        case sw_PO:
+            switch (ch) {
+            case 'S':
+                state = sw_POS;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
+            break;
+
+        case sw_POS:
+            switch (ch) {
+            case 'T':
+                r->method = NGX_HTTP_POST;
+                state = sw_space_after_method;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_METHOD;
+            }
             break;
 
         /* single space after method */
@@ -214,27 +276,51 @@ int ngx_parse_http_request_line(ngx_http
                 state = sw_done;
                 break;
             case 'H':
-                state = sw_http_version;
+                state = sw_http_H;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_REQUEST;
+            }
+            break;
+
+        case sw_http_H:
+            switch (ch) {
+            case 'T':
+                state = sw_http_HT;
                 break;
             default:
                 return NGX_HTTP_PARSE_INVALID_REQUEST;
             }
             break;
 
-        /* "TTP/" */
-        case sw_http_version:
-            if (p + 2 >= r->header_in->last) {
-                r->state = sw_http_version;
-                r->header_in->pos = p - 1;
-                return NGX_AGAIN;
-            }
-
-            if (ch != 'T' || *p != 'T' || *(p + 1) != 'P' || *(p + 2) != '/') {
+        case sw_http_HT:
+            switch (ch) {
+            case 'T':
+                state = sw_http_HTT;
+                break;
+            default:
                 return NGX_HTTP_PARSE_INVALID_REQUEST;
             }
+            break;
 
-            p += 3;
-            state = sw_first_major_digit;
+        case sw_http_HTT:
+            switch (ch) {
+            case 'P':
+                state = sw_http_HTTP;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_REQUEST;
+            }
+            break;
+
+        case sw_http_HTTP:
+            switch (ch) {
+            case '/':
+                state = sw_first_major_digit;
+                break;
+            default:
+                return NGX_HTTP_PARSE_INVALID_REQUEST;
+            }
             break;
 
         /* first digit of major HTTP version */