6
6
* MIT Licensed
7
7
*/
8
8
9
- 'use strict'
9
+ 'use strict' ;
10
10
11
11
/**
12
12
* Module dependencies.
13
13
* @private
14
14
*/
15
15
16
- var encodeUrl = require ( 'encodeurl' )
17
- var escapeHtml = require ( 'escape-html' )
18
- var parseUrl = require ( 'parseurl' )
19
- var resolve = require ( 'path' ) . resolve
20
- var send = require ( 'send' )
21
- var url = require ( 'url' )
16
+ const encodeUrl = require ( 'encodeurl' ) ;
17
+ const escapeHtml = require ( 'escape-html' ) ;
18
+ const parseUrl = require ( 'parseurl' ) ;
19
+ const resolve = require ( 'path' ) . resolve ;
20
+ const send = require ( 'send' ) ;
21
+ const url = require ( 'url' ) ;
22
22
23
23
/**
24
24
* Module exports.
25
25
* @public
26
26
*/
27
27
28
- module . exports = serveStatic
28
+ module . exports = serveStatic ;
29
29
30
30
/**
31
31
* @param {string } root
@@ -36,109 +36,110 @@ module.exports = serveStatic
36
36
37
37
function serveStatic ( root , options ) {
38
38
if ( ! root ) {
39
- throw new TypeError ( 'root path required' )
39
+ throw new TypeError ( 'root path required' ) ;
40
40
}
41
41
42
42
if ( typeof root !== 'string' ) {
43
- throw new TypeError ( 'root path must be a string' )
43
+ throw new TypeError ( 'root path must be a string' ) ;
44
44
}
45
45
46
46
// copy options object
47
- var opts = Object . create ( options || null )
47
+ const opts = Object . create ( options || null ) ;
48
48
49
49
// fall-though
50
- var fallthrough = opts . fallthrough !== false
50
+ const fallthrough = opts . fallthrough !== false ;
51
51
52
52
// default redirect
53
- var redirect = opts . redirect !== false
53
+ const redirect = opts . redirect !== false ;
54
54
55
55
// headers listener
56
- var setHeaders = opts . setHeaders
56
+ const setHeaders = opts . setHeaders ;
57
57
58
58
if ( setHeaders && typeof setHeaders !== 'function' ) {
59
- throw new TypeError ( 'option setHeaders must be function' )
59
+ throw new TypeError ( 'option setHeaders must be function' ) ;
60
60
}
61
61
62
62
// setup options for send
63
- opts . maxage = opts . maxage || opts . maxAge || 0
64
- opts . root = resolve ( root )
63
+ opts . maxage = opts . maxage || opts . maxAge || 0 ;
64
+ opts . root = resolve ( root ) ;
65
65
66
66
// construct directory listener
67
- var onDirectory = redirect
67
+ const onDirectory = redirect
68
68
? createRedirectDirectoryListener ( )
69
- : createNotFoundDirectoryListener ( )
69
+ : createNotFoundDirectoryListener ( ) ;
70
70
71
71
return function serveStatic ( req , res , next ) {
72
72
if ( req . method !== 'GET' && req . method !== 'HEAD' ) {
73
73
if ( fallthrough ) {
74
- return next ( )
74
+ return next ( ) ;
75
75
}
76
76
77
77
// method not allowed
78
- res . statusCode = 405
79
- res . setHeader ( 'Allow' , 'GET, HEAD' )
80
- res . setHeader ( 'Content-Length' , '0' )
81
- res . end ( )
82
- return
78
+ res . statusCode = 405 ;
79
+ res . setHeader ( 'Allow' , 'GET, HEAD' ) ;
80
+ res . setHeader ( 'Content-Length' , '0' ) ;
81
+ res . end ( ) ;
82
+ return ;
83
83
}
84
84
85
- var forwardError = ! fallthrough
86
- var originalUrl = parseUrl . original ( req )
87
- var path = parseUrl ( req ) . pathname
85
+ let forwardError = ! fallthrough ;
86
+ const originalUrl = parseUrl . original ( req ) ;
87
+ let path = parseUrl ( req ) . pathname ;
88
88
89
89
// make sure redirect occurs at mount
90
90
if ( path === '/' && originalUrl . pathname . substr ( - 1 ) !== '/' ) {
91
- path = ''
91
+ path = '' ;
92
92
}
93
93
94
94
// create send stream
95
- var stream = send ( req , path , opts )
95
+ const stream = send ( req , path , opts ) ;
96
96
97
97
// add directory handler
98
- stream . on ( 'directory' , onDirectory )
98
+ stream . on ( 'directory' , onDirectory ) ;
99
99
100
100
// add headers listener
101
101
if ( setHeaders ) {
102
- stream . on ( 'headers' , setHeaders )
102
+ stream . on ( 'headers' , setHeaders ) ;
103
103
}
104
104
105
105
// add file listener for fallthrough
106
106
if ( fallthrough ) {
107
107
stream . on ( 'file' , function onFile ( ) {
108
108
// once file is determined, always forward error
109
- forwardError = true
110
- } )
109
+ forwardError = true ;
110
+ } ) ;
111
111
}
112
112
113
113
// forward errors
114
114
stream . on ( 'error' , function error ( err ) {
115
115
if ( forwardError || ! ( err . statusCode < 500 ) ) {
116
- next ( err )
117
- return
116
+ next ( err ) ;
117
+ return ;
118
118
}
119
119
120
- next ( )
121
- } )
120
+ next ( ) ;
121
+ } ) ;
122
122
123
123
// pipe
124
- stream . pipe ( res )
125
- }
124
+ stream . pipe ( res ) ;
125
+ } ;
126
126
}
127
127
128
128
/**
129
129
* Collapse all leading slashes into a single slash
130
130
* @private
131
131
*/
132
132
function collapseLeadingSlashes ( str ) {
133
- for ( var i = 0 ; i < str . length ; i ++ ) {
133
+ let i ;
134
+ for ( i = 0 ; i < str . length ; i ++ ) {
134
135
if ( str . charCodeAt ( i ) !== 0x2f /* / */ ) {
135
- break
136
+ break ;
136
137
}
137
138
}
138
139
139
140
return i > 1
140
141
? '/' + str . substr ( i )
141
- : str
142
+ : str ;
142
143
}
143
144
144
145
/**
@@ -159,7 +160,7 @@ function createHtmlDocument (title, body) {
159
160
'<body>\n' +
160
161
'<pre>' + body + '</pre>\n' +
161
162
'</body>\n' +
162
- '</html>\n'
163
+ '</html>\n' ;
163
164
}
164
165
165
166
/**
@@ -169,8 +170,8 @@ function createHtmlDocument (title, body) {
169
170
170
171
function createNotFoundDirectoryListener ( ) {
171
172
return function notFound ( ) {
172
- this . error ( 404 )
173
- }
173
+ this . error ( 404 ) ;
174
+ } ;
174
175
}
175
176
176
177
/**
@@ -181,29 +182,29 @@ function createNotFoundDirectoryListener () {
181
182
function createRedirectDirectoryListener ( ) {
182
183
return function redirect ( res ) {
183
184
if ( this . hasTrailingSlash ( ) ) {
184
- this . error ( 404 )
185
- return
185
+ this . error ( 404 ) ;
186
+ return ;
186
187
}
187
188
188
189
// get original URL
189
- var originalUrl = parseUrl . original ( this . req )
190
+ const originalUrl = parseUrl . original ( this . req ) ;
190
191
191
192
// append trailing slash
192
- originalUrl . path = null
193
- originalUrl . pathname = collapseLeadingSlashes ( originalUrl . pathname + '/' )
193
+ originalUrl . path = null ;
194
+ originalUrl . pathname = collapseLeadingSlashes ( originalUrl . pathname + '/' ) ;
194
195
195
196
// reformat the URL
196
- var loc = encodeUrl ( url . format ( originalUrl ) )
197
- var doc = createHtmlDocument ( 'Redirecting' , 'Redirecting to <a href="' + escapeHtml ( loc ) + '">' +
198
- escapeHtml ( loc ) + '</a>' )
197
+ const loc = encodeUrl ( url . format ( originalUrl ) ) ;
198
+ const doc = createHtmlDocument ( 'Redirecting' , 'Redirecting to <a href="' + escapeHtml ( loc ) + '">' +
199
+ escapeHtml ( loc ) + '</a>' ) ;
199
200
200
201
// send redirect response
201
- res . statusCode = 301
202
- res . setHeader ( 'Content-Type' , 'text/html; charset=UTF-8' )
203
- res . setHeader ( 'Content-Length' , Buffer . byteLength ( doc ) )
204
- res . setHeader ( 'Content-Security-Policy' , "default-src 'none'" )
205
- res . setHeader ( 'X-Content-Type-Options' , 'nosniff' )
206
- res . setHeader ( 'Location' , loc )
207
- res . end ( doc )
208
- }
202
+ res . statusCode = 301 ;
203
+ res . setHeader ( 'Content-Type' , 'text/html; charset=UTF-8' ) ;
204
+ res . setHeader ( 'Content-Length' , Buffer . byteLength ( doc ) ) ;
205
+ res . setHeader ( 'Content-Security-Policy' , "default-src 'none'" ) ;
206
+ res . setHeader ( 'X-Content-Type-Options' , 'nosniff' ) ;
207
+ res . setHeader ( 'Location' , loc ) ;
208
+ res . end ( doc ) ;
209
+ } ;
209
210
}
0 commit comments