Skip to content

Commit 1646754

Browse files
committed
wip
1 parent c049ccd commit 1646754

File tree

10 files changed

+64
-24
lines changed

10 files changed

+64
-24
lines changed

dist/index.cjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ function correctHeaders(src) {
475475
if (typeof prop !== "string") {
476476
throw new Error(`Invalid header key type '${typeof prop}' of ${prop}`);
477477
}
478-
if (prop in dst)
478+
if (prop.toLowerCase() in dst)
479479
return dst;
480480
dst[prop.toLowerCase()] = [];
481481
} else {

dist/index.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ function correctHeaders(src) {
365365
if (typeof prop !== "string") {
366366
throw new Error(`Invalid header key type '${typeof prop}' of ${prop}`);
367367
}
368-
if (prop in dst)
368+
if (prop.toLowerCase() in dst)
369369
return dst;
370370
dst[prop.toLowerCase()] = [];
371371
} else {

dist/rfc9421/const.d.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Structured Field Value Type Dictionary
3+
* https://datatracker.ietf.org/doc/html/rfc8941
4+
*
5+
* key: field name
6+
* value: item, list, dict
7+
*/
8+
export type SFVHeaderTypeDictionary = Record<string, 'item' | 'list' | 'dict'>;
9+
/**
10+
* Dictionary of field name known to be structured field value
11+
* TODO: Find official registry
12+
*/
13+
export declare const knownSfvHeaderTypeDictionary: {
14+
/**
15+
* RFC 9421 HTTP Message Signatures
16+
* https://datatracker.ietf.org/doc/html/rfc9421#name-initial-contents-3
17+
*/
18+
signature: "dict";
19+
'signature-input': "dict";
20+
'accept-signature': "dict";
21+
/**
22+
* RFC 9530 Digest Fields
23+
* https://datatracker.ietf.org/doc/html/rfc9530#name-http-field-name-registratio
24+
*/
25+
'content-digest': "dict";
26+
'repr-digest': "dict";
27+
'want-content-digest': "dict";
28+
'want-repr-digest': "dict";
29+
};

dist/rfc9421/sign.d.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
11
/// <reference types="node" />
22
import type { IncomingRequest, MapLikeObj, OutgoingResponse, SFVSignatureInputDictionary, SFVSignatureInputDictionaryForInput, HeadersLike } from "../types";
3-
/**
4-
* Structured Field Value Type Dictionary
5-
* https://datatracker.ietf.org/doc/html/rfc8941
6-
*
7-
* key: field (header) name
8-
* value: item, list, dict
9-
*/
10-
export type SFVHeaderTypeDictionary = Record<string, 'item' | 'list' | 'dict'>;
11-
export declare const sfvHeaderTypeDictionaryIKnow: {
12-
signature: "dict";
13-
'signature-input': "dict";
14-
'content-digest': "dict";
15-
};
3+
import { SFVHeaderTypeDictionary } from "./const";
164
export declare const requestTargetDerivedComponents: string[];
175
export declare const responseTargetDerivedComponents: string[];
186
export type Kot<T> = keyof T extends 'req' ? T : null;

dist/types.d.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
import type { IncomingMessage, ServerResponse } from "http";
55
import type { Http2ServerRequest, Http2ServerResponse } from "http2";
66
import type { webcrypto } from "node:crypto";
7-
export type HeadersValueLike = string | number | null | undefined | (string | number | null | undefined)[];
8-
export type HeadersLike = Record<string, HeadersValueLike>;
7+
export type HeadersValueLike = string | number | null | undefined;
8+
export type HeadersValueLikeArrayable = HeadersValueLike | HeadersValueLike[];
9+
export type HeadersLike = Record<string, HeadersValueLikeArrayable>;
910
export type RequestLike = {
1011
url: string;
1112
method: string;
1213
headers: HeadersLike;
13-
rawHeaders?: (string | number | null | undefined)[];
14+
rawHeaders?: HeadersValueLike[] | [string, HeadersValueLike][];
1415
getHeaders?: () => HeadersLike;
1516
body?: string;
1617
trailers?: Record<string, string>;
@@ -24,7 +25,7 @@ export type ResponseLike = {
2425
req: RequestLike;
2526
statusCode: number;
2627
headers: HeadersLike;
27-
rawHeaders?: (string | number | null | undefined)[];
28+
rawHeaders?: HeadersValueLike[];
2829
getHeaders?: () => HeadersLike;
2930
body?: string;
3031
trailers?: Record<string, string>;

dist/utils.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/// <reference types="node" />
2-
import type { MapLikeObj, SignInfo, SignatureHashAlgorithmUpperSnake, HeadersLike, HeadersValueLike } from './types.js';
2+
import type { MapLikeObj, SignInfo, SignatureHashAlgorithmUpperSnake, HeadersLike, HeadersValueLike, HeadersValueLikeArrayable } from './types.js';
33
import { ParsedAlgorithmIdentifier } from './pem/spki.js';
44
import type { webcrypto } from 'node:crypto';
55
export declare function getWebcrypto(): Promise<webcrypto.Crypto>;
@@ -11,7 +11,7 @@ export declare function removeObsoleteLineFolding(str: string): string;
1111
/**
1212
* RFC 9421 2.1 (If the correctly combined value is not directly available for a given field by an implementation, ...)
1313
*/
14-
export declare function canonicalizeHeaderValue(value: HeadersValueLike): string;
14+
export declare function canonicalizeHeaderValue(value: HeadersValueLikeArrayable): string;
1515
/**
1616
* Convert object keys to lowercase
1717
* (Headers in Fetch API joins multiple headers with ',', but it must be ', ' in RFC 9421)
@@ -38,7 +38,7 @@ export declare function toStringOrToLc(src: string | number | undefined | null):
3838
* Convert rawHeaders to object
3939
* rawHeaders: https://nodejs.org/api/http2.html#requestrawheaders
4040
*/
41-
export declare function correctHeaders(src: (string | number | undefined | null)[]): Record<string, (string | number)[]>;
41+
export declare function correctHeaders(src: HeadersValueLike[]): Record<string, (string | number)[]>;
4242
/**
4343
* Convert number to Uint8Array, for ASN.1 length field
4444
*/

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export * from './draft/parse.js';
1616
export * from './draft/sign.js';
1717
export * from './draft/verify.js';
1818

19+
//export * from './rfc9421/const.js';
1920
//export * from './rfc9421/parse.js';
2021
//export * from './rfc9421/sign.js';
2122
//export * from './rfc9421/verify.js';

src/rfc9421/sign.base.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,27 @@ describe(RFC9421SignatureBaseFactory, () => {
117117
});
118118
});
119119

120+
test('request with raw headers (entries)', () => {
121+
const request = {
122+
...requestBase,
123+
rawHeaders: [
124+
...Object.entries(requestBase.headers),
125+
['x-test', 'value'],
126+
['x-test', 'value2'],
127+
['X-Test', null],
128+
].flat(2),
129+
} satisfies RequestLike;
130+
const factory = new RFC9421SignatureBaseFactory(
131+
request,
132+
tinySignatureInput,
133+
);
134+
expect(factory.requestHeaders).toEqual({
135+
date: ['Tue, 07 Jun 2014 20:51:35 GMT'],
136+
host: ['example.com'],
137+
'x-test': ['value', 'value2', ''],
138+
});
139+
});
140+
120141
test('response basic', () => {
121142
const factory = new RFC9421SignatureBaseFactory(
122143
responseBase,

src/rfc9421/sign.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ export class RFC9421SignatureBaseFactory<T extends IncomingRequest | OutgoingRes
108108
*/
109109
public getHeadersMap(source: IncomingRequest | OutgoingResponse): HeadersLike {
110110
if ('rawHeaders' in source && source.rawHeaders) {
111-
return correctHeaders(source.rawHeaders);
111+
return correctHeaders(source.rawHeaders.flat(1));
112112
} else if ('getHeaders' in source && typeof source.getHeaders === 'function') {
113113
return lcObjectKey(source.getHeaders());
114114
} else if ('headers' in source && source.headers) {

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export type RequestLike = {
1111
method: string;
1212
headers: HeadersLike
1313
// https://nodejs.org/api/http2.html#requestrawheaders
14-
rawHeaders?: HeadersValueLike[];
14+
rawHeaders?: HeadersValueLike[] | [string, HeadersValueLike][];
1515
getHeaders?: () => HeadersLike;
1616
body?: string;
1717
trailers?: Record<string, string>;

0 commit comments

Comments
 (0)