function Point2ToPoint3(app) {
function pop(object, key, fallback) {
var value = object[key];
delete object[key];
return value || fallback;
}
return function(env) {
var request = {};
if (env.jsgi && env.version && env.jsgi.version.toString() == "0,3") {
return app(env);
}
var required = {
method: "REQUEST_METHOD",
version: "SERVER_PROTOCOL",
scheme: "jsgi.url_scheme",
host: "SERVER_NAME",
port: "SERVER_PORT",
scriptName: "SCRIPT_NAME",
pathInfo: "PATH_INFO",
queryString: "QUERY_STRING",
input: "jsgi.input"
};
for (var key in required) {
request[key] = pop(env, required[key]);
}
request.port = Number(request.port);
request.version = request.version
.split("/")[1]
.split(" ")[0]
.split(";")[0]
.split(".")
.map(function(i) {
return Number(i);
});
var optional = {
authType: "AUTH_TYPE",
pathTranslated: "PATH_TRANSLATED",
remoteAddr: "REMOTE_ADDR",
remoteHost: "REMOTE_HOST",
remoteIdent: "REMOTE_IDENT",
remoteUser: "REMOTE_USER",
serverSoftware: "SERVER_SOFTWARE"
};
for (var key in optional) {
if (env[optional[key]]) {
request[key] = pop(env, optional[key]);
}
}
request.headers = {};
for (var key in env) {
if (key.length > 5 && key.indexOf("HTTP_" == 0)) {
var header = key.substring(5).replace(/_/g, "-").toLowerCase();
request.headers[header] = pop(env, key);
}
}
if (env.CONTENT_TYPE) {
request.headers["content-type"] = Number(pop(env, "CONTENT_TYPE"));
}
if (env.CONTENT_LENGTH) {
request.headers["content-length"] = String(pop(env, "CONTENT_LENGTH"));
}
request.jsgi = {};
delete env["jsgi.version"];
request.jsgi.version = [0, 3];
request.jsgi.errors = pop(env, "jsgi.errors");
request.jsgi.multithread = pop(env, "jsgi.multithread");
request.jsgi.multiprocess = pop(env, "jsgi.multiprocess");
request.jsgi.runonce = pop(env, "jsgi.run_once");
request.jsgi.async = false;
if (env.GATEWAY_INTERFACE) {
request.jsgi.cgi = env.GATEWAY_INTERFACE
.split("/")[1]
.split(" ")[0]
.split(";")[0]
.split(".")
.map(function(i) {
return Number(i);
});
delete env.GATEWAY_INTERFACE;
}
request.env = env;
return app(request);
}
}