1
+ import { Server } from 'node:http'
1
2
import supertest , { SuperTest , Test } from 'supertest'
2
- import { describe , it , expect , beforeEach } from 'vitest'
3
+ import { describe , it , expect , beforeEach , afterEach } from 'vitest'
3
4
import { fetch } from 'node-fetch-native'
4
- import { createApp , toNodeListener , App , eventHandler } from '../src'
5
- import { sendProxy } from '../src/utils/proxy'
5
+ import { createApp , toNodeListener , App , eventHandler , getHeaders , getMethod , readRawBody } from '../src'
6
+ import { sendProxy , proxyRequest } from '../src/utils/proxy'
6
7
7
8
describe ( '' , ( ) => {
8
9
let app : App
9
10
let request : SuperTest < Test >
10
11
11
- beforeEach ( ( ) => {
12
+ let server : Server
13
+ let url : string
14
+
15
+ beforeEach ( async ( ) => {
12
16
app = createApp ( { debug : false } )
13
17
request = supertest ( toNodeListener ( app ) )
18
+ server = new Server ( toNodeListener ( app ) )
19
+ await new Promise ( ( resolve ) => { server . listen ( 0 , ( ) => resolve ( null ) ) } )
20
+ url = 'http://localhost:' + ( server . address ( ) as any ) . port
21
+ } )
22
+
23
+ afterEach ( async ( ) => {
24
+ await new Promise ( ( resolve ) => { server . close ( ( ) => resolve ( null ) ) } )
14
25
} )
15
26
16
27
describe ( 'sendProxy' , ( ) => {
@@ -19,10 +30,36 @@ describe('', () => {
19
30
return sendProxy ( event , 'https://example.com' , { fetch } )
20
31
} ) )
21
32
22
- const result = await request
23
- . get ( '/' )
33
+ const result = await request . get ( '/' )
24
34
25
35
expect ( result . text ) . toContain ( 'a href="https://www.iana.org/domains/example">More information...</a>' )
26
36
} )
27
37
} )
38
+
39
+ describe ( 'proxyRequest' , ( ) => {
40
+ it ( 'can proxy request' , async ( ) => {
41
+ app . use ( '/debug' , eventHandler ( async ( event ) => {
42
+ const headers = getHeaders ( event )
43
+ delete headers . host
44
+ let body
45
+ try { body = await readRawBody ( event ) } catch { }
46
+ return {
47
+ method : getMethod ( event ) ,
48
+ headers,
49
+ body
50
+ }
51
+ } ) )
52
+
53
+ app . use ( '/' , eventHandler ( ( event ) => {
54
+ return proxyRequest ( event , url + '/debug' , { fetch } )
55
+ } ) )
56
+
57
+ const result = await fetch ( url + '/' , {
58
+ method : 'POST' ,
59
+ body : 'hello'
60
+ } ) . then ( r => r . text ( ) )
61
+
62
+ expect ( result ) . toMatchInlineSnapshot ( '"{\\"method\\":\\"POST\\",\\"headers\\":{\\"accept\\":\\"*/*\\",\\"accept-encoding\\":\\"gzip, deflate, br\\",\\"connection\\":\\"close\\",\\"content-length\\":\\"5\\",\\"content-type\\":\\"text/plain;charset=UTF-8\\",\\"user-agent\\":\\"node-fetch\\"},\\"body\\":\\"hello\\"}"' )
63
+ } )
64
+ } )
28
65
} )
0 commit comments