@whatwg-node/server 0.8.11 → 0.8.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cjs/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.completeAssign = exports.isRequestInit = exports.sendNodeResponse = exports.isFetchEvent = exports.isReadableStream = exports.isServerResponse = exports.isNodeRequest = exports.isReadable = exports.normalizeNodeRequest = exports.isAsyncIterable = void 0;
3
+ exports.completeAssign = exports.isRequestInit = exports.sendNodeResponse = exports.splitSetCookieHeader = exports.isFetchEvent = exports.isReadableStream = exports.isServerResponse = exports.isNodeRequest = exports.isReadable = exports.normalizeNodeRequest = exports.isAsyncIterable = void 0;
4
4
  const fetch_1 = require("@whatwg-node/fetch");
5
5
  function isAsyncIterable(body) {
6
6
  return (body != null && typeof body === 'object' && typeof body[Symbol.asyncIterator] === 'function');
@@ -145,11 +145,41 @@ function endResponse(serverResponse) {
145
145
  // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
146
146
  serverResponse.end(null, null, null);
147
147
  }
148
+ function splitSetCookieHeader(setCookieHeader) {
149
+ const setCookieHeaders = [];
150
+ let currentStr = '';
151
+ let ignoreComma = false;
152
+ for (const ch of setCookieHeader) {
153
+ if (currentStr.endsWith('Expires=')) {
154
+ ignoreComma = true;
155
+ }
156
+ if (ignoreComma) {
157
+ if (ch === ';') {
158
+ ignoreComma = false;
159
+ }
160
+ if (ch === ',' && currentStr.split('Expires=')[1].length > 3) {
161
+ ignoreComma = false;
162
+ }
163
+ }
164
+ if (ch === ',' && !ignoreComma) {
165
+ setCookieHeaders.push(currentStr.trim());
166
+ currentStr = '';
167
+ }
168
+ else {
169
+ currentStr += ch;
170
+ }
171
+ }
172
+ if (currentStr) {
173
+ setCookieHeaders.push(currentStr.trim());
174
+ }
175
+ return setCookieHeaders;
176
+ }
177
+ exports.splitSetCookieHeader = splitSetCookieHeader;
148
178
  function getHeadersArray(headers) {
149
179
  const headersArray = [];
150
180
  headers.forEach((value, key) => {
151
181
  if (key === 'set-cookie') {
152
- const setCookieValues = value.split(',');
182
+ const setCookieValues = splitSetCookieHeader(value);
153
183
  setCookieValues.forEach(setCookieValue => {
154
184
  headersArray.push('set-cookie', setCookieValue.trim());
155
185
  });
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sendResponseToUwsOpts = exports.getRequestFromUWSRequest = exports.isUWSResponse = void 0;
4
+ const utils_js_1 = require("./utils.js");
4
5
  function isUWSResponse(res) {
5
6
  return !!res.onData;
6
7
  }
@@ -44,6 +45,15 @@ async function sendResponseToUwsOpts({ res, response }) {
44
45
  response.headers.forEach((value, key) => {
45
46
  // content-length causes an error with Node.js's fetch
46
47
  if (key !== 'content-length') {
48
+ if (key === 'set-cookie') {
49
+ const setCookieHeaders = (0, utils_js_1.splitSetCookieHeader)(value);
50
+ setCookieHeaders.forEach(setCookieHeader => {
51
+ res.cork(() => {
52
+ res.writeHeader(key, setCookieHeader);
53
+ });
54
+ });
55
+ return;
56
+ }
47
57
  res.cork(() => {
48
58
  res.writeHeader(key, value);
49
59
  });
package/esm/utils.js CHANGED
@@ -135,11 +135,40 @@ function endResponse(serverResponse) {
135
135
  // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
136
136
  serverResponse.end(null, null, null);
137
137
  }
138
+ export function splitSetCookieHeader(setCookieHeader) {
139
+ const setCookieHeaders = [];
140
+ let currentStr = '';
141
+ let ignoreComma = false;
142
+ for (const ch of setCookieHeader) {
143
+ if (currentStr.endsWith('Expires=')) {
144
+ ignoreComma = true;
145
+ }
146
+ if (ignoreComma) {
147
+ if (ch === ';') {
148
+ ignoreComma = false;
149
+ }
150
+ if (ch === ',' && currentStr.split('Expires=')[1].length > 3) {
151
+ ignoreComma = false;
152
+ }
153
+ }
154
+ if (ch === ',' && !ignoreComma) {
155
+ setCookieHeaders.push(currentStr.trim());
156
+ currentStr = '';
157
+ }
158
+ else {
159
+ currentStr += ch;
160
+ }
161
+ }
162
+ if (currentStr) {
163
+ setCookieHeaders.push(currentStr.trim());
164
+ }
165
+ return setCookieHeaders;
166
+ }
138
167
  function getHeadersArray(headers) {
139
168
  const headersArray = [];
140
169
  headers.forEach((value, key) => {
141
170
  if (key === 'set-cookie') {
142
- const setCookieValues = value.split(',');
171
+ const setCookieValues = splitSetCookieHeader(value);
143
172
  setCookieValues.forEach(setCookieValue => {
144
173
  headersArray.push('set-cookie', setCookieValue.trim());
145
174
  });
@@ -1,3 +1,4 @@
1
+ import { splitSetCookieHeader } from './utils.js';
1
2
  export function isUWSResponse(res) {
2
3
  return !!res.onData;
3
4
  }
@@ -39,6 +40,15 @@ export async function sendResponseToUwsOpts({ res, response }) {
39
40
  response.headers.forEach((value, key) => {
40
41
  // content-length causes an error with Node.js's fetch
41
42
  if (key !== 'content-length') {
43
+ if (key === 'set-cookie') {
44
+ const setCookieHeaders = splitSetCookieHeader(value);
45
+ setCookieHeaders.forEach(setCookieHeader => {
46
+ res.cork(() => {
47
+ res.writeHeader(key, setCookieHeader);
48
+ });
49
+ });
50
+ return;
51
+ }
42
52
  res.cork(() => {
43
53
  res.writeHeader(key, value);
44
54
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.8.11",
3
+ "version": "0.8.12",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -28,6 +28,7 @@ export declare function isNodeRequest(request: any): request is NodeRequest;
28
28
  export declare function isServerResponse(stream: any): stream is NodeResponse;
29
29
  export declare function isReadableStream(stream: any): stream is ReadableStream;
30
30
  export declare function isFetchEvent(event: any): event is FetchEvent;
31
+ export declare function splitSetCookieHeader(setCookieHeader: string): string[];
31
32
  export declare function sendNodeResponse(fetchResponse: Response, serverResponse: NodeResponse, nodeRequest: NodeRequest): Promise<void> | undefined;
32
33
  export declare function isRequestInit(val: unknown): val is RequestInit;
33
34
  export declare function completeAssign(...args: any[]): any;
@@ -28,6 +28,7 @@ export declare function isNodeRequest(request: any): request is NodeRequest;
28
28
  export declare function isServerResponse(stream: any): stream is NodeResponse;
29
29
  export declare function isReadableStream(stream: any): stream is ReadableStream;
30
30
  export declare function isFetchEvent(event: any): event is FetchEvent;
31
+ export declare function splitSetCookieHeader(setCookieHeader: string): string[];
31
32
  export declare function sendNodeResponse(fetchResponse: Response, serverResponse: NodeResponse, nodeRequest: NodeRequest): Promise<void> | undefined;
32
33
  export declare function isRequestInit(val: unknown): val is RequestInit;
33
34
  export declare function completeAssign(...args: any[]): any;