Skip to content

Commit

Permalink
Add support for Origin HTTP header.
Browse files Browse the repository at this point in the history
This is required for any CORS handling.
  • Loading branch information
kristapsdz committed Sep 10, 2024
1 parent 9c30cd9 commit 4099e7a
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 4 deletions.
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ REGRESS = regress/test-abort-validator \
regress/test-logging-errors \
regress/test-nogzip \
regress/test-nullqueryval \
regress/test-origin \
regress/test-path-check \
regress/test-ping \
regress/test-ping-double \
Expand Down
4 changes: 2 additions & 2 deletions child.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
/* $Id$ */
/*
* Copyright (c) 2012, 2014--2020 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
Expand Down Expand Up @@ -179,6 +178,7 @@ static const char *const krequs[KREQU__MAX] = {
"HTTP_IF_RANGE", /* KREQU_IF_RANGE */
"HTTP_IF_UNMODIFIED_SINCE", /* KREQU_IF_UNMODIFIED_SINCE */
"HTTP_MAX_FORWARDS", /* KREQU_MAX_FORWARDS */
"HTTP_ORIGIN", /* KREQU_ORIGIN */
"HTTP_PROXY_AUTHORIZATION", /* KREQU_PROXY_AUTHORIZATION */
"HTTP_RANGE", /* KREQU_RANGE */
"HTTP_REFERER", /* KREQU_REFERER */
Expand Down
4 changes: 2 additions & 2 deletions kcgi.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
/* $Id$ */
/*
* Copyright (c) 2012, 2014--2018 Kristaps Dzonsons <kristaps@bsd.lv>
* Copyright (c) Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
Expand Down Expand Up @@ -150,6 +149,7 @@ enum krequ {
KREQU_IF_RANGE,
KREQU_IF_UNMODIFIED_SINCE,
KREQU_MAX_FORWARDS,
KREQU_ORIGIN,
KREQU_PROXY_AUTHORIZATION,
KREQU_RANGE,
KREQU_REFERER,
Expand Down
77 changes: 77 additions & 0 deletions regress/test-origin.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright (c) Kristaps Dzonsons <kristaps@bsd.lv>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../config.h"

#include <stdarg.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <curl/curl.h>

#include "../kcgi.h"
#include "regress.h"

static int
parent(CURL *curl)
{
struct curl_slist *list = NULL;
CURLcode c;

curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:17123/");
list = curl_slist_append(list, "Origin: http://localhost");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
c = curl_easy_perform(curl);
curl_slist_free_all(list);
return c == CURLE_OK;
}

static int
child(void)
{
struct kreq r;
const char *page = "index";
int rc = 0;

if (khttp_fcgi_test())
return 0;
if (khttp_parse(&r, NULL, 0, &page, 1, 0) != KCGI_OK)
return 0;
if (r.reqmap[KREQU_ORIGIN] == NULL)
goto out;
if (strcasecmp(r.reqmap[KREQU_ORIGIN]->val, "http://localhost"))
goto out;

khttp_head(&r, kresps[KRESP_STATUS],
"%s", khttps[KHTTP_200]);
khttp_head(&r, kresps[KRESP_CONTENT_TYPE],
"%s", kmimetypes[KMIME_TEXT_HTML]);
khttp_head(&r, kresps[KRESP_ACCESS_CONTROL_ALLOW_ORIGIN],
"%s", r.reqmap[KREQU_ORIGIN]->val);
khttp_body(&r);
rc = 1;
out:
khttp_free(&r);
return rc;
}

int
main(int argc, char *argv[])
{

return !regress_cgi(parent, child);
}

0 comments on commit 4099e7a

Please sign in to comment.