ubus: support GET method with CORS requests
authorRafał Miłecki <rafal@milecki.pl>
Mon, 21 Sep 2020 14:16:23 +0000 (16:16 +0200)
committerRafał Miłecki <rafal@milecki.pl>
Wed, 23 Sep 2020 06:17:32 +0000 (08:17 +0200)
Complex GET requests (e.g. those with custom headers) require browsers
to send preflight OPTIONS request with:
Access-Control-Request-Method: GET

It's important to reply to such requests with the header
Access-Control-Allow-Origin (and optionally others) to allow CORS
requests.

Adding GET to the Access-Control-Allow-Methods is cosmetical as
according to the Fetch standard:

> If request’s method is not in methods, request’s method is not a
> CORS-safelisted method, and request’s credentials mode is "include" or
> methods does not contain `*`, then return a network error.

It basically means that Access-Control-Allow-Methods value is ignored
for GET, HEAD and POST methods.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
ubus.c

diff --git a/ubus.c b/ubus.c
index 1cf5c5f762551b9885f54b1397fc44cadcdf03b3..39b38b2c9043df329de501a50d6f2c5cc573727c 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -164,7 +164,7 @@ static void uh_ubus_add_cors_headers(struct client *cl)
        {
                char *hdr = (char *) blobmsg_data(tb[HDR_ACCESS_CONTROL_REQUEST_METHOD]);
 
-               if (strcmp(hdr, "POST") && strcmp(hdr, "OPTIONS"))
+               if (strcmp(hdr, "GET") && strcmp(hdr, "POST") && strcmp(hdr, "OPTIONS"))
                        return;
        }
 
@@ -175,7 +175,7 @@ static void uh_ubus_add_cors_headers(struct client *cl)
                ustream_printf(cl->us, "Access-Control-Allow-Headers: %s\r\n",
                               blobmsg_get_string(tb[HDR_ACCESS_CONTROL_REQUEST_HEADERS]));
 
-       ustream_printf(cl->us, "Access-Control-Allow-Methods: POST, OPTIONS\r\n");
+       ustream_printf(cl->us, "Access-Control-Allow-Methods: GET, POST, OPTIONS\r\n");
        ustream_printf(cl->us, "Access-Control-Allow-Credentials: true\r\n");
 }