summaryrefslogtreecommitdiff
path: root/src/HttpServerBodyCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-06-23 16:26:17 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-06-23 16:26:17 +0900
commit5a0a62c5f43ef461897deb6615c73325b0c0e3ca (patch)
tree6b3e8433166f6b002f90884a69d09696e534494c /src/HttpServerBodyCommand.cc
parent9ba65aea1d8438c2b6b8eba0b380466983e6c236 (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.cc27
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