-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathhandleRequest.js
55 lines (45 loc) · 1.67 KB
/
handleRequest.js
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
import { extname, join } from 'path';
import { parse } from 'url';
import { stat, Promise } from 'sander';
import serveFile from './serveFile';
import serveDir from './serveDir';
import serveSourcemap from './serveSourcemap';
import serveError from './serveError';
export default function handleRequest ( node, srcDir, error, sourcemapPromises, request, response ) {
const parsedUrl = parse( request.url );
const pathname = parsedUrl.pathname;
let filepath;
if ( error ) {
if ( pathname.substr( 0, 11 ) === '/__gobble__' ) {
const message = ( error.original && error.original.message ) || error.message || '';
filepath = pathname.substring( 11 );
// only allow links to files that we're actually interested in, not
// the whole damn filesystem
if ( ~message.indexOf( filepath ) || ~error.stack.indexOf( filepath ) ) {
return serveFile( pathname.substring( 11 ), request, response );
}
}
serveError( error, request, response );
return Promise.resolve();
}
filepath = join( srcDir, pathname );
if ( extname( filepath ) === '.map' ) {
return serveSourcemap( node, filepath, sourcemapPromises, request, response )
.catch( err => serveError( err, request, response ) );
}
return stat( filepath ).then( stats => {
if ( stats.isDirectory() ) {
// might need to redirect from `foo` to `foo/`
if ( pathname.slice( -1 ) !== '/' ) {
response.setHeader( 'Location', pathname + '/' + ( parsedUrl.search || '' ) );
response.writeHead( 301 );
response.end();
} else {
return serveDir( filepath, request, response );
}
}
else {
return serveFile( filepath, request, response );
}
}, err => serveError( err, request, response ) );
}