Skip to content

Commit fdb513b

Browse files
Copilotfengmk2
andauthored
feat: export cookie utilities from undici (#742)
Re-export undici's [Cookie API](https://github.com/nodejs/undici/blob/main/docs/docs/api/Cookies.md) from urllib. - Export `getCookies`, `setCookie`, `getSetCookies`, `deleteCookie`, `parseCookie` functions and `Cookie` type from `src/index.ts` - Add tests for all five cookie utilities ```ts import { getCookies, setCookie, getSetCookies, deleteCookie, parseCookie, Headers } from 'urllib'; import type { Cookie } from 'urllib'; const headers = new Headers(); setCookie(headers, { name: 'foo', value: 'bar' }); const cookies = getSetCookies(headers); // [{ name: 'foo', value: 'bar' }] ``` > [!WARNING] > > <details> > <summary>Firewall rules blocked me from connecting to one or more addresses (expand for details)</summary> > > #### I tried to connect to the following addresses, but was blocked by firewall rules: > > - `http://registry.npmjs.org:80/urllib/latest` > - Triggering command: `/opt/hostedtoolcache/node/24.14.1/x64/bin/node /opt/hostedtoolcache/node/24.14.1/x64/bin/node --experimental-import-meta-resolve --require /home/REDACTED/work/urllib/urllib/node_modules/.pnpm/@voidzero-dev&#43;[email protected]_@arethetypeswrong&#43;[email protected]_@types&#43;[email protected]__7c6ae394869a5d43fd0cf7dc1d33dc1c/node_modules/@voidzero-dev/vite-plus-test/suppress-warnings.cjs --conditions node --conditions development /home/REDACTED/work/urllib/urllib/node_modules/.pnpm/@voidzero-dev&#43;[email protected]_@arethetypeswrong&#43;[email protected]_@types&#43;[email protected]__7c6ae394869a5d43fd0cf7dc1d33dc1c/node_modules/@voidzero-dev/vite-plus-test/dist/workers/forks.js` (http block) > > If you need me to access, download, or install something from one of these locations, you can either: > > - Configure [Actions setup steps](https://gh.io/copilot/actions-setup-steps) to set up my environment, which run before the firewall is enabled > - Add the appropriate URLs or hosts to the custom allowlist in this repository's [Copilot coding agent settings](https://github.com/node-modules/urllib/settings/copilot/coding_agent) (admins only) > > </details> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: fengmk2 <[email protected]>
1 parent 7ebec2d commit fdb513b

2 files changed

Lines changed: 64 additions & 1 deletion

File tree

src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,13 @@ export {
9898
Response,
9999
Headers,
100100
FormData,
101+
getCookies,
102+
setCookie,
103+
getSetCookies,
104+
deleteCookie,
105+
parseCookie,
101106
} from 'undici';
102-
export type { RequestInfo, RequestInit, BodyInit, ResponseInit } from 'undici';
107+
export type { RequestInfo, RequestInit, BodyInit, ResponseInit, Cookie } from 'undici';
103108
// HttpClient2 is keep compatible with urllib@2 HttpClient2
104109
export { HttpClient, HttpClient as HttpClient2, HEADER_USER_AGENT as USER_AGENT } from './HttpClient.js';
105110
export type { RequestDiagnosticsMessage, ResponseDiagnosticsMessage, ClientOptions } from './HttpClient.js';

test/index.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@ import urllib, {
1010
MockAgent,
1111
setGlobalDispatcher,
1212
getGlobalDispatcher,
13+
getCookies,
14+
setCookie,
15+
getSetCookies,
16+
deleteCookie,
17+
parseCookie,
18+
Headers,
1319
} from '../src/index.js';
20+
import type { Cookie } from '../src/index.js';
1421
import { startServer } from './fixtures/server.js';
1522
import { readableToBytes } from './utils.js';
1623

@@ -423,4 +430,55 @@ describe('index.test.ts', () => {
423430
assert.equal(response.status, 200);
424431
});
425432
});
433+
434+
describe('Cookie utilities', () => {
435+
it('should export getCookies from undici', () => {
436+
assert.equal(typeof getCookies, 'function');
437+
const headers = new Headers();
438+
headers.set('cookie', 'foo=bar; hello=world');
439+
const cookies = getCookies(headers);
440+
assert.equal(cookies.foo, 'bar');
441+
assert.equal(cookies.hello, 'world');
442+
});
443+
444+
it('should export setCookie from undici', () => {
445+
assert.equal(typeof setCookie, 'function');
446+
const headers = new Headers();
447+
const cookie: Cookie = { name: 'foo', value: 'bar' };
448+
setCookie(headers, cookie);
449+
const setCookieHeader = headers.get('set-cookie');
450+
assert(setCookieHeader);
451+
assert.match(setCookieHeader, /foo=bar/);
452+
});
453+
454+
it('should export getSetCookies from undici', () => {
455+
assert.equal(typeof getSetCookies, 'function');
456+
const headers = new Headers();
457+
headers.append('set-cookie', 'foo=bar');
458+
headers.append('set-cookie', 'hello=world');
459+
const cookies = getSetCookies(headers);
460+
assert.equal(cookies.length, 2);
461+
assert.equal(cookies[0].name, 'foo');
462+
assert.equal(cookies[0].value, 'bar');
463+
assert.equal(cookies[1].name, 'hello');
464+
assert.equal(cookies[1].value, 'world');
465+
});
466+
467+
it('should export deleteCookie from undici', () => {
468+
assert.equal(typeof deleteCookie, 'function');
469+
const headers = new Headers();
470+
deleteCookie(headers, 'foo');
471+
const setCookieHeader = headers.get('set-cookie');
472+
assert(setCookieHeader);
473+
assert.match(setCookieHeader, /foo=/);
474+
});
475+
476+
it('should export parseCookie from undici', () => {
477+
assert.equal(typeof parseCookie, 'function');
478+
const cookie = parseCookie('foo=bar');
479+
assert(cookie);
480+
assert.equal(cookie.name, 'foo');
481+
assert.equal(cookie.value, 'bar');
482+
});
483+
});
426484
});

0 commit comments

Comments
 (0)