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 <
re...@openbsd.org>
+ * Copyright (c) 2012 - 2015 Reyk Floeter <
re...@openbsd.org>
*
* 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