From 5a0a62c5f43ef461897deb6615c73325b0c0e3ca Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 23 Jun 2012 16:26:17 +0900 Subject: Added CORS preflight request support. This change is based on the patch from binux. --- src/HttpServerBodyCommand.cc | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/HttpServerBodyCommand.cc') diff --git a/src/HttpServerBodyCommand.cc b/src/HttpServerBodyCommand.cc index 8f932090..bd2e3a70 100644 --- a/src/HttpServerBodyCommand.cc +++ b/src/HttpServerBodyCommand.cc @@ -159,6 +159,33 @@ bool HttpServerBodyCommand::execute() std::string query(std::find(reqPath.begin(), reqPath.end(), '?'), reqPath.end()); reqPath.erase(reqPath.size()-query.size(), query.size()); + + if(httpServer_->getMethod() == "OPTIONS") { + // Response to Preflight Request. + // See http://www.w3.org/TR/cors/ + const SharedHandle& header = + httpServer_->getRequestHeader(); + std::string accessControlHeaders; + if(!header->find("origin").empty() && + !header->find("access-control-request-method").empty() && + !httpServer_->getAllowOrigin().empty()) { + accessControlHeaders += + "Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n" + "Access-Control-Max-Age: 1728000\r\n"; + const std::string& accReqHeaders = + header->find("access-control-request-headers"); + if(!accReqHeaders.empty()) { + // We allow all headers requested. + accessControlHeaders += "Access-Control-Allow-Headers: "; + accessControlHeaders += accReqHeaders; + accessControlHeaders += "\r\n"; + } + } + httpServer_->feedResponse(200, accessControlHeaders); + addHttpServerResponseCommand(); + return true; + } + // Do something for requestpath and body if(reqPath == "/rpc") { #ifdef ENABLE_XML_RPC -- cgit