Skip to content

Commit 0ad46dd

Browse files
committed
test(security): add 414 length-limit assertions 🛡️
- Add coverage for 414 on `maxRouteParamLength` - Add coverage for 414 on `maxUrlLength` - Reorder routing handler tests A–Z
1 parent b9823bd commit 0ad46dd

1 file changed

Lines changed: 43 additions & 24 deletions

File tree

tests/routing/Handler.test.ts

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,49 @@ Deno.test('Handler addMiddleware path prefix only applies to matching routes', a
2525
assertEquals(await resOther.text(), 'no')
2626
})
2727

28+
Deno.test('Handler maxRouteParamLength returns 414 when exceeded', async () => {
29+
const handler = new Routing.Handler({ maxRouteParamLength: 10 })
30+
;(
31+
handler as unknown as { routerInstance: { add: (m: string, p: string, d: unknown) => void } }
32+
).routerInstance.add('GET', '/items/:id', {
33+
handler: (ctx: Core.Context) => new Response(ctx.param('id') ?? '')
34+
})
35+
const longId = 'a'.repeat(50)
36+
const res = await handler.createHandler()(new Request(`http://localhost/items/${longId}`))
37+
assertEquals(res.status, 414)
38+
})
39+
40+
Deno.test('Handler maxUrlLength returns 414 when exceeded', async () => {
41+
const handler = new Routing.Handler({ maxUrlLength: 50 })
42+
const longPath = 'a'.repeat(200)
43+
const res = await handler.createHandler()(new Request(`http://localhost/${longPath}`))
44+
assertEquals(res.status, 414)
45+
})
46+
47+
Deno.test('Handler requestTimeoutMs returns 503 when exceeded', async () => {
48+
const handler = new Routing.Handler({ requestTimeoutMs: 5 })
49+
handler.addMiddleware('', async () => {
50+
await new Promise(r => setTimeout(r, 20))
51+
return new Response('late')
52+
})
53+
const res = await handler.createHandler()(new Request('http://localhost/'))
54+
assertEquals(res.status, 503)
55+
await res.body?.cancel()
56+
await new Promise(r => setTimeout(r, 30))
57+
})
58+
59+
Deno.test('Handler viewsDir sets ctx.state.view and can render', async () => {
60+
const viewsDir = new URL('../fixtures/views/', import.meta.url).pathname.replace(/\/$/, '')
61+
const handler = new Routing.Handler({ viewsDir })
62+
handler.addMiddleware('', async ctx => {
63+
const engine = ctx.state['view'] as { render: (p: string, d?: unknown) => Promise<string> }
64+
const html = await engine.render('hello.dve', { name: 'DX' } as Record<string, unknown>)
65+
return new Response(html)
66+
})
67+
const res = await handler.createHandler()(new Request('http://localhost/'))
68+
assertEquals(await res.text(), 'Hello DX.\n')
69+
})
70+
2871
Deno.test('Handler#createHandler with worker option sets ctx.state.worker', async () => {
2972
const handler = new Routing.Handler({
3073
worker: { scriptURL: echoWorkerUrl, poolSize: 1 }
@@ -134,18 +177,6 @@ Deno.test(
134177
}
135178
)
136179

137-
Deno.test('Handler requestTimeoutMs returns 503 when exceeded', async () => {
138-
const handler = new Routing.Handler({ requestTimeoutMs: 5 })
139-
handler.addMiddleware('', async () => {
140-
await new Promise(r => setTimeout(r, 20))
141-
return new Response('late')
142-
})
143-
const res = await handler.createHandler()(new Request('http://localhost/'))
144-
assertEquals(res.status, 503)
145-
await res.body?.cancel()
146-
await new Promise(r => setTimeout(r, 30))
147-
})
148-
149180
Deno.test('Handler#validateModule throws when method is not function', () => {
150181
const handler = new Routing.Handler()
151182
let thrown = false
@@ -169,15 +200,3 @@ Deno.test('Handler#validateModule throws when no HTTP method exported', () => {
169200
}
170201
assertEquals(thrown, true)
171202
})
172-
173-
Deno.test('Handler viewsDir sets ctx.state.view and can render', async () => {
174-
const viewsDir = new URL('../fixtures/views/', import.meta.url).pathname.replace(/\/$/, '')
175-
const handler = new Routing.Handler({ viewsDir })
176-
handler.addMiddleware('', async ctx => {
177-
const engine = ctx.state['view'] as { render: (p: string, d?: unknown) => Promise<string> }
178-
const html = await engine.render('hello.dve', { name: 'DX' } as Record<string, unknown>)
179-
return new Response(html)
180-
})
181-
const res = await handler.createHandler()(new Request('http://localhost/'))
182-
assertEquals(await res.text(), 'Hello DX.\n')
183-
})

0 commit comments

Comments
 (0)