@@ -4,12 +4,12 @@ const mime = require("mime-types");
44
55const getFilenameFromUrl = require ( "./utils/getFilenameFromUrl" ) ;
66const {
7- getHeaderNames,
87 getHeaderFromRequest,
98 getHeaderFromResponse,
109 setHeaderForResponse,
1110 setStatusCode,
1211 send,
12+ sendError,
1313} = require ( "./utils/compatibleAPI" ) ;
1414const ready = require ( "./utils/ready" ) ;
1515
@@ -27,28 +27,6 @@ function getValueContentRangeHeader(type, size, range) {
2727 return `${ type } ${ range ? `${ range . start } -${ range . end } ` : "*" } /${ size } ` ;
2828}
2929
30- /**
31- * @param {string | number } title
32- * @param {string } body
33- * @returns {string }
34- */
35- function createHtmlDocument ( title , body ) {
36- return (
37- `${
38- "<!DOCTYPE html>\n" +
39- '<html lang="en">\n' +
40- "<head>\n" +
41- '<meta charset="utf-8">\n' +
42- "<title>"
43- } ${ title } </title>\n` +
44- `</head>\n` +
45- `<body>\n` +
46- `<pre>${ body } </pre>\n` +
47- `</body>\n` +
48- `</html>\n`
49- ) ;
50- }
51-
5230const BYTES_RANGE_REGEXP = / ^ * b y t e s / i;
5331
5432/**
@@ -94,9 +72,12 @@ function wrapper(context) {
9472 }
9573
9674 async function processRequest ( ) {
75+ /** @type {import("./utils/getFilenameFromUrl").Extra } */
76+ const extra = { } ;
9777 const filename = getFilenameFromUrl (
9878 context ,
9979 /** @type {string } */ ( req . url ) ,
80+ extra ,
10081 ) ;
10182
10283 if ( ! filename ) {
@@ -161,68 +142,29 @@ function wrapper(context) {
161142
162143 const rangeHeader = getHeaderFromRequest ( req , "range" ) ;
163144
164- let start ;
165- let end ;
145+ let len = /** @type { import("fs").Stats } */ ( extra . stats ) . size ;
146+ let offset = 0 ;
166147
167148 if ( rangeHeader && BYTES_RANGE_REGEXP . test ( rangeHeader ) ) {
168- const size = await new Promise ( ( resolve ) => {
169- /** @type {import("fs").lstat } */
170- ( context . outputFileSystem . lstat ) ( filename , ( error , stats ) => {
171- if ( error ) {
172- context . logger . error ( error ) ;
173-
174- return ;
175- }
176-
177- resolve ( stats . size ) ;
178- } ) ;
179- } ) ;
180-
181149 // eslint-disable-next-line global-require
182- const parsedRanges = require ( "range-parser" ) ( size , rangeHeader , {
150+ const parsedRanges = require ( "range-parser" ) ( len , rangeHeader , {
183151 combine : true ,
184152 } ) ;
185153
186154 if ( parsedRanges === - 1 ) {
187- const message = "Unsatisfiable range for 'Range' header." ;
188-
189- context . logger . error ( message ) ;
190-
191- const existingHeaders = getHeaderNames ( res ) ;
155+ context . logger . error ( "Unsatisfiable range for 'Range' header." ) ;
192156
193- for ( let i = 0 ; i < existingHeaders . length ; i ++ ) {
194- res . removeHeader ( existingHeaders [ i ] ) ;
195- }
196-
197- setStatusCode ( res , 416 ) ;
198157 setHeaderForResponse (
199158 res ,
200159 "Content-Range" ,
201- getValueContentRangeHeader ( "bytes" , size ) ,
160+ getValueContentRangeHeader ( "bytes" , len ) ,
202161 ) ;
203- setHeaderForResponse ( res , "Content-Type" , "text/html; charset=utf-8" ) ;
204162
205- /** @type {string | Buffer | import("fs").ReadStream } */
206- let document = createHtmlDocument ( 416 , `Error: ${ message } ` ) ;
207- let byteLength = Buffer . byteLength ( document ) ;
208-
209- setHeaderForResponse (
210- res ,
211- "Content-Length" ,
212- Buffer . byteLength ( document ) ,
213- ) ;
214-
215- if ( context . options . modifyResponseData ) {
216- ( { data : document , byteLength } =
217- context . options . modifyResponseData (
218- req ,
219- res ,
220- document ,
221- byteLength ,
222- ) ) ;
223- }
224-
225- send ( req , res , document , byteLength ) ;
163+ sendError ( req , res , 416 , {
164+ headers : {
165+ "Content-Range" : res . getHeader ( "Content-Range" ) ,
166+ } ,
167+ } ) ;
226168
227169 return ;
228170 } else if ( parsedRanges === - 2 ) {
@@ -243,57 +185,23 @@ function wrapper(context) {
243185 "Content-Range" ,
244186 getValueContentRangeHeader (
245187 "bytes" ,
246- size ,
188+ len ,
247189 /** @type {import("range-parser").Ranges } */ ( parsedRanges ) [ 0 ] ,
248190 ) ,
249191 ) ;
250192
251- [ { start, end } ] = parsedRanges ;
193+ offset += parsedRanges [ 0 ] . start ;
194+ len = parsedRanges [ 0 ] . end - parsedRanges [ 0 ] . start + 1 ;
252195 }
253196 }
254197
255- const isFsSupportsStream =
256- typeof context . outputFileSystem . createReadStream === "function" ;
257-
258- let bufferOrStream ;
259- let byteLength ;
260-
261- try {
262- if (
263- typeof start !== "undefined" &&
264- typeof end !== "undefined" &&
265- isFsSupportsStream
266- ) {
267- bufferOrStream =
268- /** @type {import("fs").createReadStream } */
269- ( context . outputFileSystem . createReadStream ) ( filename , {
270- start,
271- end,
272- } ) ;
273- byteLength = end - start + 1 ;
274- } else {
275- bufferOrStream = /** @type {import("fs").readFileSync } */ (
276- context . outputFileSystem . readFileSync
277- ) ( filename ) ;
278- ( { byteLength } = bufferOrStream ) ;
279- }
280- } catch ( _ignoreError ) {
281- await goNext ( ) ;
198+ const start = offset ;
199+ const end = Math . max ( offset , offset + len - 1 ) ;
282200
283- return ;
284- }
285-
286- if ( context . options . modifyResponseData ) {
287- ( { data : bufferOrStream , byteLength } =
288- context . options . modifyResponseData (
289- req ,
290- res ,
291- bufferOrStream ,
292- byteLength ,
293- ) ) ;
294- }
295-
296- send ( req , res , bufferOrStream , byteLength ) ;
201+ send ( req , res , filename , start , end , goNext , {
202+ modifyResponseData : context . options . modifyResponseData ,
203+ outputFileSystem : context . outputFileSystem ,
204+ } ) ;
297205 }
298206 } ;
299207}
0 commit comments