respond with CORS headers for OPTIONS pre-flight request

This commit is contained in:
Florian Dold 2020-01-15 15:52:12 +01:00
parent 19d9369ff6
commit 3b13aaf844
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 47 additions and 5 deletions

View File

@ -420,11 +420,20 @@ handle_mhd_request (void *cls,
for (unsigned int i = 0; NULL != handlers[i].url; i++) for (unsigned int i = 0; NULL != handlers[i].url; i++)
{ {
rh = &handlers[i]; rh = &handlers[i];
if ( (0 == strcmp (url, if (0 != strcmp (url, rh->url))
rh->url)) && continue;
( (NULL == rh->method) ||
(0 == strcmp (method, /* The URL is a match! What we now do depends on the method. */
rh->method)) ) )
if (0 == strcmp (method, MHD_HTTP_METHOD_OPTIONS))
{
GNUNET_async_scope_restore (&old_scope);
return TALER_MHD_reply_cors_preflight (connection);
}
if ( (NULL == rh->method) ||
(0 == strcmp (method,
rh->method)) )
{ {
/* FIXME: consider caching 'rh' in '**connection_cls' to /* FIXME: consider caching 'rh' in '**connection_cls' to
avoid repeated lookup! */ avoid repeated lookup! */

View File

@ -441,4 +441,14 @@ TALER_MHD_reply_legal (struct MHD_Connection *conn,
struct TALER_MHD_Legal *legal); struct TALER_MHD_Legal *legal);
/**
* Send back a "204 No Content" response with headers
* for the CORS pre-flight request.
*
* @param connection the MHD connection
* @return MHD result code
*/
int
TALER_MHD_reply_cors_preflight (struct MHD_Connection *connection);
#endif #endif

View File

@ -267,6 +267,29 @@ TALER_MHD_reply_json (struct MHD_Connection *connection,
} }
/**
* Send back a "204 No Content" response with headers
* for the CORS pre-flight request.
*
* @param connection the MHD connection
* @return MHD result code
*/
int
TALER_MHD_reply_cors_preflight (struct MHD_Connection *connection)
{
struct MHD_Response *resp;
GNUNET_assert (NULL != (resp = MHD_create_response_from_buffer (0, NULL,
MHD_RESPMEM_PERSISTENT)));
/* This adds the Access-Control-Allow-Origin header.
* All endpoints of the exchange allow CORS. */
TALER_MHD_add_global_headers (resp);
GNUNET_assert (MHD_YES == MHD_queue_response (connection, MHD_HTTP_NO_CONTENT,
resp));
return MHD_YES;
}
/** /**
* Function to call to handle the request by building a JSON * Function to call to handle the request by building a JSON
* reply from a format string and varargs. * reply from a format string and varargs.