On Fri, Jun 24, 2016 at 10:21:16AM +0200, Michael Lechtermann wrote:
> Hi,
> 
> I have recently configured relayd as SSL accelerator and it is working really 
> great. However it seems that not all http methods that are mentioned in the 
> man page are actually supported by the http protocol.
> 
>      method name
>              Match the HTTP request method.  The method is specified by name
>              and can be either CONNECT, COPY, DELETE, GET, HEAD, LOCK, MKCOL,
>              MOVE, OPTIONS, PATCH, POST, PROPFIND, PROPPATCH, PUT, TRACE, or
>              UNLOCK.
> 
> The above list is from "man relayd.conf" and I would assume that those 
> methods, if mentioned, are fully supported, however when trying to use 
> Apache2 with mod_dav_svn (ap2-subversion) relayd somehow breaks it:
> 
> # svn up
> svn: Server sent unexpected return value (400 Bad Request) in response to 
> OPTIONS request for 'https://<url>/svn/repo'
> 
> This was tested using OpenBSD 5.9. If more information is required, please 
> say so.
> 

I once added the well-known webdav methods to httpd, the attached diff
syncs it to relayd.  Could you give it a try? 

Reyk

Index: usr.sbin/relayd/http.h
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/http.h,v
retrieving revision 1.7
diff -u -p -u -p -r1.7 http.h
--- usr.sbin/relayd/http.h      11 Jun 2015 18:49:09 -0000      1.7
+++ usr.sbin/relayd/http.h      27 Jul 2016 09:36:35 -0000
@@ -1,7 +1,7 @@
-/*     $OpenBSD: http.h,v 1.7 2015/06/11 18:49:09 reyk Exp $   */
+/*     $OpenBSD: http.h,v 1.13 2015/06/11 18:49:09 reyk Exp $  */
 
 /*
- * Copyright (c) 2012 - 2014 Reyk Floeter <[email protected]>
+ * Copyright (c) 2012 - 2015 Reyk Floeter <[email protected]>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -44,6 +44,32 @@ enum httpmethod {
        HTTP_METHOD_LOCK,
        HTTP_METHOD_UNLOCK,
 
+       /* WebDAV Versioning Extension, RFC 3253 */
+       HTTP_METHOD_VERSION_CONTROL,
+       HTTP_METHOD_REPORT,
+       HTTP_METHOD_CHECKOUT,
+       HTTP_METHOD_CHECKIN,
+       HTTP_METHOD_UNCHECKOUT,
+       HTTP_METHOD_MKWORKSPACE,
+       HTTP_METHOD_UPDATE,
+       HTTP_METHOD_LABEL,
+       HTTP_METHOD_MERGE,
+       HTTP_METHOD_BASELINE_CONTROL,
+       HTTP_METHOD_MKACTIVITY,
+
+       /* WebDAV Ordered Collections, RFC 3648 */
+       HTTP_METHOD_ORDERPATCH,
+
+       /* WebDAV Access Control, RFC 3744 */
+       HTTP_METHOD_ACL,
+
+       /* WebDAV Redirect Reference Resources, RFC 4437 */
+       HTTP_METHOD_MKREDIRECTREF,
+       HTTP_METHOD_UPDATEREDIRECTREF,
+
+       /* WebDAV Search, RFC 5323 */
+       HTTP_METHOD_SEARCH,
+
        /* PATCH, RFC 5789 */
        HTTP_METHOD_PATCH,
 
@@ -71,6 +97,22 @@ struct http_method {
        { HTTP_METHOD_MOVE,             "MOVE" },       \
        { HTTP_METHOD_LOCK,             "LOCK" },       \
        { HTTP_METHOD_UNLOCK,           "UNLOCK" },     \
+       { HTTP_METHOD_VERSION_CONTROL,  "VERSION-CONTROL" }, \
+       { HTTP_METHOD_REPORT,           "REPORT" },     \
+       { HTTP_METHOD_CHECKOUT,         "CHECKOUT" },   \
+       { HTTP_METHOD_CHECKIN,          "CHECKIN" },    \
+       { HTTP_METHOD_UNCHECKOUT,       "UNCHECKOUT" }, \
+       { HTTP_METHOD_MKWORKSPACE,      "MKWORKSPACE" }, \
+       { HTTP_METHOD_UPDATE,           "UPDATE" },     \
+       { HTTP_METHOD_LABEL,            "LABEL" },      \
+       { HTTP_METHOD_MERGE,            "MERGE" },      \
+       { HTTP_METHOD_BASELINE_CONTROL, "BASELINE-CONTROL" }, \
+       { HTTP_METHOD_MKACTIVITY,       "MKACTIVITY" }, \
+       { HTTP_METHOD_ORDERPATCH,       "ORDERPATCH" }, \
+       { HTTP_METHOD_ACL,              "ACL" },        \
+       { HTTP_METHOD_MKREDIRECTREF,    "MKREDIRECTREF" }, \
+       { HTTP_METHOD_UPDATEREDIRECTREF, "UPDATEREDIRECTREF" }, \
+       { HTTP_METHOD_SEARCH,           "SEARCH" },     \
        { HTTP_METHOD_PATCH,            "PATCH" },      \
        { HTTP_METHOD_NONE,             NULL }          \
 }
