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();
throw HttpBadRequestException();
}
- resp->headers["Access-Control-Allow-Origin"] = "*";
resp->headers["Content-Type"] = "application/json";
string callback;
static void webWrapper(WebServer::HandlerFunction handler, HttpRequest* req, HttpResponse* resp) {
const string& web_password = arg()["webserver-password"];
+
+ if (optionsHandler(req, resp)) return;
+
+ resp->headers["access-control-allow-origin"] = "*";
+
if (!web_password.empty()) {
bool auth_ok = req->compareAuthorization(web_password);
if (!auth_ok) {
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)
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)