Snuggledash icon

Polipo: Add support for OPTIONS method

Snuggledash | PRO | 10/30/14 02:43:57 PM UTC | 0 ⭐ | 729 👁️ | Never ⏰ | []
Diff |

3.42 KB

|

None

|

0 👍

/

0 👎

--- a/client.c
+++ b/client.c
@@ -739,7 +739,7 @@ httpClientRequest
 
     if(body_len < 0) {
         if(request->method == METHOD_GET || request->method == METHOD_HEAD ||
-           request->method == METHOD_POST)
+           request->method == METHOD_POST || request->method == METHOD_OPTIONS)
             body_len = 0;
     }
     connection->bodylen = body_len;
@@ -868,7 +868,8 @@ httpClientRequestContinue
         httpLocalRequest :
         httpServerRequest;
 
-    if(request->method == METHOD_POST || request->method == METHOD_PUT) {
+    if(request->method == METHOD_POST || request->method == METHOD_PUT
+       || request->method == METHOD_OPTIONS) {
         do {
             object = findObject(OBJECT_HTTP, url->string, url->length);
             if(object) {
diff --git a/http.h b/http.h
index 2a06a5a..3771421 100644
--- a/http.h
+++ b/http.h
@@ -105,6 +105,7 @@ typedef struct _HTTPConnection {
 #define METHOD_CONNECT 3
 #define METHOD_POST 4
 #define METHOD_PUT 5
+#define METHOD_OPTIONS 6
 
 #define REQUEST_SIDE(request) ((request)->method >= METHOD_POST)
 
diff --git a/http_parse.c b/http_parse.c
index a5940ff..20f376a 100644
--- a/http_parse.c
+++ b/http_parse.c
@@ -417,6 +417,8 @@ httpParseClientFirstLine
         method = METHOD_PUT;
     else if(y == x + 7 && memcmp(buf + x, "CONNECT", 7) == 0)
         method = METHOD_CONNECT;
+    else if(y == x + 7 && memcmp(buf + x, "OPTIONS", 7) == 0)
+        method = METHOD_OPTIONS;
     else
         method = METHOD_UNKNOWN;
 
diff --git a/polipo.texi b/polipo.texi
index 3f3adf4..1a1b0e5 100644
--- a/polipo.texi
+++ b/polipo.texi
@@ -305,10 +305,10 @@
 resource with a different instance; it is typically used by web
 publishing applications.
 
-@samp{POST} and @samp{PUT} requests are handled by Polipo pretty much
-like @samp{GET} and @samp{HEAD}; however, for various reasons, some
-precautions must be taken.  In particular, any cached data for the
-resource they refer to must be discarded, and they can never be
+@samp{POST}, @samp{PUT} and @samp{OPTIONS} requests are handled by
+Polipo pretty much like @samp{GET} and @samp{HEAD}; however, for various
+reasons, some precautions must be taken.  In particular, any cached data
+for the resource they refer to must be discarded, and they can never be
 pipelined.
 
 Finally, HTTP/1.1 includes a convenient backdoor with the
@@ -316,7 +316,7 @@
 @ref{Tunnelling connections}.
 
 Polipo does not currently handle the more exotic methods such as
-@samp{OPTIONS} and @samp{PROPFIND}.
+@samp{PROPFIND}.
 
 @node Running, Network, Background, Top
 @chapter Running Polipo
diff --git a/server.c b/server.c
index e445d53..3e697a1 100644
--- a/server.c
+++ b/server.c
@@ -467,7 +467,8 @@ httpMakeServerRequest
             return 1;
         }
     } else if(expectContinue >= 2 && server->version == HTTP_11) {
-        if(request->method == METHOD_POST || request->method == METHOD_PUT)
+        if(request->method == METHOD_POST || request->method == METHOD_PUT
+           || request->method == METHOD_OPTIONS)
             request->flags |= REQUEST_WAIT_CONTINUE;
     }
 
@@ -1593,6 +1594,7 @@ httpWriteRequest
     case METHOD_HEAD: m = "HEAD"; break;
     case METHOD_POST: m = "POST"; break;
     case METHOD_PUT: m = "PUT"; break;
+    case METHOD_OPTIONS: m = "OPTIONS"; break;
     default: abort();
     }
     n = snnprintf(connection->reqbuf, n, bufsize, "%s ", m);

Comments