@@ -150,8 +150,7 @@ export const normalizeRemixRequest = (request: RemixRequest): Record<string, any
150
150
query : parsedURL . query ,
151
151
href : parsedURL . href ,
152
152
method : request . method ,
153
- // Remix now uses undici, so use standard way to create headers object
154
- headers : Object . fromEntries ( headers ) ,
153
+ headers : objectFromHeaders ( headers ) ,
155
154
insecureHTTPParser : request . insecureHTTPParser ,
156
155
agent,
157
156
@@ -164,3 +163,35 @@ export const normalizeRemixRequest = (request: RemixRequest): Record<string, any
164
163
165
164
return requestOptions ;
166
165
} ;
166
+
167
+ // This function is a `polyfill` for Object.fromEntries()
168
+ function objectFromHeaders ( headers : Headers ) : Record < string , string > {
169
+ const result : Record < string , string > = { } ;
170
+ let iterator : IterableIterator < [ string , string ] > ;
171
+
172
+ if ( hasIterator ( headers ) ) {
173
+ iterator = getIterator ( headers ) as IterableIterator < [ string , string ] > ;
174
+ } else {
175
+ return { } ;
176
+ }
177
+
178
+ for ( const [ key , value ] of iterator ) {
179
+ result [ key ] = value ;
180
+ }
181
+ return result ;
182
+ }
183
+
184
+ type IterableType < T > = {
185
+ [ Symbol . iterator ] : ( ) => Iterator < T > ;
186
+ } ;
187
+
188
+ function hasIterator < T > ( obj : T ) : obj is T & IterableType < unknown > {
189
+ return obj !== null && typeof ( obj as IterableType < unknown > ) [ Symbol . iterator ] === 'function' ;
190
+ }
191
+
192
+ function getIterator < T > ( obj : T ) : Iterator < unknown > {
193
+ if ( hasIterator ( obj ) ) {
194
+ return ( obj as IterableType < unknown > ) [ Symbol . iterator ] ( ) ;
195
+ }
196
+ throw new Error ( 'Object does not have an iterator' ) ;
197
+ }
0 commit comments