feat: Validate Accept-DateTime.

This commit is contained in:
Ruben Verborgh 2021-01-05 10:31:31 +01:00
parent 4aed8c8b4c
commit ba5c62059a
2 changed files with 39 additions and 3 deletions

View File

@ -362,6 +362,9 @@ export const parseAcceptLanguage = (input: string): AcceptLanguage[] => {
return results; return results;
}; };
// eslint-disable-next-line max-len
const rfc1123Date = /^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), \d{2} (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{4} \d{2}:\d{2}:\d{2} GMT$/u;
/** /**
* Parses an Accept-DateTime header string. * Parses an Accept-DateTime header string.
* *
@ -369,8 +372,22 @@ export const parseAcceptLanguage = (input: string): AcceptLanguage[] => {
* *
* @returns An array with a single {@link AcceptDatetime} object. * @returns An array with a single {@link AcceptDatetime} object.
*/ */
export const parseAcceptDateTime = (input: string): AcceptDatetime[] => export const parseAcceptDateTime = (input: string): AcceptDatetime[] => {
[{ range: input, weight: 1 }]; const results: AcceptDatetime[] = [];
const range = input.trim();
if (range) {
if (!rfc1123Date.test(range)) {
logger.warn(
`Invalid Accept-DateTime range: ${range}`,
);
throw new BadRequestHttpError(
`Invalid Accept-DateTime range: ${range} does not match the RFC1123 format`,
);
}
results.push({ range, weight: 1 });
}
return results;
};
/** /**
* Adds a header value without overriding previous values. * Adds a header value without overriding previous values.

View File

@ -3,6 +3,7 @@ import {
addHeader, addHeader,
parseAccept, parseAccept,
parseAcceptCharset, parseAcceptCharset,
parseAcceptDateTime,
parseAcceptEncoding, parseAcceptEncoding,
parseAcceptLanguage, parseAcceptLanguage,
parseForwarded, parseForwarded,
@ -131,6 +132,24 @@ describe('HeaderUtil', (): void => {
}); });
}); });
describe('#parseAcceptDateTime', (): void => {
it('parses valid Accept-DateTime Headers.', async(): Promise<void> => {
expect(parseAcceptDateTime('Wed, 30 May 2007 18:47:52 GMT')).toEqual([
{ range: 'Wed, 30 May 2007 18:47:52 GMT', weight: 1 },
]);
});
it('parses empty Accept-DateTime headers.', async(): Promise<void> => {
expect(parseAcceptDateTime('')).toEqual([]);
expect(parseAcceptDateTime(' ')).toEqual([]);
});
it('rejects invalid Accept-DateTime Headers.', async(): Promise<void> => {
expect((): any => parseAcceptDateTime('a/b')).toThrow('Invalid Accept-DateTime range:');
expect((): any => parseAcceptDateTime('30 May 2007')).toThrow('Invalid Accept-DateTime range:');
});
});
describe('#addHeader', (): void => { describe('#addHeader', (): void => {
let response: HttpResponse; let response: HttpResponse;
@ -168,7 +187,7 @@ describe('HeaderUtil', (): void => {
}); });
}); });
describe('parseForwarded', (): void => { describe('#parseForwarded', (): void => {
it('parses an undefined value.', (): void => { it('parses an undefined value.', (): void => {
expect(parseForwarded()).toEqual({}); expect(parseForwarded()).toEqual({});
}); });