Repository navigation
Expand file tree
/
Copy pathmain.js
More file actions
115 lines (114 loc) · 3.6 KB
/
Copy pathmain.js
File metadata and controls
115 lines (114 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const { exec } = require("child_process");
const PORT = process.env.PORT || 5000
const http = require("http");
const fs = require("fs");
let errorHandler = (err,response) => {
response.writeHead(500);
response.write("Oops, something went wrong... "+err);
response.end();
}
let allowedOrigin = (origin) => {
if (!origin) { return false; }
let url;
try { url = new URL(origin); } catch (e) { return false; }
if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
return true;
}
if (url.hostname === "nibroc.fr" || url.hostname.endsWith(".nibroc.fr"))
{
return true;
}
return false;
}
let applyCors = (req, res) => {
let origin = req.headers.origin;
if (allowedOrigin(origin)) {
res.setHeader("Access-Control-Allow-Origin", origin);
res.setHeader("Vary", "Origin");
}
res.setHeader("Access-Control-Expose-Headers", "Void");
}
let getFile = (path,bin=false) => {
return new Promise((resolve,reject) => {
fs.readFile(path,(bin)?null:"utf8",(error,data) => {
if (error) { reject(error); }
resolve(data);
});
});
};
let getFileName = (parameters) => {
let filename = (new Date()).valueOf();
filename += "-"+parameters.server+"-"+parameters.format+"-";
filename += Math.ceil(Math.random()*1000000);
return encodeURIComponent(filename);
}
let yaz_binding = (response,parameters) => {
let output = getFileName(parameters);
parameters.isbn = parameters.isbn.split(",")
parameters.query = parameters.isbn.map(e => {
//Queries should be secured !
e = "f @attr 1=7 "+e+"\\ns 1\\n";
return e
}).join("");
let cmd = "open "+parameters.server+"\\nformat "+parameters.format+"\\n"+parameters.query+"\\nquit";
cmd = 'yaz-client -f <(printf "'+cmd+'") -m ./'+output;
const yaz = exec(cmd, {shell: "/bin/bash", stdio: "ignore"},
async (err,stdout,stderr) => {
if (err) {
errorHandler(err, response);
return;
}
let empty = [];
stdout
.split("\n")
.filter(e => e.indexOf("Number of hits") >= 0)
.map(e => {
e = e.split("hits: ")[1].split(", setno ");
if (parseInt(e[0]) == 0) {
empty.push(parameters.isbn[parseInt(e[1])-1]);
}
});
response.writeHead(200, {
"Content-Type": "text/plain; charset=utf-8",
"Void": empty.join(",")
});
response.write(await getFile(output),"utf8");
response.end();
exec("rm "+output);
}
);
}
let server = http.createServer(async (req, res) => {
if (req.method === "OPTIONS") {
applyCors(req, res);
res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
res.writeHead(204);
res.end();
return;
}
applyCors(req, res);
let page = new URL("http://dummy.com"+req.url);
if (page.pathname == "/demo.html") {
res.writeHead(200, {"Content-Type": "text/html; charset=utf-8"});
res.write(await getFile("demo.html"));
res.end();
} else if (page.pathname == "/style.css") {
res.writeHead(200, {"Content-Type": "text/css; charset=utf-8"});
res.write(await getFile("style.css"));
res.end();
} else if ((page.searchParams.get("server") === null)
|| (page.searchParams.get("isbn") === null)
|| (page.searchParams.get("format") === null)) {
res.writeHead(200, {"Content-Type": "text/plain; charset=utf-8"});
res.write(await getFile("README.md"));
res.end();
} else {
yaz_binding(res,{
server:page.searchParams.get("server"),
isbn:page.searchParams.get("isbn"),
format:page.searchParams.get("format")
});
}
});
server.listen(PORT);