cgreact-loader
Version:
CGReact与Webpack配套的loader
73 lines (72 loc) • 2.98 kB
JavaScript
module.exports = CGReactProxy;
function CGReactProxy(app) {
app.get("/cgreact-proxy*", proxyHttpRequest);
app.post("/cgreact-proxy*", proxyHttpRequest);
}
function proxyHttpRequest(request, response) {
// 解析请求地址
var url = new URL(request.url.substring(15, request.url.length)); //去掉前面的/cgreact-proxy/
// console.log(url.href);
// console.log(url.hostname);
// console.log(url.port ? url.port : url.protocol + "默认");
// console.log(url.pathname);
// console.log(url.search);
// 构造请求头Header
var proxyParam = {
host: url.hostname,
port: url.port,
path: url.pathname + url.search,
method: request.method,
headers: (function () {
delete request.headers["host"];
delete request.headers["if-none-match"];
delete request.headers["if-modified-since"];
return request.headers;
})()
};
// 构造响应方法
var proxyCallBack = function (proxyResponse) {
// 构造响应头允许跨域
proxyResponse.headers['Access-Control-Allow-Origin'] = "*";
proxyResponse.headers['Access-Control-Allow-Methods'] = "*";
proxyResponse.headers['Access-Control-Allow-Headers'] = "Content-Type";
// 写入响应头
response.writeHead(proxyResponse.statusCode, proxyResponse.headers);
// 写入响应数据
proxyResponse.on("data", function (chunk) { return response.write(chunk); });
proxyResponse.on("end", function () { return response.end(); });
};
var errorCallBack = function (error) {
response.writeHead(504);
response.end(error.toString());
};
// 根据协议发起不同请求
switch (url.protocol) {
case "http:":
{
// 发起代理请求
var proxyRequest_1 = require("http").request(proxyParam, proxyCallBack);
proxyRequest_1.on("error", errorCallBack);
// 写入请求数据Payload
request.on("data", function (chunk) { return proxyRequest_1.write(chunk); });
request.on("end", function () { return proxyRequest_1.end(); });
break;
}
case "https:":
{
// 发起代理请求
var proxyRequest_2 = require("https").request(proxyParam, proxyCallBack);
proxyRequest_2.on("error", errorCallBack);
// 写入请求数据Payload
request.on("data", function (chunk) { return proxyRequest_2.write(chunk); });
request.on("end", function () { return proxyRequest_2.end(); });
break;
}
default:
{
// 未知的协议类型
errorCallBack("未知的协议类型");
break;
}
}
}