Skip to content

Commit

Permalink
Merge pull request #2155 from cmouse/fix-issue-1984
Browse files Browse the repository at this point in the history
Implement CORS in WebServer, fixes #1984
  • Loading branch information
Peter van Dijk committed Feb 2, 2015
2 parents d23fc0a + f0023cf commit ea89a97
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 2 deletions.
21 changes: 20 additions & 1 deletion pdns/webserver.cc
Expand Up @@ -96,8 +96,27 @@ void WebServer::registerBareHandler(const string& url, HandlerFunction handler)
YaHTTP::Router::Any(url, f);
}

static bool optionsHandler(HttpRequest* req, HttpResponse* resp) {
if (req->method == "OPTIONS") {
resp->headers["access-control-allow-origin"] = "*";
resp->headers["access-control-allow-headers"] = "Content-Type, X-API-Key";
resp->headers["access-control-allow-methods"] = "GET, POST, PUT, PATCH, DELETE, OPTIONS";
resp->headers["access-control-max-age"] = "3600";
resp->status = 200;
resp->headers["content-type"]= "text/plain";
resp->body = "";
return true;
}
return false;
}

static void apiWrapper(WebServer::HandlerFunction handler, HttpRequest* req, HttpResponse* resp) {
const string& api_key = arg()["experimental-api-key"];

if (optionsHandler(req, resp)) return;

resp->headers["access-control-allow-origin"] = "*";

if (api_key.empty()) {
L<<Logger::Debug<<"HTTP API Request \"" << req->url.path << "\": Authentication failed, API Key missing in config" << endl;
throw HttpUnauthorizedException();
Expand All @@ -109,7 +128,6 @@ static void apiWrapper(WebServer::HandlerFunction handler, HttpRequest* req, Htt
throw HttpBadRequestException();
}

resp->headers["Access-Control-Allow-Origin"] = "*";
resp->headers["Content-Type"] = "application/json";

string callback;
Expand Down Expand Up @@ -151,6 +169,7 @@ void WebServer::registerApiHandler(const string& url, HandlerFunction handler) {

static void webWrapper(WebServer::HandlerFunction handler, HttpRequest* req, HttpResponse* resp) {
const string& web_password = arg()["webserver-password"];

if (!web_password.empty()) {
bool auth_ok = req->compareAuthorization(web_password);
if (!auth_ok) {
Expand Down
11 changes: 11 additions & 0 deletions regression-tests.api/test_Basics.py
Expand Up @@ -31,3 +31,14 @@ def test_split_request(self):
status = resp.splitlines(0)[0]
if '400' in status:
raise Exception('Got unwanted response: %s' % status)

def test_cors(self):
r = self.session.options(self.url("/servers/localhost"))
# look for CORS headers

self.assertEquals(r.status_code, requests.codes.ok)
self.assertEquals(r.headers['access-control-allow-origin'], "*")
self.assertEquals(r.headers['access-control-allow-headers'], 'Content-Type, X-API-Key')
self.assertEquals(r.headers['access-control-allow-methods'], 'GET, POST, PUT, PATCH, DELETE, OPTIONS')

print "response", repr(r.headers)
2 changes: 1 addition & 1 deletion regression-tests.api/test_helper.py
Expand Up @@ -15,7 +15,7 @@ def setUp(self):
self.server_port = int(os.environ.get('WEBPORT', '5580'))
self.server_url = 'http://%s:%s/' % (self.server_address, self.server_port)
self.session = requests.Session()
self.session.headers = {'X-API-Key': os.environ.get('APIKEY', 'changeme-key')}
self.session.headers = {'X-API-Key': os.environ.get('APIKEY', 'changeme-key'), 'Origin': 'http://%s:%s' % (self.server_address, self.server_port)}

def url(self, relative_url):
return urlparse.urljoin(self.server_url, relative_url)
Expand Down

0 comments on commit ea89a97

Please sign in to comment.