diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-06-23 16:26:17 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-06-23 16:26:17 +0900 |
| commit | 5a0a62c5f43ef461897deb6615c73325b0c0e3ca (patch) | |
| tree | 6b3e8433166f6b002f90884a69d09696e534494c /src/HttpServerBodyCommand.cc | |
| parent | 9ba65aea1d8438c2b6b8eba0b380466983e6c236 (diff) | |
Added CORS preflight request support.
This change is based on the patch from binux.
Diffstat (limited to 'src/HttpServerBodyCommand.cc')
| -rw-r--r-- | src/HttpServerBodyCommand.cc | 27 |
1 files changed, 27 insertions, 0 deletions
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<HttpHeader>& 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 |
