389fac3
From d56a0700d0d9ccad427995e3da88856a96d2a455 Mon Sep 17 00:00:00 2001
389fac3
From: Nathan Rajlich <nathan@tootallnate.net>
389fac3
Date: Tue, 12 Oct 2010 11:23:22 -0700
389fac3
Subject: [PATCH 1/2] Add support for "M-SEARCH" and "NOTIFY" request methods.
389fac3
389fac3
Allow a request path of "*" (for SSDP requests).
389fac3
---
389fac3
 http_parser.c |    9 +++++++--
389fac3
 http_parser.h |    3 +++
389fac3
 test.c        |   25 +++++++++++++++++++++++++
389fac3
 3 files changed, 35 insertions(+), 2 deletions(-)
389fac3
389fac3
diff --git a/http_parser.c b/http_parser.c
389fac3
index 492ef17..57a1b94 100644
389fac3
--- a/http_parser.c
389fac3
+++ b/http_parser.c
389fac3
@@ -93,6 +93,8 @@ static const char *method_strings[] =
389fac3
   , "MKACTIVITY"
389fac3
   , "CHECKOUT"
389fac3
   , "MERGE"
389fac3
+  , "M-SEARCH"
389fac3
+  , "NOTIFY"
389fac3
   };
389fac3
 
389fac3
 
389fac3
@@ -575,7 +577,8 @@ size_t http_parser_execute (http_parser *parser,
389fac3
           case 'G': parser->method = HTTP_GET; break;
389fac3
           case 'H': parser->method = HTTP_HEAD; break;
389fac3
           case 'L': parser->method = HTTP_LOCK; break;
389fac3
-          case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE */ break;
389fac3
+          case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break;
389fac3
+          case 'N': parser->method = HTTP_NOTIFY; break;
389fac3
           case 'O': parser->method = HTTP_OPTIONS; break;
389fac3
           case 'P': parser->method = HTTP_POST; /* or PROPFIND or PROPPATCH or PUT */ break;
389fac3
           case 'R': parser->method = HTTP_REPORT; break;
389fac3
@@ -608,6 +611,8 @@ size_t http_parser_execute (http_parser *parser,
389fac3
             parser->method = HTTP_MOVE;
389fac3
           } else if (index == 1 && ch == 'E') {
389fac3
             parser->method = HTTP_MERGE;
389fac3
+          } else if (index == 1 && ch == '-') {
389fac3
+            parser->method = HTTP_MSEARCH;
389fac3
           } else if (index == 2 && ch == 'A') {
389fac3
             parser->method = HTTP_MKACTIVITY;
389fac3
           }
389fac3
@@ -628,7 +633,7 @@ size_t http_parser_execute (http_parser *parser,
389fac3
       {
389fac3
         if (ch == ' ') break;
389fac3
 
389fac3
-        if (ch == '/') {
389fac3
+        if (ch == '/' || ch == '*') {
389fac3
           MARK(url);
389fac3
           MARK(path);
389fac3
           state = s_req_path;
389fac3
diff --git a/http_parser.h b/http_parser.h
389fac3
index ca7f562..43cc1bd 100644
389fac3
--- a/http_parser.h
389fac3
+++ b/http_parser.h
389fac3
@@ -101,6 +101,9 @@ enum http_method
389fac3
   , HTTP_MKACTIVITY
389fac3
   , HTTP_CHECKOUT
389fac3
   , HTTP_MERGE
389fac3
+  /* ssdp */
389fac3
+  , HTTP_MSEARCH
389fac3
+  , HTTP_NOTIFY
389fac3
   };
389fac3
 
389fac3
 
389fac3
diff --git a/test.c b/test.c
389fac3
index d1feae0..e5699aa 100644
389fac3
--- a/test.c
389fac3
+++ b/test.c
389fac3
@@ -557,6 +557,31 @@ const struct message requests[] =
389fac3
   ,.body= ""
389fac3
   }
389fac3
 
389fac3
+#define MSEARCH_REQ 19
389fac3
+, {.name= "m-search request"
389fac3
+  ,.type= HTTP_REQUEST
389fac3
+  ,.raw= "M-SEARCH * HTTP/1.1\r\n"
389fac3
+         "HOST: 239.255.255.250:1900\r\n"
389fac3
+         "MAN: \"ssdp:discover\"\r\n"
389fac3
+         "ST: \"ssdp:all\"\r\n"
389fac3
+         "\r\n"
389fac3
+  ,.should_keep_alive= TRUE
389fac3
+  ,.message_complete_on_eof= FALSE
389fac3
+  ,.http_major= 1
389fac3
+  ,.http_minor= 1
389fac3
+  ,.method= HTTP_MSEARCH
389fac3
+  ,.query_string= ""
389fac3
+  ,.fragment= ""
389fac3
+  ,.request_path= "*"
389fac3
+  ,.request_url= "*"
389fac3
+  ,.num_headers= 3
389fac3
+  ,.headers= { { "HOST", "239.255.255.250:1900" }
389fac3
+             , { "MAN", "\"ssdp:discover\"" }
389fac3
+             , { "ST", "\"ssdp:all\"" }
389fac3
+             }
389fac3
+  ,.body= ""
389fac3
+  }
389fac3
+
389fac3
 , {.name= NULL } /* sentinel */
389fac3
 };
389fac3
 
389fac3
-- 
389fac3
1.7.3.4
389fac3