1
1
import tp from 'node:timers/promises'
2
2
import cacheControlParser from 'cache-control-parser'
3
3
import stream from 'node:stream'
4
- import { util } from '@nxtedition/undici'
5
-
6
- const noop = ( ) => { }
4
+ import { util } from 'undici'
7
5
8
6
export function parseCacheControl ( str ) {
9
7
return str ? cacheControlParser . parse ( str ) : null
@@ -196,15 +194,6 @@ export function parseOrigin(url) {
196
194
return url
197
195
}
198
196
199
- /**
200
- * @param {Record<string, string | string[] | null | undefined> | (Buffer | string | (Buffer | string)[])[] } headers
201
- * @param {Record<string, string | string[]> } [obj]
202
- * @returns {Record<string, string | string[]> }
203
- */
204
- export function parseHeaders ( headers , obj ) {
205
- return util . parseHeaders ( headers , obj )
206
- }
207
-
208
197
export class AbortError extends Error {
209
198
constructor ( message ) {
210
199
super ( message ?? 'The operation was aborted' )
@@ -252,7 +241,6 @@ export function bodyLength(body) {
252
241
253
242
export class DecoratorHandler {
254
243
#handler
255
- #onConnectCalled = false
256
244
257
245
constructor ( handler ) {
258
246
if ( typeof handler !== 'object' || handler === null ) {
@@ -262,15 +250,10 @@ export class DecoratorHandler {
262
250
}
263
251
264
252
onConnect ( ...args ) {
265
- this . #onConnectCalled = true
266
253
return this . #handler. onConnect ?. ( ...args )
267
254
}
268
255
269
256
onError ( ...args ) {
270
- if ( ! this . #onConnectCalled) {
271
- this . #onConnectCalled = true
272
- this . #handler. onConnect ?. ( noop )
273
- }
274
257
return this . #handler. onError ?. ( ...args )
275
258
}
276
259
@@ -298,3 +281,89 @@ export class DecoratorHandler {
298
281
return this . #handler. onBodySent ?. ( ...args )
299
282
}
300
283
}
284
+
285
+ /**
286
+ * @param {Record<string, string | string[] | null | undefined> | (Buffer | string | (Buffer | string)[])[] } headers
287
+ * @param {Record<string, string | string[]> } [obj]
288
+ * @returns {Record<string, string | string[]> }
289
+ */
290
+ export function parseHeaders ( headers , obj ) {
291
+ if ( obj == null ) {
292
+ obj = { }
293
+ } else {
294
+ // TODO (fix): assert obj values type?
295
+ }
296
+
297
+ if ( Array . isArray ( headers ) ) {
298
+ for ( let i = 0 ; i < headers . length ; i += 2 ) {
299
+ const key2 = headers [ i ]
300
+ const val2 = headers [ i + 1 ]
301
+
302
+ // TODO (fix): assert key2 type?
303
+ // TODO (fix): assert val2 type?
304
+
305
+ if ( val2 == null ) {
306
+ continue
307
+ }
308
+
309
+ const key = util . headerNameToString ( key2 )
310
+ let val = obj [ key ]
311
+
312
+ if ( val ) {
313
+ if ( ! Array . isArray ( val ) ) {
314
+ val = [ val ]
315
+ obj [ key ] = val
316
+ }
317
+
318
+ if ( Array . isArray ( val2 ) ) {
319
+ val . push ( ...val2 . filter ( ( x ) => x != null ) . map ( ( x ) => `${ x } ` ) )
320
+ } else {
321
+ val . push ( `${ val2 } ` )
322
+ }
323
+ } else {
324
+ obj [ key ] = Array . isArray ( val2 )
325
+ ? val2 . filter ( ( x ) => x != null ) . map ( ( x ) => `${ x } ` )
326
+ : `${ val2 } `
327
+ }
328
+ }
329
+ } else if ( typeof headers === 'object' && headers !== null ) {
330
+ for ( const key2 of Object . keys ( headers ) ) {
331
+ const val2 = headers [ key2 ]
332
+
333
+ // TODO (fix): assert key2 type?
334
+ // TODO (fix): assert val2 type?
335
+
336
+ if ( val2 == null ) {
337
+ continue
338
+ }
339
+
340
+ const key = util . headerNameToString ( key2 )
341
+ let val = obj [ key ]
342
+
343
+ if ( val ) {
344
+ if ( ! Array . isArray ( val ) ) {
345
+ val = [ val ]
346
+ obj [ key ] = val
347
+ }
348
+ if ( Array . isArray ( val2 ) ) {
349
+ val . push ( ...val2 . filter ( ( x ) => x != null ) . map ( ( x ) => `${ x } ` ) )
350
+ } else {
351
+ val . push ( `${ val2 } ` )
352
+ }
353
+ } else if ( val2 != null ) {
354
+ obj [ key ] = Array . isArray ( val2 )
355
+ ? val2 . filter ( ( x ) => x != null ) . map ( ( x ) => `${ x } ` )
356
+ : `${ val2 } `
357
+ }
358
+ }
359
+ } else if ( headers != null ) {
360
+ throw new Error ( 'invalid argument: headers' )
361
+ }
362
+
363
+ // See https://github.com/nodejs/node/pull/46528
364
+ if ( 'content-length' in obj && 'content-disposition' in obj ) {
365
+ obj [ 'content-disposition' ] = Buffer . from ( obj [ 'content-disposition' ] ) . toString ( 'latin1' )
366
+ }
367
+
368
+ return obj
369
+ }
0 commit comments