leverage TOKEN_SKIPPING better in parser

Signed-off-by: Andy Green <andy.green@linaro.org>
diff --git a/lib/parsers.c b/lib/parsers.c
index 3577ec2..5ee5f46 100644
--- a/lib/parsers.c
+++ b/lib/parsers.c
@@ -351,7 +351,7 @@
 
 		/* allocate appropriate memory */
 		if (wsi->utf8_token[wsi->u.hdr.parser_state].token_len ==
-						   wsi->u.hdr.current_alloc_len - 1) {
+					     wsi->u.hdr.current_alloc_len - 1) {
 			/* need to extend */
 			wsi->u.hdr.current_alloc_len += LWS_ADDITIONAL_HDR_ALLOC;
 			if (wsi->u.hdr.current_alloc_len >= LWS_MAX_HEADER_LEN) {
@@ -415,8 +415,32 @@
 		wsi->u.hdr.name_buffer[wsi->u.hdr.name_buffer_pos] = '\0';
 
 		wsi->u.hdr.lextable_pos = lextable_decode(wsi->u.hdr.lextable_pos, c);
+		if (wsi->u.hdr.lextable_pos < 0) {
+			/* this is not a header we know about */
+			if (wsi->utf8_token[WSI_TOKEN_GET_URI].token_len) {
+				/* if not the method, just skip it all */
+				wsi->u.hdr.parser_state = WSI_TOKEN_SKIPPING;
+				break;
+			}
+			/* hm it's an unknown http method in fact */
+			if (c == ' ') {
+				lwsl_info("Unknown method %s\n", wsi->u.hdr.name_buffer);
+				/* treat it as GET */
+				wsi->u.hdr.parser_state = WSI_TOKEN_GET_URI;
+				wsi->u.hdr.current_alloc_len = LWS_INITIAL_HDR_ALLOC;
+				wsi->utf8_token[WSI_TOKEN_GET_URI].token =
+					(char *)malloc(wsi->u.hdr.current_alloc_len);
+				if (wsi->utf8_token[WSI_TOKEN_GET_URI].token == NULL) {
+					lwsl_err("Out of mem\n");
+					return -1;
+				}
+				break;
+			}
+		}
 		if (lextable[wsi->u.hdr.lextable_pos + 1] == 0) {
 
+			/* terminal state */
+
 			n = lextable[wsi->u.hdr.lextable_pos] & 0x7f;
 
 			lwsl_parser("known hdr '%s'\n", wsi->u.hdr.name_buffer);
@@ -446,36 +470,10 @@
 			}
 		}
 
-		/* colon delimiter means we just don't know this name */
+		if (wsi->u.hdr.parser_state == WSI_TOKEN_CHALLENGE)
+			goto set_parsing_complete;
 
-		if (wsi->u.hdr.parser_state == WSI_TOKEN_NAME_PART) {
-			if (c == ':') {
-				lwsl_parser("skipping unknown header '%s'\n",
-							  wsi->u.hdr.name_buffer);
-				wsi->u.hdr.parser_state = WSI_TOKEN_SKIPPING;
-				break;
-			}
-
-			if (c == ' ' &&
-				!wsi->utf8_token[WSI_TOKEN_GET_URI].token_len) {
-				lwsl_parser("unknown method '%s'\n",
-							  wsi->u.hdr.name_buffer);
-				wsi->u.hdr.parser_state = WSI_TOKEN_GET_URI;
-				wsi->u.hdr.current_alloc_len = LWS_INITIAL_HDR_ALLOC;
-				wsi->utf8_token[WSI_TOKEN_GET_URI].token =
-					(char *)malloc(wsi->u.hdr.current_alloc_len);
-				if (wsi->utf8_token[WSI_TOKEN_GET_URI].token == NULL) {
-					lwsl_err("Out of mem\n");
-					return -1;
-				}
-				break;
-			}
-		}
-
-		if (wsi->u.hdr.parser_state != WSI_TOKEN_CHALLENGE)
-			break;
-
-		goto set_parsing_complete;
+		break;
 
 		/* skipping arg part of a name we didn't recognize */
 	case WSI_TOKEN_SKIPPING: