@@ -168,44 +168,21 @@ const isBun = typeof new Headers()?.toJSON === 'function'
168168 * Attempts to process headers based on request headers.
169169 */
170170const processHeaders = ( headers : Headers ) => {
171- if ( isBun ) return Object . keys ( headers . toJSON ( ) ) . join ( ', ' )
171+ // if (isBun) return Object.keys(headers.toJSON()).join(', ')
172172
173173 let keys = ''
174174
175+ let i = 0
175176 headers . forEach ( ( _ , key ) => {
176- keys += key + ', '
177- } )
177+ if ( i ) keys = keys + ', ' + key
178+ else keys = key
178179
179- if ( keys ) keys = keys . slice ( 0 , - 1 )
180+ i ++
181+ } )
180182
181183 return keys
182184}
183185
184- const processOrigin = (
185- origin : Origin ,
186- request : Request ,
187- from : string
188- ) : boolean => {
189- if ( Array . isArray ( origin ) )
190- return origin . some ( ( o ) => processOrigin ( o , request , from ) )
191-
192- switch ( typeof origin ) {
193- case 'string' :
194- const fromProtocol = from . indexOf ( '://' )
195- if ( fromProtocol !== - 1 ) from = from . slice ( fromProtocol + 3 )
196-
197- return origin === from
198-
199- case 'function' :
200- return origin ( request ) === true
201-
202- case 'object' :
203- if ( origin instanceof RegExp ) return origin . test ( from )
204- }
205-
206- return false
207- }
208-
209186export const cors = ( config ?: CORSConfig ) => {
210187 let {
211188 aot = true ,
@@ -238,6 +215,38 @@ export const cors = (config?: CORSConfig) => {
238215
239216 const anyOrigin = origins ?. some ( ( o ) => o === '*' )
240217
218+ const originMap = < Record < string , true > > { }
219+ if ( origins )
220+ for ( const origin of origins )
221+ if ( typeof origin === 'string' ) originMap [ origin ] = true
222+
223+ const processOrigin = (
224+ origin : Origin ,
225+ request : Request ,
226+ from : string
227+ ) : boolean => {
228+ if ( Array . isArray ( origin ) )
229+ return origin . some ( ( o ) => processOrigin ( o , request , from ) )
230+
231+ switch ( typeof origin ) {
232+ case 'string' :
233+ if ( from in originMap ) return true
234+
235+ const fromProtocol = from . indexOf ( '://' )
236+ if ( fromProtocol !== - 1 ) from = from . slice ( fromProtocol + 3 )
237+
238+ return origin === from
239+
240+ case 'function' :
241+ return origin ( request ) === true
242+
243+ case 'object' :
244+ if ( origin instanceof RegExp ) return origin . test ( from )
245+ }
246+
247+ return false
248+ }
249+
241250 const handleOrigin = ( set : Context [ 'set' ] , request : Request ) => {
242251 // origin === `true` means any origin
243252 if ( origin === true ) {
@@ -269,9 +278,6 @@ export const cors = (config?: CORSConfig) => {
269278
270279 return
271280 }
272-
273- // value can be string (truthy value) but not `true`
274- if ( value ) headers . push ( value )
275281 }
276282 }
277283
@@ -339,7 +345,6 @@ export const cors = (config?: CORSConfig) => {
339345 handleMethod ( set , request . method )
340346
341347 if ( allowedHeaders === true || exposeHeaders === true ) {
342- // @ts -ignore
343348 const headers = processHeaders ( request . headers )
344349
345350 if ( allowedHeaders === true )
0 commit comments