add support for CROS

This commit is contained in:
加里
2014-08-21 17:40:02 +08:00
parent f0832f37dc
commit 3a4955e92c
5 changed files with 108 additions and 32 deletions

View File

@@ -27,7 +27,8 @@ var handleRule = {
function userRequestHandler(req,userRes){
var host = req.headers.host,
path = url.parse(req.url).pathname,
urlPattern = url.parse(req.url),
path = urlPattern.path,
ifLocalruleMatched = false;
console.log(color.green("\nreceived request to : " + host + path));
@@ -37,6 +38,13 @@ function userRequestHandler(req,userRes){
in https server : /work/alibaba
*/
if(req.method == "OPTIONS"){
console.log("==>OPTIONS req for CROS, will allow all");
userRes.writeHead(200,mergeCROSHeader(req.headers)); //remove any cache related header, add crossdomain headers
userRes.end();
return;
}
for(var index in handleRule.map){
var rule = handleRule.map[index];
@@ -58,7 +66,6 @@ function userRequestHandler(req,userRes){
if(fs.existsSync(targetLocalfile)){
try{
var fsStream = fs.createReadStream(targetLocalfile);
userRes.writeHead(200,{"cache-control":"max-age=0"}); //remove any cache related header
fsStream.pipe(userRes);
ifLocalruleMatched = true;
break;
@@ -79,24 +86,24 @@ function userRequestHandler(req,userRes){
var ifHttps = !!req.connection.encrypted && !/http:/.test(req.url);
var options = {
hostname : req.headers.host,
port : req.port || (ifHttps ? 443 : 80),
hostname : urlPattern.hostname || req.headers.host,
port : urlPattern.port || req.port || (ifHttps ? 443 : 80),
path : path,
method : req.method,
headers : req.headers
};
var proxyReq = (ifHttps ? https : http).request(options, function(res) {
userRes.writeHead(res.statusCode,res.headers);
userRes.writeHead(res.statusCode,mergeCROSHeader(req.headers,res.headers));
res.pipe(userRes);
});
proxyReq.on("error",function(e){
console.log("err with request :" + req.url);
console.log("err with request :" + e.code + " " + req.url);
userRes.end();
});
proxyReq.end();
req.pipe(proxyReq);
}
}
@@ -147,7 +154,6 @@ function connectReqHandler(req, socket, head){
socket.write('HTTP/' + req.httpVersion + ' 200 OK\r\n\r\n', 'UTF-8', function() {
conn.pipe(socket);
socket.pipe(conn);
});
});
@@ -177,6 +183,18 @@ function setRules(newRule){
}
}
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
function mergeCROSHeader(reqHeader,originHeader){
var targetObj = originHeader || {};
targetObj["Access-Control-Allow-Credentials"] = "true";
targetObj["Access-Control-Allow-Origin"] = reqHeader['origin'] || "-___-||";
targetObj["Access-Control-Allow-Methods"] = "GET, POST, PUT";
targetObj["Access-Control-Allow-Headers"] = reqHeader['access-control-request-headers'] || "-___-||";
return targetObj;
}
module.exports.userRequestHandler = userRequestHandler;
module.exports.connectReqHandler = connectReqHandler;
module.exports.setRules = setRules;