'use strict'
const { describe, test } = require('node:test')
const { parseHttpDate } = require('../../lib/util/date')
const { runtimeFeatures } = require('../../lib/util/runtime-features')
const skipFuzzing = runtimeFeatures.has('crypto') === false
describe('parseHttpDate', () => {
test('IMF-fixdate', (t) => {
const values = {
'Sun, 06 Nov 1994 08:49:37 GMT': new Date(Date.UTC(1994, 10, 6, 8, 49, 37)),
'Fri, 18 Aug 1950 02:01:18 GMT': new Date(Date.UTC(1950, 7, 18, 2, 1, 18)),
'Wed, 11 Dec 2024 23:20:57 GMT': new Date(Date.UTC(2024, 11, 11, 23, 20, 57)),
'Wed,\t11 Dec 2024 23:20:57 GMT': undefined, // Invalid whitespace
'Wed, 11\tDec 2024 23:20:57 GMT': undefined, // Invalid whitespace
'Wed, 11 Dec\t2024 23:20:57 GMT': undefined, // Invalid whitespace
'Wed, 11 Dec 2024\t23:20:57 GMT': undefined, // Invalid whitespace
'Wed, 11 Dec 2024 23:20:57\tGMT': undefined, // Invalid whitespace
'Wed, 11 Dec 2024 23.20:57 GMT': undefined, // Invalid separator
'Wed, 11 Dec 2024 23:20.57 GMT': undefined, // Invalid separator
'Wed, 11 Dec 2024 23:20:57 UTC': undefined, // UTC is not a valid timezone
'Wed, aa Dec 2024 23:20:57 GMT': undefined, // NaN day
'aaa, 06 Dec 2024 23:20:57 GMT': undefined, // Invalid day name
'Wed, 01 aaa 2024 23:20:57 GMT': undefined, // Invalid month
'Wed, 6 Dec 2024 23:20:07 GMT': undefined, // No leading zero
'Wed, 06 Dec 2024 3:20:07 GMT': undefined, // No leading zero
'Wed, 06 Dec 2024 23:1:07 GMT': undefined, // No leading zero
'Wed, 06 Dec 2024 23:01:7 GMT': undefined, // No leading zero
'Wed, a6 Dec 2024 23:01:07 GMT': undefined, // No leading zero
'Wed, 06 Dec aaaa 23:01:07 GMT': undefined, // NaN year
'Wed, 06 Dec 2024 aa:01:07 GMT': undefined, // NaN hour
'Wed, 06 Dec 2024 23:aa:07 GMT': undefined, // NaN min
'Wed, 06 Dec 2024 23:01:a7 GMT': undefined, // NaN sec
'Wed, 06 Dec 2024 23:01:+7 GMT': undefined, // NaN sec
'Wed, 06 Dec 2024 23:01:aa GMT': undefined, // NaN sec
'Wed, 32 Dec 2024 00:00:00 GMT': undefined, // Invalid day overflow
'Sat, 29 Feb 2025 00:00:00 GMT': undefined // Invalid leap day overflow
}
for (const date of Object.keys(values)) {
t.assert.deepStrictEqual(parseHttpDate(date), values[date], date)
}
})
test('RFC850', (t) => {
const values = {
'Sunday, 06-Nov-94 08:49:37 GMT': new Date(Date.UTC(1994, 10, 6, 8, 49, 37)),
'Monday, 07-Nov-94 08:49:37 GMT': new Date(Date.UTC(1994, 10, 7, 8, 49, 37)),
'Tuesday, 08-Nov-94 08:49:37 GMT': new Date(Date.UTC(1994, 10, 8, 8, 49, 37)),
'Wednesday, 09-Nov-94 08:49:37 GMT': new Date(Date.UTC(1994, 10, 9, 8, 49, 37)),
'Thursday, 10-Nov-94 08:49:37 GMT': new Date(Date.UTC(1994, 10, 10, 8, 49, 37)),
'Friday, 11-Nov-94 08:49:37 GMT': new Date(Date.UTC(1994, 10, 11, 8, 49, 37)),
'Saturday, 12-Nov-94 08:49:37 GMT': new Date(Date.UTC(1994, 10, 12, 8, 49, 37)),
'Thursday, 18-Aug-50 02:01:18 GMT': new Date(Date.UTC(2050, 7, 18, 2, 1, 18)),
'Wednesday, 11-Dec-24 23:20:57 GMT': new Date(Date.UTC(2024, 11, 11, 23, 20, 57)),
'Wednesday, 11-Dec-24 23:20:57 UTC': undefined, // UTC is not a valid timezone
'Wednesday 11-Dec-24 23:20:57 GMT': undefined, // no comma
'Wednesday, 11-Dec-bc 23:20:57 GMT': undefined, // NaN year
'Wednesday, aa Dec 2024 23:20:57 GMT': undefined, // NaN day
'Thursday, +7-Aug-50 02:01:18 GMT': undefined, // NaN day
'Funday, 06-Nov-94 08:49:37 GMT': undefined, // invalid day name
'aaa, 06 Dec 2024 23:20:57 GMT': undefined, // Invalid day name
'Wednesday, 01-aaa-24 23:20:57 GMT': undefined, // Invalid month
'Wednesday, 6-Dec-24 23:20:07 GMT': undefined, // No leading zero
'Wednesday, 06-Dec-24 3:20:07 GMT': undefined, // No leading zero
'Wednesday, 06-Dec-24 23:1:07 GMT': undefined, // No leading zero
'Wednesday, 06-Dec-24 23:01:7 GMT': undefined, // No leading zero
'Wednesday, 06 Dec-aa 23:01:07 GMT': undefined, // NaN year
'Wednesday, 06-Dec-24 aa:01:07 GMT': undefined, // NaN hour
'Wednesday, 06-Dec-24 23:aa:07 GMT': undefined, // NaN min
'Wednesday, 06-Dec-24 23:01:+7 GMT': undefined, // NaN min
'Wednesday, 06-Dec-24 23:01:aa GMT': undefined, // NaN sec
'Wednesday, 32-Dec-24 00:00:00 GMT': undefined // Invalid day overflow
}
for (const date of Object.keys(values)) {
t.assert.deepStrictEqual(parseHttpDate(date), values[date], date)
}
})
test('asctime()', (t) => {
const values = {
'Sun Nov 6 08:49:37 1994': new Date(Date.UTC(1994, 10, 6, 8, 49, 37)),
'Fri Aug 18 02:01:18 1950': new Date(Date.UTC(1950, 7, 18, 2, 1, 18)),
'Wed Dec 11 23:20:57 2024': new Date(Date.UTC(2024, 11, 11, 23, 20, 57)),
'Mon Jan 1 23:20:57 2024': new Date(Date.UTC(2024, 0, 1, 23, 20, 57)),
'Thu Feb 1 23:20:57 2024': new Date(Date.UTC(2024, 1, 1, 23, 20, 57)),
'Fri Mar 1 23:20:57 2024': new Date(Date.UTC(2024, 2, 1, 23, 20, 57)),
'Mon Apr 1 23:20:57 2024': new Date(Date.UTC(2024, 3, 1, 23, 20, 57)),
'Wed May 1 23:20:57 2024': new Date(Date.UTC(2024, 4, 1, 23, 20, 57)),
'Sat Jun 1 23:20:57 2024': new Date(Date.UTC(2024, 5, 1, 23, 20, 57)),
'Mon Jul 1 23:20:57 2024': new Date(Date.UTC(2024, 6, 1, 23, 20, 57)),
'Thu Aug 1 23:20:57 2024': new Date(Date.UTC(2024, 7, 1, 23, 20, 57)),
'Sun Sep 1 23:20:57 2024': new Date(Date.UTC(2024, 8, 1, 23, 20, 57)),
'Tue Oct 1 23:20:57 2024': new Date(Date.UTC(2024, 9, 1, 23, 20, 57)),
'Fri Nov 1 23:20:57 2024': new Date(Date.UTC(2024, 10, 1, 23, 20, 57)),
'Sun Dec 1 23:20:57 2024': new Date(Date.UTC(2024, 11, 1, 23, 20, 57)),
'Mon Jan 1 00:20:57 2024': new Date(Date.UTC(2024, 0, 1, 0, 20, 57)),
'Mon Jan 1 01:20:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 20, 57)),
'Mon Jan 1 02:20:57 2024': new Date(Date.UTC(2024, 0, 1, 2, 20, 57)),
'Mon Jan 1 03:20:57 2024': new Date(Date.UTC(2024, 0, 1, 3, 20, 57)),
'Mon Jan 1 04:20:57 2024': new Date(Date.UTC(2024, 0, 1, 4, 20, 57)),
'Mon Jan 1 05:20:57 2024': new Date(Date.UTC(2024, 0, 1, 5, 20, 57)),
'Mon Jan 1 06:20:57 2024': new Date(Date.UTC(2024, 0, 1, 6, 20, 57)),
'Mon Jan 1 07:20:57 2024': new Date(Date.UTC(2024, 0, 1, 7, 20, 57)),
'Mon Jan 1 08:20:57 2024': new Date(Date.UTC(2024, 0, 1, 8, 20, 57)),
'Mon Jan 1 09:20:57 2024': new Date(Date.UTC(2024, 0, 1, 9, 20, 57)),
'Mon Jan 1 10:20:57 2024': new Date(Date.UTC(2024, 0, 1, 10, 20, 57)),
'Mon Jan 1 11:20:57 2024': new Date(Date.UTC(2024, 0, 1, 11, 20, 57)),
'Mon Jan 1 12:20:57 2024': new Date(Date.UTC(2024, 0, 1, 12, 20, 57)),
'Mon Jan 1 13:20:57 2024': new Date(Date.UTC(2024, 0, 1, 13, 20, 57)),
'Mon Jan 1 14:20:57 2024': new Date(Date.UTC(2024, 0, 1, 14, 20, 57)),
'Mon Jan 1 15:20:57 2024': new Date(Date.UTC(2024, 0, 1, 15, 20, 57)),
'Mon Jan 1 16:20:57 2024': new Date(Date.UTC(2024, 0, 1, 16, 20, 57)),
'Mon Jan 1 17:20:57 2024': new Date(Date.UTC(2024, 0, 1, 17, 20, 57)),
'Mon Jan 1 18:20:57 2024': new Date(Date.UTC(2024, 0, 1, 18, 20, 57)),
'Mon Jan 1 19:20:57 2024': new Date(Date.UTC(2024, 0, 1, 19, 20, 57)),
'Mon Jan 1 20:20:57 2024': new Date(Date.UTC(2024, 0, 1, 20, 20, 57)),
'Mon Jan 1 21:20:57 2024': new Date(Date.UTC(2024, 0, 1, 21, 20, 57)),
'Mon Jan 1 22:20:57 2024': new Date(Date.UTC(2024, 0, 1, 22, 20, 57)),
// 'Mon Jan 1 23:20:57 2024': new Date(Date.UTC(2024, 0, 1, 23, 20, 57)),
'Mon Jan 1 24:20:57 2024': undefined, // Invalid hour
'Mon Jan 1 01:00:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 0, 57)),
'Mon Jan 1 01:01:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 1, 57)),
'Mon Jan 1 01:02:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 2, 57)),
'Mon Jan 1 01:03:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 3, 57)),
'Mon Jan 1 01:04:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 4, 57)),
'Mon Jan 1 01:05:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 5, 57)),
'Mon Jan 1 01:06:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 6, 57)),
'Mon Jan 1 01:07:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 7, 57)),
'Mon Jan 1 01:08:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 8, 57)),
'Mon Jan 1 01:09:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 9, 57)),
'Mon Jan 1 01:10:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 10, 57)),
'Mon Jan 1 01:11:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 11, 57)),
'Mon Jan 1 01:12:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 12, 57)),
'Mon Jan 1 01:13:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 13, 57)),
'Mon Jan 1 01:14:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 14, 57)),
'Mon Jan 1 01:15:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 15, 57)),
'Mon Jan 1 01:16:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 16, 57)),
'Mon Jan 1 01:17:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 17, 57)),
'Mon Jan 1 01:18:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 18, 57)),
'Mon Jan 1 01:19:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 19, 57)),
// 'Mon Jan 1 01:20:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 20, 57)),
'Mon Jan 1 01:21:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 21, 57)),
'Mon Jan 1 01:22:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 22, 57)),
'Mon Jan 1 01:23:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 23, 57)),
'Mon Jan 1 01:24:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 24, 57)),
'Mon Jan 1 01:25:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 25, 57)),
'Mon Jan 1 01:26:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 26, 57)),
'Mon Jan 1 01:27:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 27, 57)),
'Mon Jan 1 01:28:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 28, 57)),
'Mon Jan 1 01:29:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 29, 57)),
'Mon Jan 1 01:30:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 30, 57)),
'Mon Jan 1 01:31:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 31, 57)),
'Mon Jan 1 01:32:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 32, 57)),
'Mon Jan 1 01:33:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 33, 57)),
'Mon Jan 1 01:34:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 34, 57)),
'Mon Jan 1 01:35:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 35, 57)),
'Mon Jan 1 01:36:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 36, 57)),
'Mon Jan 1 01:37:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 37, 57)),
'Mon Jan 1 01:38:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 38, 57)),
'Mon Jan 1 01:39:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 39, 57)),
'Mon Jan 1 01:40:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 40, 57)),
'Mon Jan 1 01:41:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 41, 57)),
'Mon Jan 1 01:42:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 42, 57)),
'Mon Jan 1 01:43:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 43, 57)),
'Mon Jan 1 01:44:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 44, 57)),
'Mon Jan 1 01:45:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 45, 57)),
'Mon Jan 1 01:46:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 46, 57)),
'Mon Jan 1 01:47:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 47, 57)),
'Mon Jan 1 01:48:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 48, 57)),
'Mon Jan 1 01:49:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 49, 57)),
'Mon Jan 1 01:50:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 50, 57)),
'Mon Jan 1 01:51:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 51, 57)),
'Mon Jan 1 01:52:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 52, 57)),
'Mon Jan 1 01:53:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 53, 57)),
'Mon Jan 1 01:54:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 54, 57)),
'Mon Jan 1 01:55:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 55, 57)),
'Mon Jan 1 01:56:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 56, 57)),
'Mon Jan 1 01:57:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 57, 57)),
'Mon Jan 1 01:58:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 58, 57)),
'Mon Jan 1 01:59:57 2024': new Date(Date.UTC(2024, 0, 1, 1, 59, 57)),
'Mon Jan 1 01:60:57 2024': undefined, // Invalid minute
'Mon Jan 1 02:00:00 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 0)),
'Mon Jan 1 02:00:01 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 1)),
'Mon Jan 1 02:00:02 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 2)),
'Mon Jan 1 02:00:03 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 3)),
'Mon Jan 1 02:00:04 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 4)),
'Mon Jan 1 02:00:05 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 5)),
'Mon Jan 1 02:00:06 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 6)),
'Mon Jan 1 02:00:07 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 7)),
'Mon Jan 1 02:00:08 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 8)),
'Mon Jan 1 02:00:09 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 9)),
'Mon Jan 1 02:00:10 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 10)),
'Mon Jan 1 02:00:11 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 11)),
'Mon Jan 1 02:00:12 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 12)),
'Mon Jan 1 02:00:13 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 13)),
'Mon Jan 1 02:00:14 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 14)),
'Mon Jan 1 02:00:15 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 15)),
'Mon Jan 1 02:00:16 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 16)),
'Mon Jan 1 02:00:17 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 17)),
'Mon Jan 1 02:00:18 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 18)),
'Mon Jan 1 02:00:19 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 19)),
'Mon Jan 1 02:00:20 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 20)),
'Mon Jan 1 02:00:21 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 21)),
'Mon Jan 1 02:00:22 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 22)),
'Mon Jan 1 02:00:23 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 23)),
'Mon Jan 1 02:00:24 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 24)),
'Mon Jan 1 02:00:25 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 25)),
'Mon Jan 1 02:00:26 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 26)),
'Mon Jan 1 02:00:27 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 27)),
'Mon Jan 1 02:00:28 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 28)),
'Mon Jan 1 02:00:29 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 29)),
'Mon Jan 1 02:00:30 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 30)),
'Mon Jan 1 02:00:31 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 31)),
'Mon Jan 1 02:00:32 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 32)),
'Mon Jan 1 02:00:33 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 33)),
'Mon Jan 1 02:00:34 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 34)),
'Mon Jan 1 02:00:35 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 35)),
'Mon Jan 1 02:00:36 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 36)),
'Mon Jan 1 02:00:37 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 37)),
'Mon Jan 1 02:00:38 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 38)),
'Mon Jan 1 02:00:39 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 39)),
'Mon Jan 1 02:00:40 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 40)),
'Mon Jan 1 02:00:41 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 41)),
'Mon Jan 1 02:00:42 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 42)),
'Mon Jan 1 02:00:43 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 43)),
'Mon Jan 1 02:00:44 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 44)),
'Mon Jan 1 02:00:45 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 45)),
'Mon Jan 1 02:00:46 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 46)),
'Mon Jan 1 02:00:47 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 47)),
'Mon Jan 1 02:00:48 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 48)),
'Mon Jan 1 02:00:49 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 49)),
'Mon Jan 1 02:00:50 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 50)),
'Mon Jan 1 02:00:51 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 51)),
'Mon Jan 1 02:00:52 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 52)),
'Mon Jan 1 02:00:53 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 53)),
'Mon Jan 1 02:00:54 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 54)),
'Mon Jan 1 02:00:55 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 55)),
'Mon Jan 1 02:00:56 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 56)),
'Mon Jan 1 02:00:57 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 57)),
'Mon Jan 1 02:00:58 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 58)),
'Mon Jan 1 02:00:59 2024': new Date(Date.UTC(2024, 0, 1, 2, 0, 59)),
'Mon Jan 1 02:00:60 2024': undefined, // Invalid second
'Wed Dec aa 23:20:57 2024': undefined, // NaN day
'aaa Dec 06 23:20:57 2024': undefined, // Invalid day name
'Wed aaa 01 23:20:57 2024': undefined, // Invalid month
'Wed Dec 11 +3:20:57 2024': undefined, // No leading zero
'Wed Dec 11 23:+0:57 2024': undefined, // No leading zero
'Wed Dec 11 23:20:+7 2024': undefined, // No leading zero
'Wed Dec 11 23:20:07 t024': undefined, // No leading zero
'Wed Dec 6 23:20:07 2024': undefined, // No leading zero
'Wed Dec 06 3:20:07 2024': undefined, // No leading zero
'Wed Dec 06 23:1:07 2024': undefined, // No leading zero
'Wed Dec 06 23:01:7 2024': undefined, // No leading zero
'Wed 06 Dec 23:01:07 aaaa': undefined, // NaN year
'Wed Dec 06 aa:01:07 2024': undefined, // NaN hour
'Wed Dec 06 23:aa:07 2024': undefined, // NaN min
'Wed Dec 06 23:01:aa 2024': undefined, // NaN sec
'Wed Dec 32 00:00:00 2024': undefined // Invalid day overflow
}
for (const date of Object.keys(values)) {
t.assert.deepStrictEqual(parseHttpDate(date), values[date], date)
}
})
const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
const daysLong = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
const fuzzingCount = 1e6
test('fuzzing asctime', { skip: skipFuzzing }, (t) => {
const { randomInt } = require('node:crypto')
function asctime (date) {
let result = ''
result += days[date.getUTCDay()]
result += ' '
result += months[date.getUTCMonth()]
result += ' '
result += date.getUTCDate().toString().padStart(2, ' ')
result += ' '
result += date.getUTCHours().toString().padStart(2, '0')
result += ':'
result += date.getUTCMinutes().toString().padStart(2, '0')
result += ':'
result += date.getUTCSeconds().toString().padStart(2, '0')
result += ' '
result += date.getUTCFullYear().toString().padStart(4, '0')
return result
}
for (let i = 0; i < fuzzingCount; i++) {
const date = new Date(Date.UTC(
randomInt(0, 9999), // Year between 0 and 3000
randomInt(0, 11), // Month between 0 and 11
randomInt(1, 31), // Day between 1 and 31
randomInt(0, 23), // Hour between 0 and 23
randomInt(0, 59), // Minute between 0 and 59
randomInt(0, 59) // Second between 0 and 59
))
const dateAsAscTime = asctime(date)
t.assert.deepStrictEqual(parseHttpDate(dateAsAscTime), date, `Fuzzing failed for: ${dateAsAscTime}`)
}
})
test('fuzzing imf', { skip: skipFuzzing }, (t) => {
const { randomInt } = require('node:crypto')
for (let i = 0; i < fuzzingCount; i++) {
const date = new Date(Date.UTC(
randomInt(0, 9999), // Year between 0 and 3000
randomInt(0, 11), // Month between 0 and 11
randomInt(1, 31), // Day between 1 and 31
randomInt(0, 23), // Hour between 0 and 23
randomInt(0, 59), // Minute between 0 and 59
randomInt(0, 59) // Second between 0 and 59
))
const dateAsImf = date.toUTCString()
t.assert.deepStrictEqual(parseHttpDate(dateAsImf), date, `Fuzzing failed for: ${dateAsImf}`)
}
})
test('fuzzing rfc850', { skip: skipFuzzing }, (t) => {
const { randomInt } = require('node:crypto')
function rfc850 (date) {
let result = ''
result += daysLong[date.getUTCDay()]
result += ', '
result += date.getUTCDate().toString().padStart(2, '0')
result += '-'
result += months[date.getUTCMonth()]
result += '-'
result += date.getUTCFullYear().toString().slice(2)
result += ' '
result += date.getUTCHours().toString().padStart(2, '0')
result += ':'
result += date.getUTCMinutes().toString().padStart(2, '0')
result += ':'
result += date.getUTCSeconds().toString().padStart(2, '0')
result += ' GMT'
return result
}
const minYear = 1970
const maxYear = 2069
for (let i = 0; i < fuzzingCount; i++) {
const date = new Date(Date.UTC(
randomInt(minYear, maxYear), // Year between minYear and maxYear
randomInt(0, 11), // Month between 0 and 11
randomInt(1, 31), // Day between 1 and 31
randomInt(0, 23), // Hour between 0 and 23
randomInt(0, 59), // Minute between 0 and 59
randomInt(0, 59) // Second between 0 and 59
))
const dateAsRfc850 = rfc850(date)
t.assert.deepStrictEqual(parseHttpDate(dateAsRfc850), date, `Fuzzing failed for: ${dateAsRfc850}`)
}
})
})