@@ -130,7 +172,8 @@ struct http_error {
        { 415,  "Unsupported Media Type" },             \
        { 416,  "Range Not Satisfiable" },              \
        { 417,  "Expectation Failed" },                 \
-       /* 418-421 unassigned */                        \
+       { 418,  "I'm a teapot" },                       \
+       /* 419-421 unassigned */                        \
        { 420,  "Enhance Your Calm" },                  \
        { 422,  "Unprocessable Entity" },               \
        { 423,  "Locked" },                             \
@@ -142,7 +185,9 @@ struct http_error {
        { 429,  "Too Many Requests" },                  \
        /* 430 unassigned */                            \
        { 431,  "Request Header Fields Too Large" },    \
-       /* 432-499 unassigned */                        \
+       /* 432-450 unassigned */                        \
+       { 451,  "Unavailable For Legal Reasons" },      \
+       /* 452-499 unassigned */                        \
        { 500,  "Internal Server Error" },              \
        { 501,  "Not Implemented" },                    \
        { 502,  "Bad Gateway" },                        \
@@ -176,6 +221,7 @@ struct http_mediatype {
        { "jpeg",       "image",        "jpeg" },       \
        { "jpg",        "image",        "jpeg" },       \
        { "png",        "image",        "png" },        \
+       { "svg",        "image",        "svg+xml" },    \
        { "js",         "application",  "javascript" }, \
        { NULL }                                        \
 }
@@ -191,9 +237,13 @@ struct http_descriptor {
 #define query_key               http_matchquery.kv_key
 #define query_val               http_matchquery.kv_value
 
+       char                    *http_host;
        enum httpmethod          http_method;
        int                      http_chunked;
        char                    *http_version;
+
+       /* Rewritten path remains NULL if not used */
+       char                    *http_path_alias;
 
        /* A tree of headers and attached lists for repeated headers. */
        struct kv               *http_lastheader;
Index: usr.sbin/relayd/relay_http.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relay_http.c,v
retrieving revision 1.57
diff -u -p -u -p -r1.57 relay_http.c
--- usr.sbin/relayd/relay_http.c        27 Jul 2016 06:55:44 -0000      1.57
+++ usr.sbin/relayd/relay_http.c        27 Jul 2016 09:36:36 -0000
@@ -402,12 +402,37 @@ relay_read_http(struct bufferevent *bev,
                case HTTP_METHOD_GET:
                case HTTP_METHOD_HEAD:
                case HTTP_METHOD_OPTIONS:
+               /* WebDAV methods */
+               case HTTP_METHOD_COPY:
+               case HTTP_METHOD_MOVE:
                        cre->toread = 0;
                        break;
-               case HTTP_METHOD_PATCH:
                case HTTP_METHOD_POST:
                case HTTP_METHOD_PUT:
                case HTTP_METHOD_RESPONSE:
+               /* WebDAV methods */
+               case HTTP_METHOD_PROPFIND:
+               case HTTP_METHOD_PROPPATCH:
+               case HTTP_METHOD_MKCOL:
+               case HTTP_METHOD_LOCK:
+               case HTTP_METHOD_UNLOCK:
+               case HTTP_METHOD_VERSION_CONTROL:
+               case HTTP_METHOD_REPORT:
+               case HTTP_METHOD_CHECKOUT:
+               case HTTP_METHOD_CHECKIN:
+               case HTTP_METHOD_UNCHECKOUT:
+               case HTTP_METHOD_MKWORKSPACE:
+               case HTTP_METHOD_UPDATE:
+               case HTTP_METHOD_LABEL:
+               case HTTP_METHOD_MERGE:
+               case HTTP_METHOD_BASELINE_CONTROL:
+               case HTTP_METHOD_MKACTIVITY:
+               case HTTP_METHOD_ORDERPATCH:
+               case HTTP_METHOD_ACL:
+               case HTTP_METHOD_MKREDIRECTREF:
+               case HTTP_METHOD_UPDATEREDIRECTREF:
+               case HTTP_METHOD_SEARCH:
+               case HTTP_METHOD_PATCH:
                        /* HTTP request payload */
                        if (cre->toread > 0)
                                bev->readcb = relay_read_httpcontent;
Index: usr.sbin/relayd/relayd.conf.5
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/relayd.conf.5,v
retrieving revision 1.168
diff -u -p -u -p -r1.168 relayd.conf.5
--- usr.sbin/relayd/relayd.conf.5       6 Nov 2015 18:06:29 -0000       1.168
+++ usr.sbin/relayd/relayd.conf.5       27 Jul 2016 09:36:36 -0000
@@ -1125,23 +1125,39 @@ Match the HTTP request method.
 The method is specified by
 .Ar name
 and can be either
+.Ic ACL ,
+.Ic BASELINE-CONTROL ,
+.Ic CHECKIN ,
+.Ic CHECKOUT ,
 .Ic CONNECT ,
 .Ic COPY ,
 .Ic DELETE ,
 .Ic GET ,
 .Ic HEAD ,
+.Ic LABEL ,
 .Ic LOCK ,
+.Ic MERGE ,
+.Ic MKACTIVITY ,
 .Ic MKCOL ,
+.Ic MKREDIRECTREF ,
+.Ic MKWORKSPACE ,
 .Ic MOVE ,
 .Ic OPTIONS ,
+.Ic ORDERPATCH ,
 .Ic PATCH ,
 .Ic POST ,
 .Ic PROPFIND ,
 .Ic PROPPATCH ,
 .Ic PUT ,
+.Ic REPORT ,
+.Ic SEARCH ,
 .Ic TRACE ,
+.Ic UNCHECKOUT ,
+.Ic UNLOCK ,
+.Ic UPDATE ,
+.Ic UPDATEREDIRECTREF ,
 or
-.Ic UNLOCK .
+.Ic VERSION-CONTROL .
 .It Xo
 .Ar type Ar option
 .Oo Oo Ic digest Oc

Reply via email to