Skip to content

Commit 01366c8

Browse files
author
v1rtl
committed
handle empty response
1 parent 97210d6 commit 01366c8

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

mod.ts

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,31 @@ import { HandlerOrListener } from './types.ts'
33

44
const port = await getFreePort(8080)
55

6+
const fetchEndpoint = async (
7+
port: number,
8+
url: string | URL,
9+
params?: RequestInit,
10+
) => {
11+
const res = await fetch(
12+
`http://localhost:${port}${url}`,
13+
params,
14+
)
15+
let data: unknown
16+
const ct = res.headers.get('Content-Type')
17+
if (ct === 'application/json') data = await res.json()
18+
else if (ct?.includes('text')) data = await res.text()
19+
else if (ct === null) data = await res.text()
20+
else data = await res.arrayBuffer()
21+
return { res, data }
22+
}
23+
624
const makeFetchPromise = (handlerOrListener: HandlerOrListener) => {
725
// listener
826
if ('rid' in handlerOrListener && 'addr' in handlerOrListener) {
927
return async (url: URL | string = '', params?: RequestInit) => {
1028
const p = new Promise<{ res: Response; data?: unknown }>((resolve) => {
1129
setTimeout(async () => {
12-
const res = await fetch(
13-
`http://localhost:${port}${url}`,
14-
params,
15-
)
16-
let data: unknown
17-
const ct = res.headers.get('Content-Type')
18-
if (ct === 'application/json') data = await res.json()
19-
else if (ct?.includes('text')) data = await res.text()
20-
else data = await res.arrayBuffer()
21-
30+
const { res, data } = await fetchEndpoint(port, url, params)
2231
resolve({ res, data })
2332
Deno.close(conn.rid + 1)
2433
handlerOrListener.close()
@@ -43,16 +52,7 @@ const makeFetchPromise = (handlerOrListener: HandlerOrListener) => {
4352
return async (url: URL | string = '', params?: RequestInit) => {
4453
const p = new Promise<{ res: Response; data?: unknown }>((resolve) => {
4554
setTimeout(async () => {
46-
const res = await fetch(
47-
`http://localhost:${port}${url}`,
48-
params,
49-
)
50-
let data: unknown
51-
const ct = res.headers.get('Content-Type')
52-
if (ct === 'application/json') data = await res.json()
53-
else if (ct?.includes('text')) data = await res.text()
54-
else data = await res.arrayBuffer()
55-
55+
const { res, data } = await fetchEndpoint(port, url, params)
5656
resolve({ res, data })
5757
Deno.close(conn.rid + 1)
5858
listener.close()
@@ -87,7 +87,7 @@ export const makeFetch = (h: HandlerOrListener) => {
8787
}
8888
const expectHeader = (a: string, b: string | RegExp | null | string[]) => {
8989
const header = res.headers.get(a)
90-
90+
9191
if (b instanceof RegExp) {
9292
if (header === null) {
9393
throw new Error(`expected header ${header} to not be empty`)
@@ -112,7 +112,9 @@ export const makeFetch = (h: HandlerOrListener) => {
112112
assertEquals(
113113
header,
114114
b,
115-
`expected to have header ${a} ${header === null ? 'empty' : `with value ${b}, got ${header}`}`,
115+
`expected to have header ${a} ${
116+
header === null ? 'empty' : `with value ${b}, got ${header}`
117+
}`,
116118
)
117119
}
118120
return {

mod_test.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { makeFetch } from './mod.ts'
88
import { Handler } from './types.ts'
99
import { AssertionError } from 'https://deno.land/std@0.182.0/testing/asserts.ts'
1010

11+
const tw = new TextDecoder()
12+
1113
describe('makeFetch', () => {
1214
it('should work with HTTP handler', async () => {
1315
const handler: Handler = () => new Response('Hello World')
@@ -28,11 +30,18 @@ describe('makeFetch', () => {
2830
})
2931
it('should fallback to arraybuffer', async () => {
3032
const file = await Deno.readFile('README.md')
31-
const handler: Handler = () => new Response(file)
33+
const handler: Handler = () => new Response(file,{headers: {'Content-Type': 'text/markdown'}})
34+
const fetch = makeFetch(handler)
35+
const res = await fetch('/')
36+
37+
res.expect(tw.decode(file))
38+
})
39+
it('should return empty response if content-type is null', async () => {
40+
const handler: Handler = () => new Response(null)
3241
const fetch = makeFetch(handler)
3342
const res = await fetch('/')
3443

35-
res.expect(file.buffer)
44+
res.expect('')
3645
})
3746
})
3847
describe('expectStatus', () => {

0 commit comments

Comments
 (0)