Skip to content

Commit 6f65bc3

Browse files
authored
fix(runtime-handler): using set-cookie now sets cookie header (#332)
1 parent 637a512 commit 6f65bc3

File tree

2 files changed

+34
-15
lines changed

2 files changed

+34
-15
lines changed

Diff for: packages/runtime-handler/__tests__/dev-runtime/internal/response.test.ts

+16
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,22 @@ test('sets headers with an array of cookies', () => {
100100
expect(response['headers']).toEqual(expected);
101101
});
102102

103+
test('sets cookies with lower case set-cookie', () => {
104+
const response = new Response();
105+
expect(response['headers']).toEqual({
106+
'Set-Cookie': [],
107+
});
108+
response.setHeaders({
109+
'Access-Control-Allow-Origin': 'example.com',
110+
'set-cookie': ['Hi=Bye', 'Hello=World'],
111+
});
112+
const expected = {
113+
'Access-Control-Allow-Origin': 'example.com',
114+
'Set-Cookie': ['Hi=Bye', 'Hello=World'],
115+
};
116+
expect(response['headers']).toEqual(expected);
117+
});
118+
103119
test('appends a new header correctly', () => {
104120
const response = new Response();
105121
expect(response['headers']).toEqual({

Diff for: packages/runtime-handler/src/dev-runtime/internal/response.ts

+18-15
Original file line numberDiff line numberDiff line change
@@ -59,32 +59,35 @@ export class Response implements TwilioResponse {
5959
if (typeof headersObject !== 'object') {
6060
return this;
6161
}
62-
if (!(COOKIE_HEADER in headersObject)) {
63-
headersObject[COOKIE_HEADER] = [];
64-
}
65-
66-
const cookieHeader = headersObject[COOKIE_HEADER];
67-
if (!Array.isArray(cookieHeader)) {
68-
headersObject[COOKIE_HEADER] = [cookieHeader];
62+
this.headers = {};
63+
for (const header in headersObject) {
64+
this.appendHeader(header, headersObject[header]);
6965
}
70-
this.headers = headersObject;
7166

7267
return this;
7368
}
7469

7570
appendHeader(key: string, value: HeaderValue): Response {
7671
log('Appending header for %s', key, value);
7772
this.headers = this.headers || {};
78-
const existingValue = this.headers[key];
7973
let newHeaderValue: HeaderValue = [];
80-
if (existingValue) {
81-
newHeaderValue = [existingValue, value].flat();
82-
if (newHeaderValue) {
83-
this.headers[key] = newHeaderValue;
74+
if (key.toLowerCase() === COOKIE_HEADER.toLowerCase()) {
75+
const existingValue = this.headers[COOKIE_HEADER];
76+
if (existingValue) {
77+
newHeaderValue = [existingValue, value].flat();
78+
if (newHeaderValue) {
79+
this.headers[COOKIE_HEADER] = newHeaderValue;
80+
}
81+
} else {
82+
this.headers[COOKIE_HEADER] = Array.isArray(value) ? value: [value];
8483
}
8584
} else {
86-
if (key === COOKIE_HEADER && !Array.isArray(value)) {
87-
this.headers[key] = [value];
85+
const existingValue = this.headers[key];
86+
if (existingValue) {
87+
newHeaderValue = [existingValue, value].flat();
88+
if (newHeaderValue) {
89+
this.headers[key] = newHeaderValue;
90+
}
8891
} else {
8992
this.headers[key] = value;
9093
}

0 commit comments

Comments
 (0)