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