Skip to content

Commit b45a16e

Browse files
committed
refactored the cors middleware code
1 parent 49cb123 commit b45a16e

File tree

1 file changed

+45
-33
lines changed
  • packages/event-handler/src/rest/middleware

1 file changed

+45
-33
lines changed

packages/event-handler/src/rest/middleware/cors.ts

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -57,48 +57,60 @@ export const cors = (options?: CorsOptions): Middleware => {
5757
header.toLowerCase()
5858
);
5959

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+
60100
return async (_params, reqCtx, next) => {
61101
const requestOrigin = reqCtx.request.headers.get('Origin');
62-
if (
63-
!requestOrigin ||
64-
(!allowsWildcard && !allowedOrigins.includes(requestOrigin))
65-
) {
102+
if (!isOriginAllowed(requestOrigin)) {
66103
await next();
67104
return;
68105
}
69106

70-
const isOptions = reqCtx.request.method === HttpVerbs.OPTIONS;
71107
// 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)) {
87110
await next();
88111
return;
89112
}
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);
102114
if (config.maxAge !== undefined) {
103115
reqCtx.res.headers.set(
104116
'access-control-max-age',
@@ -117,10 +129,10 @@ export const cors = (options?: CorsOptions): Middleware => {
117129
});
118130
}
119131

132+
setCORSBaseHeaders(requestOrigin, reqCtx.res.headers);
120133
for (const header of config.exposeHeaders) {
121134
reqCtx.res.headers.append('access-control-expose-headers', header);
122135
}
123-
124136
await next();
125137
};
126138
};

0 commit comments

Comments
 (0)