-
Notifications
You must be signed in to change notification settings - Fork 26.6k
Closed
Labels
area: common/httpIssues related to HTTP and HTTP ClientIssues related to HTTP and HTTP Client
Milestone
Description
Which @angular/* package(s) are the source of the bug?
core
Is this a regression?
No
Description
When a valid HTTP response with multiple "Set-Cookie" headers is resolved by HTTPClient, only one of the headers will be defined in response.headers
Here's a simple reproduction:
const init: HeadersInit = [
['Set-Cookie', 'cookie1=foo'],
['Set-Cookie', 'cookie2=bar'],
];
const headers = new Headers(init);
const httpHeaders = new HttpHeaders(headers);
httpHeaders.getAll('set-cookie') // returns [ 'cookie2=bar' ]
The problem occurs line line 257 of packages/common/http/src/headers.ts. There is no check for an existing header with the same key before the line
this.headers.set(key, headerValues);
My interpretation is that this is a valid way to use the Set-Cookie header, due to the method getSetCookie() existing on the Headers API (https://developer.mozilla.org/en-US/docs/Web/API/Headers/getSetCookie)
The use case for this is an interceptor on the server side that acts as a proxy for cookies between the user and an API
export const headersInterceptor: HttpInterceptorFn = (
req: HttpRequest<unknown>,
next: HttpHandlerFn
): Observable<HttpEvent<unknown>> => {
const request = inject(REQUEST, { optional: true });
const response = inject(RESPONSE, { optional: true });
const environment = inject(ENVIRONMENT);
//? SSR Should forward cookies from the original request.
if (request?.headers.cookie && req.url.startsWith(environment.apiUrl)) {
req = req.clone({
setHeaders: {
cookie: request.headers.cookie,
},
});
}
return next(req).pipe(
tap((res) => {
//? SSR Should forward Set-Cookie headers to the client
if (
response &&
res.type == HttpEventType.Response &&
res.headers.get("set-cookie") &&
req.url.startsWith(environment.apiUrl)
) {
response.setHeader(
"set-cookie",
res.headers.getAll("set-cookie") || []
);
}
})
);
};
Please provide a link to a minimal reproduction of the bug
No response
Please provide the exception or error you saw
No response
Please provide the environment you discovered this bug in (run ng version
)
Angular CLI: 18.1.3
Node: 20.9.0
Package Manager: npm 10.1.0
OS: darwin arm64
Angular: 18.1.3
... animations, cdk, cli, common, compiler, compiler-cli, core
... forms, platform-browser, platform-browser-dynamic
... platform-server, router, ssr
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.1801.3
@angular-devkit/build-angular 18.1.3
@angular-devkit/core 18.1.3
@angular-devkit/schematics 18.1.3
@schematics/angular 18.1.3
rxjs 6.6.7
typescript 5.4.5
zone.js 0.14.10
Anything else?
No response
Metadata
Metadata
Assignees
Labels
area: common/httpIssues related to HTTP and HTTP ClientIssues related to HTTP and HTTP Client