mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix(node:http) Export validateHeaderName
and validateHeaderValue
functions (#22616)
Modify `_http_outgoing.ts` to support the extended signature of `validateHeaderName()` used since node v19.5.0/v18.14.0 by adding the `label` parameter. (see: https://nodejs.org/api/http.html#httpvalidateheadernamename-label) Making both validation functions accessible as public exports of `node:http` Fixes: #22614
This commit is contained in:
parent
0e64450369
commit
16dbbfa64a
5 changed files with 94 additions and 16 deletions
|
@ -820,21 +820,25 @@ Object.defineProperty(OutgoingMessage.prototype, "_headerNames", {
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
export const validateHeaderName = hideStackFrames((name) => {
|
export const validateHeaderName = hideStackFrames(
|
||||||
if (typeof name !== "string" || !name || !checkIsHttpToken(name)) {
|
(name: string, label?: string): void => {
|
||||||
throw new ERR_INVALID_HTTP_TOKEN("Header name", name);
|
if (typeof name !== "string" || !name || !checkIsHttpToken(name)) {
|
||||||
}
|
throw new ERR_INVALID_HTTP_TOKEN(label || "Header name", name);
|
||||||
});
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
export const validateHeaderValue = hideStackFrames((name, value) => {
|
export const validateHeaderValue = hideStackFrames(
|
||||||
if (value === undefined) {
|
(name: string, value: string): void => {
|
||||||
throw new ERR_HTTP_INVALID_HEADER_VALUE(value, name);
|
if (value === undefined) {
|
||||||
}
|
throw new ERR_HTTP_INVALID_HEADER_VALUE(value, name);
|
||||||
if (checkInvalidHeaderChar(value)) {
|
}
|
||||||
debug('Header "%s" contains invalid characters', name);
|
if (checkInvalidHeaderChar(value)) {
|
||||||
throw new ERR_INVALID_CHAR("header content", name);
|
debug('Header "%s" contains invalid characters', name);
|
||||||
}
|
throw new ERR_INVALID_CHAR("header content", name);
|
||||||
});
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
export function parseUniqueHeadersOption(headers) {
|
export function parseUniqueHeadersOption(headers) {
|
||||||
if (!Array.isArray(headers)) {
|
if (!Array.isArray(headers)) {
|
||||||
|
|
|
@ -38,6 +38,7 @@ import {
|
||||||
OutgoingMessage,
|
OutgoingMessage,
|
||||||
parseUniqueHeadersOption,
|
parseUniqueHeadersOption,
|
||||||
validateHeaderName,
|
validateHeaderName,
|
||||||
|
validateHeaderValue,
|
||||||
} from "ext:deno_node/_http_outgoing.ts";
|
} from "ext:deno_node/_http_outgoing.ts";
|
||||||
import { ok as assert } from "node:assert";
|
import { ok as assert } from "node:assert";
|
||||||
import { kOutHeaders } from "ext:deno_node/internal/http.ts";
|
import { kOutHeaders } from "ext:deno_node/internal/http.ts";
|
||||||
|
@ -1824,6 +1825,8 @@ export {
|
||||||
METHODS,
|
METHODS,
|
||||||
OutgoingMessage,
|
OutgoingMessage,
|
||||||
STATUS_CODES,
|
STATUS_CODES,
|
||||||
|
validateHeaderName,
|
||||||
|
validateHeaderValue,
|
||||||
};
|
};
|
||||||
export default {
|
export default {
|
||||||
Agent,
|
Agent,
|
||||||
|
@ -1840,4 +1843,6 @@ export default {
|
||||||
ServerResponse,
|
ServerResponse,
|
||||||
request,
|
request,
|
||||||
get,
|
get,
|
||||||
|
validateHeaderName,
|
||||||
|
validateHeaderValue,
|
||||||
};
|
};
|
||||||
|
|
|
@ -365,6 +365,7 @@
|
||||||
// TODO(lev): ClientRequest.socket is not polyfilled so this test keeps
|
// TODO(lev): ClientRequest.socket is not polyfilled so this test keeps
|
||||||
// failing
|
// failing
|
||||||
//"test-http-client-set-timeout.js",
|
//"test-http-client-set-timeout.js",
|
||||||
|
"test-http-header-validators.js",
|
||||||
"test-http-localaddress.js",
|
"test-http-localaddress.js",
|
||||||
// TODO(bartlomieju): temporarily disabled while we iterate on the HTTP client
|
// TODO(bartlomieju): temporarily disabled while we iterate on the HTTP client
|
||||||
// "test-http-outgoing-buffer.js",
|
// "test-http-outgoing-buffer.js",
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
// deno-fmt-ignore-file
|
||||||
|
// deno-lint-ignore-file
|
||||||
|
|
||||||
|
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
|
||||||
|
// Taken from Node 18.12.1
|
||||||
|
// This file is automatically generated by `tools/node_compat/setup.ts`. Do not modify this file manually.
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const { validateHeaderName, validateHeaderValue } = require('http');
|
||||||
|
|
||||||
|
// Expected static methods
|
||||||
|
isFunc(validateHeaderName, 'validateHeaderName');
|
||||||
|
isFunc(validateHeaderValue, 'validateHeaderValue');
|
||||||
|
|
||||||
|
// Expected to be useful as static methods
|
||||||
|
console.log('validateHeaderName');
|
||||||
|
// - when used with valid header names - should not throw
|
||||||
|
[
|
||||||
|
'user-agent',
|
||||||
|
'USER-AGENT',
|
||||||
|
'User-Agent',
|
||||||
|
'x-forwarded-for',
|
||||||
|
].forEach((name) => {
|
||||||
|
console.log('does not throw for "%s"', name);
|
||||||
|
validateHeaderName(name);
|
||||||
|
});
|
||||||
|
|
||||||
|
// - when used with invalid header names:
|
||||||
|
[
|
||||||
|
'איקס-פורוורד-פור',
|
||||||
|
'x-forwarded-fםr',
|
||||||
|
].forEach((name) => {
|
||||||
|
console.log('throws for: "%s"', name.slice(0, 50));
|
||||||
|
assert.throws(
|
||||||
|
() => validateHeaderName(name),
|
||||||
|
{ code: 'ERR_INVALID_HTTP_TOKEN' }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('validateHeaderValue');
|
||||||
|
// - when used with valid header values - should not throw
|
||||||
|
[
|
||||||
|
['x-valid', 1],
|
||||||
|
['x-valid', '1'],
|
||||||
|
['x-valid', 'string'],
|
||||||
|
].forEach(([name, value]) => {
|
||||||
|
console.log('does not throw for "%s"', name);
|
||||||
|
validateHeaderValue(name, value);
|
||||||
|
});
|
||||||
|
|
||||||
|
// - when used with invalid header values:
|
||||||
|
[
|
||||||
|
// [header, value, expectedCode]
|
||||||
|
['x-undefined', undefined, 'ERR_HTTP_INVALID_HEADER_VALUE'],
|
||||||
|
['x-bad-char', 'לא תקין', 'ERR_INVALID_CHAR'],
|
||||||
|
].forEach(([name, value, code]) => {
|
||||||
|
console.log('throws %s for: "%s: %s"', code, name, value);
|
||||||
|
assert.throws(
|
||||||
|
() => validateHeaderValue(name, value),
|
||||||
|
{ code }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Misc.
|
||||||
|
function isFunc(v, ttl) {
|
||||||
|
assert.ok(v.constructor === Function, `${ttl} is expected to be a function`);
|
||||||
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
NOTE: This file should not be manually edited. Please edit `tests/node_compat/config.json` and run `deno task setup` in `tools/node_compat` dir instead.
|
NOTE: This file should not be manually edited. Please edit `tests/node_compat/config.json` and run `deno task setup` in `tools/node_compat` dir instead.
|
||||||
|
|
||||||
Total: 2999
|
Total: 2998
|
||||||
|
|
||||||
- [abort/test-abort-backtrace.js](https://github.com/nodejs/node/tree/v18.12.1/test/abort/test-abort-backtrace.js)
|
- [abort/test-abort-backtrace.js](https://github.com/nodejs/node/tree/v18.12.1/test/abort/test-abort-backtrace.js)
|
||||||
- [abort/test-abort-fatal-error.js](https://github.com/nodejs/node/tree/v18.12.1/test/abort/test-abort-fatal-error.js)
|
- [abort/test-abort-fatal-error.js](https://github.com/nodejs/node/tree/v18.12.1/test/abort/test-abort-fatal-error.js)
|
||||||
|
@ -1052,7 +1052,6 @@ Total: 2999
|
||||||
- [parallel/test-http-header-overflow.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-header-overflow.js)
|
- [parallel/test-http-header-overflow.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-header-overflow.js)
|
||||||
- [parallel/test-http-header-owstext.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-header-owstext.js)
|
- [parallel/test-http-header-owstext.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-header-owstext.js)
|
||||||
- [parallel/test-http-header-read.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-header-read.js)
|
- [parallel/test-http-header-read.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-header-read.js)
|
||||||
- [parallel/test-http-header-validators.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-header-validators.js)
|
|
||||||
- [parallel/test-http-hex-write.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-hex-write.js)
|
- [parallel/test-http-hex-write.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-hex-write.js)
|
||||||
- [parallel/test-http-highwatermark.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-highwatermark.js)
|
- [parallel/test-http-highwatermark.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-highwatermark.js)
|
||||||
- [parallel/test-http-host-header-ipv6-fail.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-host-header-ipv6-fail.js)
|
- [parallel/test-http-host-header-ipv6-fail.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-http-host-header-ipv6-fail.js)
|
||||||
|
|
Loading…
Reference in a new issue