Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5729c25

Browse files
committed
fix set-cookie being overwritten by multiple set-cookie
1 parent 8220e75 commit 5729c25

File tree

4 files changed

+27
-15
lines changed

4 files changed

+27
-15
lines changed

packages/open-next/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"access": "public"
44
},
55
"name": "open-next",
6-
"version": "0.0.0-streaming.2",
6+
"version": "0.0.0-streaming.3",
77
"bin": {
88
"open-next": "./dist/index.js"
99
},

packages/open-next/src/adapters/http/responseStreaming.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export class StreamingServerResponse extends http.ServerResponse {
2323
private _wroteHeader = false;
2424
private _hasWritten = false;
2525
private _initialHeaders: Record<string, string> = {};
26+
private _cookies: string[] = [];
2627

2728
constructor({
2829
method,
@@ -89,8 +90,16 @@ export class StreamingServerResponse extends http.ServerResponse {
8990
return this[HEADERS];
9091
}
9192

92-
setHeader(name: string, value: string | number | string[]): this {
93-
this[HEADERS][name.toLowerCase()] = convertHeader(value);
93+
setHeader(key: string, value: string | number | string[]): this {
94+
key = key.toLowerCase();
95+
// There can be multiple set-cookie response headers
96+
// They need to be returned as a special "cookies" array, eg:
97+
// {statusCode: xxx, cookies: ['Cookie=Yum'], ...}
98+
if (key === "set-cookie") {
99+
this._cookies.push(convertHeader(value));
100+
} else {
101+
this[HEADERS][key] = convertHeader(value);
102+
}
94103
return this;
95104
}
96105

@@ -116,17 +125,19 @@ export class StreamingServerResponse extends http.ServerResponse {
116125
...this[HEADERS],
117126
...parsedHeaders,
118127
};
128+
119129
this.fixHeaders(this[HEADERS]);
120130
this[HEADERS] = {
121131
...this[HEADERS],
122132
...this._initialHeaders,
123133
};
124134

125-
console.log("~~thisheaders: ", this[HEADERS]);
126-
if (this[HEADERS]["accept-encoding"]?.includes("br")) {
127-
console.log("~~setting encoding to br");
135+
const acceptsBrEncoding =
136+
this[HEADERS]["accept-encoding"]?.includes("br");
137+
if (acceptsBrEncoding) {
128138
this[HEADERS]["content-encoding"] = "br";
129139
}
140+
delete this[HEADERS]["accept-encoding"];
130141

131142
debug("writeHead", this[HEADERS]);
132143

@@ -141,8 +152,10 @@ export class StreamingServerResponse extends http.ServerResponse {
141152
);
142153
const prelude = JSON.stringify({
143154
statusCode: statusCode as number,
155+
cookies: this._cookies,
144156
headers: this[HEADERS],
145157
});
158+
146159
// Try to flush the buffer to the client to invoke
147160
// the streaming. This does not work 100% of the time.
148161
setImmediate(() => {
@@ -155,9 +168,10 @@ export class StreamingServerResponse extends http.ServerResponse {
155168

156169
setImmediate(() => {
157170
this.responseStream.write(new Uint8Array(8));
158-
console.log("~~accept-encoding:", this[HEADERS]["accept-encoding"]);
159171

160-
if (this[HEADERS]["accept-encoding"]?.includes("br")) {
172+
// After headers are written, compress all writes
173+
// using Brotli
174+
if (acceptsBrEncoding) {
161175
const br = zlib.createBrotliCompress({
162176
flush: zlib.constants.BROTLI_OPERATION_FLUSH,
163177
});

packages/open-next/src/adapters/plugins/routing/default.replacement.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ export const processInternalEvent: ProcessInternalEvent = async (
3939
createResponse,
4040
) => {
4141
const nextHeaders = addNextConfigHeaders(event, configHeaders) ?? {};
42-
console.log("~~nextHeaders", nextHeaders);
4342

4443
let internalEvent = fixDataPage(event, buildId);
4544

packages/open-next/src/adapters/plugins/streaming.replacement.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ export const lambdaHandler = awslambda.streamifyResponse(async function (
3232
responseStream: ResponseStream,
3333
) {
3434
debug("event", event);
35-
console.log("~~url: ", event);
3635

3736
// Handler warmer
3837
if ("type" in event) {
@@ -49,8 +48,10 @@ export const lambdaHandler = awslambda.streamifyResponse(async function (
4948
const createServerResponse: CreateResponse<StreamingServerResponse> = (
5049
method: string,
5150
headers: Record<string, string | string[] | undefined>,
52-
) =>
53-
new StreamingServerResponse({
51+
) => {
52+
// sets the accept-encoding
53+
headers["accept-encoding"] = internalEvent.headers["accept-encoding"];
54+
return new StreamingServerResponse({
5455
method,
5556
headers,
5657
responseStream,
@@ -70,16 +71,14 @@ export const lambdaHandler = awslambda.streamifyResponse(async function (
7071
);
7172
},
7273
});
74+
};
7375

7476
const preprocessResult = await processInternalEvent(
7577
internalEvent,
7678
createServerResponse,
7779
);
7880
if ("type" in preprocessResult) {
7981
const headers = preprocessResult.headers;
80-
headers["cookie"] = internalEvent.headers["cookie"];
81-
headers["accept-encoding"] = internalEvent.headers["accept-encoding"];
82-
8382
const res = createServerResponse("GET", headers);
8483

8584
setImmediate(() => {

0 commit comments

Comments
 (0)