From 3e52c99fae1646f5ca18ead39905028b8d499022 Mon Sep 17 00:00:00 2001 From: Khafra <42794878+KhafraDev@users.noreply.github.com> Date: Sat, 28 Jan 2023 20:23:01 -0500 Subject: [PATCH 1/2] feat: expose content-type parser --- index.d.ts | 1 + index.js | 5 +++++ types/content-type.d.ts | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+) create mode 100644 types/content-type.d.ts diff --git a/index.d.ts b/index.d.ts index e914634f1d0..d67de97241d 100644 --- a/index.d.ts +++ b/index.d.ts @@ -23,6 +23,7 @@ export * from './types/filereader' export * from './types/formdata' export * from './types/diagnostics-channel' export * from './types/websocket' +export * from './types/content-type' export { Interceptable } from './types/mock-interceptor' export { Dispatcher, BalancedPool, Pool, Client, buildConnector, errors, Agent, request, stream, pipeline, connect, upgrade, setGlobalDispatcher, getGlobalDispatcher, setGlobalOrigin, getGlobalOrigin, MockClient, MockPool, MockAgent, mockErrors, ProxyAgent, RedirectHandler, DecoratorHandler } diff --git a/index.js b/index.js index 48d9beed1b8..a970b937423 100644 --- a/index.js +++ b/index.js @@ -134,6 +134,11 @@ if (nodeMajor >= 16) { module.exports.getCookies = getCookies module.exports.getSetCookies = getSetCookies module.exports.setCookie = setCookie + + const { parseMIMEType, serializeAMimeType } = require('./lib/fetch/dataURL') + + module.exports.parseMIMEType = parseMIMEType + module.exports.serializeAMimeType = serializeAMimeType } if (nodeMajor >= 18 && hasCrypto) { diff --git a/types/content-type.d.ts b/types/content-type.d.ts new file mode 100644 index 00000000000..f2a87f1b751 --- /dev/null +++ b/types/content-type.d.ts @@ -0,0 +1,21 @@ +/// + +interface MIMEType { + type: string + subtype: string + parameters: Map + essence: string +} + +/** + * Parse a string to a {@link MIMEType} object. Returns `failure` if the string + * couldn't be parsed. + * @see https://mimesniff.spec.whatwg.org/#parse-a-mime-type + */ +export function parseMIMEType (input: string): 'failure' | MIMEType + +/** + * Convert a MIMEType object to a string. + * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type + */ +export function serializeAMimeType (mimeType: MIMEType): string From 0204e057d5df43959728a4538430f41a24cf94d3 Mon Sep 17 00:00:00 2001 From: Khafra <42794878+KhafraDev@users.noreply.github.com> Date: Sun, 29 Jan 2023 10:25:38 -0500 Subject: [PATCH 2/2] fix: add docs --- docs/api/ContentType.md | 57 +++++++++++++++++++++++++++++++++++++++++ docsify/sidebar.md | 1 + 2 files changed, 58 insertions(+) create mode 100644 docs/api/ContentType.md diff --git a/docs/api/ContentType.md b/docs/api/ContentType.md new file mode 100644 index 00000000000..2bcc9f71ca3 --- /dev/null +++ b/docs/api/ContentType.md @@ -0,0 +1,57 @@ +# MIME Type Parsing + +## `MIMEType` interface + +* **type** `string` +* **subtype** `string` +* **parameters** `Map` +* **essence** `string` + +## `parseMIMEType(input)` + +Implements [parse a MIME type](https://mimesniff.spec.whatwg.org/#parse-a-mime-type). + +Parses a MIME type, returning its type, subtype, and any associated parameters. If the parser can't parse an input it returns the string literal `'failure'`. + +```js +import { parseMIMEType } from 'undici' + +parseMIMEType('text/html; charset=gbk') +// { +// type: 'text', +// subtype: 'html', +// parameters: Map(1) { 'charset' => 'gbk' }, +// essence: 'text/html' +// } +``` + +Arguments: + +* **input** `string` + +Returns: `MIMEType|'failure'` + +## `serializeAMimeType(input)` + +Implements [serialize a MIME type](https://mimesniff.spec.whatwg.org/#serialize-a-mime-type). + +Serializes a MIMEType object. + +```js +import { serializeAMimeType } from 'undici' + +serializeAMimeType({ + type: 'text', + subtype: 'html', + parameters: new Map([['charset', 'gbk']]), + essence: 'text/html' +}) +// text/html;charset=gbk + +``` + +Arguments: + +* **mimeType** `MIMEType` + +Returns: `string` diff --git a/docsify/sidebar.md b/docsify/sidebar.md index 6c110f47f6e..015e6f48842 100644 --- a/docsify/sidebar.md +++ b/docsify/sidebar.md @@ -19,6 +19,7 @@ * [API Lifecycle](/docs/api/api-lifecycle.md "Undici API - Lifecycle") * [Diagnostics Channel Support](/docs/api/DiagnosticsChannel.md "Diagnostics Channel Support") * [WebSocket](/docs/api/WebSocket.md "Undici API - WebSocket") + * [MIME Type Parsing](/docs/api/ContentType.md "Undici API - MIME Type Parsing") * Best Practices * [Proxy](/docs/best-practices/proxy.md "Connecting through a proxy") * [Client Certificate](/docs/best-practices/client-certificate.md "Connect using a client certificate")