Skip to content

Commit cfa5193

Browse files
save file
1 parent 2587436 commit cfa5193

File tree

1 file changed

+209
-0
lines changed

1 file changed

+209
-0
lines changed
Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
2+
3+
4+
var fs = require('fs');
5+
var path = require('path');
6+
7+
8+
var img = {};
9+
10+
11+
var host = '127.0.0.1';
12+
var port = 3001;
13+
14+
var server = require('http').createServer(request).listen({host,port});
15+
console.log(`http://${host}:${port}/`);
16+
17+
18+
function request(req,res){
19+
console.log(req.method,req.url);
20+
if(cors(req,res)){
21+
return;
22+
}
23+
24+
25+
var handled = true;
26+
27+
switch(req.url){
28+
29+
case '/hello' : hello(req,res); break;
30+
case '/favicon.ico' : favicon(req,res); break;
31+
32+
default : handled = false;
33+
34+
}//switch
35+
36+
if(handled)return;
37+
38+
39+
var abs = resolve(req.url);
40+
if(!abs){
41+
badrequest(req,res);
42+
return;
43+
}
44+
45+
if(!fs.existsSync(abs)){
46+
notfound(req,res);
47+
return;
48+
}
49+
50+
51+
var stream = fs.createReadStream(abs);
52+
53+
var type = mime(abs);
54+
res.writeHead(200,{'content-type':type});
55+
stream.pipe(res);
56+
57+
}//request
58+
59+
60+
//:
61+
62+
63+
function cors(req,res){
64+
65+
cors.headers(res);
66+
67+
if(req.method!='OPTIONS'){
68+
return;
69+
}
70+
console.log('cors');
71+
res.writeHead(200);
72+
res.end();
73+
return true;
74+
75+
}//cors
76+
77+
78+
cors.headers = function(res){
79+
80+
res.setHeader('access-control-allow-origin','*');
81+
82+
}//headers
83+
84+
85+
//:
86+
87+
88+
function badrequest(req,res){
89+
console.log('bad request');
90+
res.writeHead(400);
91+
res.end(`${req.url} bad request`);
92+
93+
}//bad
94+
95+
96+
function notfound(req,res){
97+
console.log('not found');
98+
res.writeHead(400);
99+
res.end(`${req.url} not found`);
100+
101+
}//notfound
102+
103+
104+
//:
105+
106+
107+
resolve.df = false;
108+
109+
function resolve(url,docroot='.'){
110+
resolve.df && console.log('=== resolve ===');
111+
resolve.df && console.log('url :',url);
112+
resolve.df && console.log('docroot :',docroot);
113+
url = decodeURI(url);
114+
url = url.slice(1);
115+
resolve.df && console.log('url :',url);
116+
var p2 = path.resolve(docroot);
117+
resolve.df && console.log('p2 :',p2);
118+
var file = path.resolve(docroot,url);
119+
resolve.df && console.log('file :',file);
120+
var s = file.substring(0,p2.length);
121+
resolve.df && console.log('s :',s);
122+
var p1 = path.resolve(s);
123+
resolve.df && console.log('p1 :',p1);
124+
if(p1!==p2){
125+
resolve.df && console.log('fail');
126+
return false;
127+
}
128+
129+
if(url.endsWith('/')){
130+
file += '/';
131+
}
132+
resolve.df && console.log('ok',file);
133+
return file;
134+
135+
}//resolve
136+
137+
138+
//:
139+
140+
141+
function hello(req,res){
142+
143+
res.writeHead(200,{'content-type':'text/html'});
144+
res.end(`
145+
<style>html{font-family:arial}body{margin:20px}</style>
146+
<h3>It Works!</h3>
147+
<h4 style='color:blue'>hello</h4>
148+
`);
149+
150+
}//hello
151+
152+
153+
function favicon(req,res){
154+
155+
var buf = Buffer.from(img.favicon,'base64');
156+
157+
res.writeHead(200,{'content-type':'image/png'});
158+
res.end(buf);
159+
160+
}//favicon
161+
162+
163+
//:
164+
165+
166+
function mime(fn){
167+
168+
var ext = fn.split('.').at(-1);
169+
switch(ext){
170+
171+
case 'html' : return 'text/html';
172+
case 'css' : return 'text/css';
173+
case 'js' : return 'text/javascript';
174+
175+
}//switch
176+
177+
}//mime
178+
179+
180+
181+
img.favicon =
182+
183+
'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAABsFBMVEVHcEzY' +
184+
'yZrsuEbkjh7rrDb2ujDwph3bhSTmiRPpggjrrTDgoEHlvmHqhQnbji/shATq' +
185+
'nyfzsRntryb3th33uR3iiBnrkRLvkQjogwrtjAnoixLmgwzzrRz0sB7rnSHy' +
186+
'qRvytB3usCX3vSnuqyf2uBn1uB/2uRv2uhnngQztmRbrlRPtiwXphQnqgwbv' +
187+
'mhDxnw/zoxTvlgzymwv2uCbwlwj3vyn1tBbzqx/5xDX2uBb2uhn////+///t' +
188+
'hADthgDzlQH0lwH6qQHykwD5pgHzkADviAH3pAH7qwH9sAH1mgHtggD+/vvy' +
189+
'jgHwjQH7rQH8+/X5pwHvigD9sQD7uhz60l/379zhgwbikRD0oQT1ngL2nAH5' +
190+
'xUP6yEfgpEfpvF7x5cXx4brunwT06dLphQLs1ajmpB77rAH4vjX8rwHjoS7p' +
191+
'yI3fkifpzqHpjgL2rxz7+O3fjB75shX0qRn1pA77swj5z1jtlADdhxHhsWno' +
192+
'wXXmiAHy3K7pqjDgnDzsoxP69uvv1Zb1tCfuuUHuqA73nwP0rw/5zlT5zFH7' +
193+
'wTLs3L7ps0jgun3jwoLju3nouVLnmArvlstGAAAAO3RSTlMAAxA1Gv19G3Pb' +
194+
'HwwGzRL8P3MrzsJOlea84pqnqtpqylEl72W4RnynkaiO++Xsyt3X1Njv9eWP' +
195+
'8vZilVucdXYAAAIZSURBVCjPjZMHc9owFICZYUMY2bOZ3XsjHFpKIBhju+y9' +
196+
'yw6Ekb1oZlf6lysJTGib3vU7n+/pfVq2nni8fvgKgZL3DwSLS8sGw8LbN7ob' +
197+
'usiX9K8vPJBW5MXyIv93yZ/Vhz3nl27IZcRzPvdS1G+V2rlWxN38iLE3c63w' +
198+
'gq5vrFZ84c7n83b72ZkLvvPNcMRwq6dnn0U2XAjb5+MTHLhy4UkBtyt9eMP2' +
199+
'yQafkz36ahUGsJETa7t6QNx+h7FcVUEiy3QauanO9PIpMcNYIMxhApB0LMnA' +
200+
'JmNZFw9gPd9eX4UEAskYDQCIZ5MB2LRY2jNodf4ktIHD/a87x14jhEwUY/uo' +
201+
'S/3VIPqXM/XTYCzupUkAkIYTkEfeTDbYqM9DLXrcCIYKCay6AEDv/AyeNtDi' +
202+
'okfBUMhciIN++92/FgoFsH66BtkspK49WfSbURJpwUMzYjPq7dmyfwXnptHO' +
203+
'76xgKhlO09EKzjxHO+dNv8f493qjtys48wSfqm7kA8Kf6q39Yxdn7naOc5hy' +
204+
'Op1UyWsEZOpLFX59cRcmnCPCzpEIxyiKYg+qZOpbaStaPjJmfDBBDXMVJb3H' +
205+
'skQ0vl3zEWzad1DObLEsq5Jz5aAYt1qJWs2XtkKItK8Eg7HB62pSj2sIk4ng' +
206+
'gKFsqL8WFdL7JoeJw6EZFf5R58KJB44uGpVU/dc9UAqlEyqZTDZ6e0hy8zXi' +
207+
'qyUSiYL3//wC2BenWkIiIBYAAAAASUVORK5CYII='
208+
209+

0 commit comments

Comments
 (0)