@@ -57,48 +57,60 @@ export const cors = (options?: CorsOptions): Middleware => {
57
57
header . toLowerCase ( )
58
58
) ;
59
59
60
+ const isOriginAllowed = (
61
+ requestOrigin : string | null
62
+ ) : requestOrigin is string => {
63
+ return (
64
+ requestOrigin !== null &&
65
+ ( allowsWildcard || allowedOrigins . includes ( requestOrigin ) )
66
+ ) ;
67
+ } ;
68
+
69
+ const isValidPreflightRequest = ( requestHeaders : Headers ) => {
70
+ const accessControlRequestMethod = requestHeaders
71
+ . get ( 'Access-Control-Request-Method' )
72
+ ?. toUpperCase ( ) ;
73
+ const accessControlRequestHeaders = requestHeaders
74
+ . get ( 'Access-Control-Request-Headers' )
75
+ ?. toLowerCase ( ) ;
76
+ return (
77
+ accessControlRequestMethod &&
78
+ allowedMethods . includes ( accessControlRequestMethod ) &&
79
+ accessControlRequestHeaders &&
80
+ accessControlRequestHeaders
81
+ . split ( ',' )
82
+ . some ( ( header ) => allowedHeaders . includes ( header . trim ( ) ) )
83
+ ) ;
84
+ } ;
85
+
86
+ const setCORSBaseHeaders = (
87
+ requestOrigin : string ,
88
+ responseHeaders : Headers
89
+ ) => {
90
+ const resolvedOrigin = allowsWildcard ? '*' : requestOrigin ;
91
+ responseHeaders . set ( 'access-control-allow-origin' , resolvedOrigin ) ;
92
+ if ( ! allowsWildcard && Array . isArray ( config . origin ) ) {
93
+ responseHeaders . set ( 'vary' , 'Origin' ) ;
94
+ }
95
+ if ( config . credentials ) {
96
+ responseHeaders . set ( 'access-control-allow-credentials' , 'true' ) ;
97
+ }
98
+ } ;
99
+
60
100
return async ( _params , reqCtx , next ) => {
61
101
const requestOrigin = reqCtx . request . headers . get ( 'Origin' ) ;
62
- if (
63
- ! requestOrigin ||
64
- ( ! allowsWildcard && ! allowedOrigins . includes ( requestOrigin ) )
65
- ) {
102
+ if ( ! isOriginAllowed ( requestOrigin ) ) {
66
103
await next ( ) ;
67
104
return ;
68
105
}
69
106
70
- const isOptions = reqCtx . request . method === HttpVerbs . OPTIONS ;
71
107
// Handle preflight OPTIONS request
72
- if ( isOptions ) {
73
- const requestMethod = reqCtx . request . headers
74
- . get ( 'Access-Control-Request-Method' )
75
- ?. toUpperCase ( ) ;
76
- const requestHeaders = reqCtx . request . headers
77
- . get ( 'Access-Control-Request-Headers' )
78
- ?. toLowerCase ( ) ;
79
- if (
80
- ! requestMethod ||
81
- ! allowedMethods . includes ( requestMethod ) ||
82
- ! requestHeaders ||
83
- requestHeaders
84
- . split ( ',' )
85
- . some ( ( header ) => ! allowedHeaders . includes ( header . trim ( ) ) )
86
- ) {
108
+ if ( reqCtx . request . method === HttpVerbs . OPTIONS ) {
109
+ if ( ! isValidPreflightRequest ( reqCtx . request . headers ) ) {
87
110
await next ( ) ;
88
111
return ;
89
112
}
90
- }
91
-
92
- const resolvedOrigin = allowsWildcard ? '*' : requestOrigin ;
93
- reqCtx . res . headers . set ( 'access-control-allow-origin' , resolvedOrigin ) ;
94
- if ( ! allowsWildcard && Array . isArray ( config . origin ) ) {
95
- reqCtx . res . headers . set ( 'vary' , 'Origin' ) ;
96
- }
97
- if ( config . credentials ) {
98
- reqCtx . res . headers . set ( 'access-control-allow-credentials' , 'true' ) ;
99
- }
100
-
101
- if ( isOptions ) {
113
+ setCORSBaseHeaders ( requestOrigin , reqCtx . res . headers ) ;
102
114
if ( config . maxAge !== undefined ) {
103
115
reqCtx . res . headers . set (
104
116
'access-control-max-age' ,
@@ -117,10 +129,10 @@ export const cors = (options?: CorsOptions): Middleware => {
117
129
} ) ;
118
130
}
119
131
132
+ setCORSBaseHeaders ( requestOrigin , reqCtx . res . headers ) ;
120
133
for ( const header of config . exposeHeaders ) {
121
134
reqCtx . res . headers . append ( 'access-control-expose-headers' , header ) ;
122
135
}
123
-
124
136
await next ( ) ;
125
137
} ;
126
138
} ;
0 commit comments