@@ -196,16 +196,92 @@ function createServe(root: string) {
196196 res . setHeader ( 'Etag' , Etag ) ;
197197 res . setHeader ( 'last-modified' , lastModified ) ;
198198 res . setHeader ( 'Accept-Ranges' , 'bytes' ) ;
199+ // if (/gzip/g.test(req.headers['accept-encoding'])) {
200+ // // accept-encoding:gzip (default)
201+ // res.setHeader('Content-Encoding', 'gzip');
202+ // let compress = zlib.createGzip();
203+ // // check range
204+ // if (req.headers['range']) {
205+ // let range = rangeParser(stats!.size, req.headers['range'], { combine: true });
206+ // res.setHeader('Content-Range', `bytes ${range[0].start}-${range[0].end}/${stats!.size}`)
207+ // res.statusCode = 206;
208+ // fs.createReadStream(realPath, { start: range[0].start, end: range[0].end }).pipe(compress).pipe(res);
209+ // } else {
210+ // // no range
211+ // fs.createReadStream(realPath).pipe(compress).pipe(res);
212+ // }
213+ // } else if (/deflate/g.test(req.headers['accept-encoding'])) {
214+ // // accept-encoding:deflate
215+ // res.setHeader('Content-Encoding', 'deflate');
216+ // let compress = zlib.createDeflate();
217+ // // check range
218+ // if (req.headers['range']) {
219+ // let range = rangeParser(stats!.size, req.headers['range'], { combine: true });
220+ // res.setHeader('Content-Range', `bytes ${range[0].start}-${range[0].end}/${stats!.size}`)
221+ // res.statusCode = 206;
222+ // fs.createReadStream(realPath, { start: range[0].start, end: range[0].end }).pipe(compress).pipe(res);
223+ // } else {
224+ // // no range
225+ // fs.createReadStream(realPath).pipe(compress).pipe(res);
226+ // }
227+ // } else if (/br/g.test(req.headers['accept-encoding'])) {
228+ // // accept-encoding:br
229+ // res.setHeader('Content-Encoding', 'br');
230+ // let compress = zlib.createBrotliCompress();
231+ // // check range
232+ // if (req.headers['range']) {
233+ // let range = rangeParser(stats!.size, req.headers['range'], { combine: true });
234+ // res.setHeader('Content-Range', `bytes ${range[0].start}-${range[0].end}/${stats!.size}`)
235+ // res.statusCode = 206;
236+ // fs.createReadStream(realPath, { start: range[0].start, end: range[0].end }).pipe(compress).pipe(res);
237+ // } else {
238+ // // no range
239+ // fs.createReadStream(realPath).pipe(compress).pipe(res);
240+ // }
241+ // } else {
242+ // // not support accept-encoding
243+ // // check range
244+ // if (req.headers['range']) {
245+ // let range = rangeParser(stats!.size, req.headers['range'], { combine: true });
246+ // res.setHeader('Content-Range', `bytes ${range[0].start}-${range[0].end}/${stats!.size}`)
247+ // res.statusCode = 206;
248+ // fs.createReadStream(realPath, { start: range[0].start, end: range[0].end }).pipe(res);
249+ // } else {
250+ // // no range
251+ // fs.createReadStream(realPath).pipe(res);
252+ // }
253+ // }
199254 if ( / g z i p / g. test ( req . headers [ 'accept-encoding' ] ) ) {
200255 // accept-encoding:gzip (default)
201256 res . setHeader ( 'Content-Encoding' , 'gzip' ) ;
202257 let compress = zlib . createGzip ( ) ;
203258 // check range
204259 if ( req . headers [ 'range' ] ) {
205260 let range = rangeParser ( stats ! . size , req . headers [ 'range' ] , { combine : true } ) ;
206- res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
207- res . statusCode = 206 ;
208- fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( compress ) . pipe ( res ) ;
261+ if ( range < 0 ) {
262+ res . setHeader ( 'Content-Range' , `bytes */${ stats ! . size } ` ) ;
263+ res . statusCode = 416 ;
264+ res . end ( ) ;
265+ } else {
266+ if ( req . headers [ 'if-range' ] ) {
267+ // check client cache
268+ if ( req . headers [ 'if-range' ] === Etag || req . headers [ 'if-range' ] === lastModified ) {
269+ // cache hit
270+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
271+ res . statusCode = 206 ;
272+ res . end ( ) ;
273+ } else {
274+ // file update
275+ res . statusCode = 200 ;
276+ fs . createReadStream ( realPath ) . pipe ( compress ) . pipe ( res ) ;
277+ }
278+ } else {
279+ // no cache
280+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
281+ res . statusCode = 206 ;
282+ fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( compress ) . pipe ( res ) ;
283+ }
284+ }
209285 } else {
210286 // no range
211287 fs . createReadStream ( realPath ) . pipe ( compress ) . pipe ( res ) ;
@@ -217,9 +293,31 @@ function createServe(root: string) {
217293 // check range
218294 if ( req . headers [ 'range' ] ) {
219295 let range = rangeParser ( stats ! . size , req . headers [ 'range' ] , { combine : true } ) ;
220- res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
221- res . statusCode = 206 ;
222- fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( compress ) . pipe ( res ) ;
296+ if ( range < 0 ) {
297+ // range fail
298+ res . setHeader ( 'Content-Range' , `bytes */${ stats ! . size } ` ) ;
299+ res . statusCode = 416 ;
300+ res . end ( ) ;
301+ } else {
302+ if ( req . headers [ 'if-range' ] ) {
303+ // check client range
304+ if ( req . headers [ 'if-range' ] === Etag || req . headers [ 'if-range' ] === lastModified ) {
305+ // cache hit
306+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
307+ res . statusCode = 206 ;
308+ res . end ( ) ;
309+ } else {
310+ // file update
311+ res . statusCode = 200 ;
312+ fs . createReadStream ( realPath ) . pipe ( compress ) . pipe ( res ) ;
313+ }
314+ } else {
315+ // no cache
316+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
317+ res . statusCode = 206 ;
318+ fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( compress ) . pipe ( res ) ;
319+ }
320+ }
223321 } else {
224322 // no range
225323 fs . createReadStream ( realPath ) . pipe ( compress ) . pipe ( res ) ;
@@ -231,21 +329,65 @@ function createServe(root: string) {
231329 // check range
232330 if ( req . headers [ 'range' ] ) {
233331 let range = rangeParser ( stats ! . size , req . headers [ 'range' ] , { combine : true } ) ;
234- res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
235- res . statusCode = 206 ;
236- fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( compress ) . pipe ( res ) ;
332+ if ( range < 0 ) {
333+ // range fail
334+ res . setHeader ( 'Content-Range' , `bytes */${ stats ! . size } ` ) ;
335+ res . statusCode = 416 ;
336+ res . end ( ) ;
337+ } else {
338+ if ( req . headers [ 'if-range' ] ) {
339+ // check client cache
340+ if ( req . headers [ 'if-range' ] === Etag || req . headers [ 'if-range' ] === lastModified ) {
341+ // cache hit
342+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
343+ res . statusCode = 206 ;
344+ res . end ( ) ;
345+ } else {
346+ // file update
347+ res . statusCode = 200 ;
348+ fs . createReadStream ( realPath ) . pipe ( compress ) . pipe ( res ) ;
349+ }
350+ } else {
351+ // no cache
352+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
353+ res . statusCode = 206 ;
354+ fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( compress ) . pipe ( res ) ;
355+ }
356+ }
237357 } else {
238358 // no range
239359 fs . createReadStream ( realPath ) . pipe ( compress ) . pipe ( res ) ;
240360 }
241361 } else {
242- // not support accept-encoding
362+ // no support accept-encoding
243363 // check range
244364 if ( req . headers [ 'range' ] ) {
245365 let range = rangeParser ( stats ! . size , req . headers [ 'range' ] , { combine : true } ) ;
246- res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
247- res . statusCode = 206 ;
248- fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( res ) ;
366+ if ( range < 0 ) {
367+ // range fail
368+ res . setHeader ( 'Content-Range' , `bytes */${ stats ! . size } ` ) ;
369+ res . statusCode = 416 ;
370+ res . end ( ) ;
371+ } else {
372+ if ( req . headers [ 'if-range' ] ) {
373+ // check client cache
374+ if ( req . headers [ 'if-range' ] === Etag || req . headers [ 'if-range' ] === lastModified ) {
375+ // cache hit
376+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
377+ res . statusCode = 206 ;
378+ res . end ( ) ;
379+ } else {
380+ // file update
381+ res . statusCode = 200 ;
382+ fs . createReadStream ( realPath ) . pipe ( res ) ;
383+ }
384+ } else {
385+ // no cache
386+ res . setHeader ( 'Content-Range' , `bytes ${ range [ 0 ] . start } -${ range [ 0 ] . end } /${ stats ! . size } ` )
387+ res . statusCode = 206 ;
388+ fs . createReadStream ( realPath , { start : range [ 0 ] . start , end : range [ 0 ] . end } ) . pipe ( res ) ;
389+ }
390+ }
249391 } else {
250392 // no range
251393 fs . createReadStream ( realPath ) . pipe ( res ) ;
0 commit comments