Skip to content

Commit cda8fc0

Browse files
committed
update
1 parent aca6aea commit cda8fc0

File tree

1 file changed

+155
-13
lines changed

1 file changed

+155
-13
lines changed

src/server/serve.ts

Lines changed: 155 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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 (/gzip/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

Comments
 (0)