@@ -11,6 +11,7 @@ const { Client, setGlobalDispatcher, Agent } = require('../..')
11
11
const nodeFetch = require ( '../../index-fetch' )
12
12
const { once } = require ( 'events' )
13
13
const { gzipSync } = require ( 'zlib' )
14
+ const { promisify } = require ( 'util' )
14
15
15
16
setGlobalDispatcher ( new Agent ( {
16
17
keepAliveTimeout : 1 ,
@@ -165,24 +166,80 @@ test('unsupported formData 1', (t) => {
165
166
} )
166
167
} )
167
168
168
- test ( 'unsupported formData 2' , ( t ) => {
169
+ test ( 'multipart formdata not base64' , async ( t ) => {
170
+ t . plan ( 2 )
171
+ // Construct example form data, with text and blob fields
172
+ const formData = new FormData ( )
173
+ formData . append ( 'field1' , 'value1' )
174
+ const blob = new Blob ( [ 'example\ntext file' ] , { type : 'text/plain' } )
175
+ formData . append ( 'field2' , blob , 'file.txt' )
176
+
177
+ const tempRes = new Response ( formData )
178
+ const boundary = tempRes . headers . get ( 'content-type' ) . split ( 'boundary=' ) [ 1 ]
179
+ const formRaw = await tempRes . text ( )
180
+
181
+ const server = createServer ( ( req , res ) => {
182
+ res . setHeader ( 'content-type' , 'multipart/form-data; boundary=' + boundary )
183
+ res . write ( formRaw )
184
+ res . end ( )
185
+ } )
186
+ t . teardown ( server . close . bind ( server ) )
187
+
188
+ const listen = promisify ( server . listen . bind ( server ) )
189
+ await listen ( 0 )
190
+
191
+ const res = await fetch ( `http://localhost:${ server . address ( ) . port } ` )
192
+ const form = await res . formData ( )
193
+ t . equal ( form . get ( 'field1' ) , 'value1' )
194
+
195
+ const text = await form . get ( 'field2' ) . text ( )
196
+ t . equal ( text , 'example\ntext file' )
197
+ } )
198
+
199
+ test ( 'multipart formdata base64' , ( t ) => {
169
200
t . plan ( 1 )
170
201
202
+ // Example form data with base64 encoding
203
+ const formRaw = '------formdata-undici-0.5786922755719377\r\nContent-Disposition: form-data; name="key"; filename="test.txt"\r\nContent-Type: text/plain\r\nContent-Transfer-Encoding: base64\r\n\r\ndmFsdWU=\r\n------formdata-undici-0.5786922755719377--'
171
204
const server = createServer ( ( req , res ) => {
172
- res . setHeader ( 'content-type' , 'multipart/form-data' )
205
+ res . setHeader ( 'content-type' , 'multipart/form-data; boundary=----formdata-undici-0.5786922755719377' )
206
+ res . write ( formRaw )
173
207
res . end ( )
174
208
} )
175
209
t . teardown ( server . close . bind ( server ) )
176
210
177
211
server . listen ( 0 , ( ) => {
178
212
fetch ( `http://localhost:${ server . address ( ) . port } ` )
179
213
. then ( res => res . formData ( ) )
180
- . catch ( err => {
181
- t . equal ( err . name , 'NotSupportedError' )
214
+ . then ( form => form . get ( 'key' ) . text ( ) )
215
+ . then ( text => {
216
+ t . equal ( text , 'value' )
182
217
} )
183
218
} )
184
219
} )
185
220
221
+ test ( 'busboy emit error' , async ( t ) => {
222
+ t . plan ( 1 )
223
+ const formData = new FormData ( )
224
+ formData . append ( 'field1' , 'value1' )
225
+
226
+ const tempRes = new Response ( formData )
227
+ const formRaw = await tempRes . text ( )
228
+
229
+ const server = createServer ( ( req , res ) => {
230
+ res . setHeader ( 'content-type' , 'multipart/form-data; boundary=wrongboundary' )
231
+ res . write ( formRaw )
232
+ res . end ( )
233
+ } )
234
+ t . teardown ( server . close . bind ( server ) )
235
+
236
+ const listen = promisify ( server . listen . bind ( server ) )
237
+ await listen ( 0 )
238
+
239
+ const res = await fetch ( `http://localhost:${ server . address ( ) . port } ` )
240
+ await t . rejects ( res . formData ( ) , 'Unexpected end of multipart data' )
241
+ } )
242
+
186
243
test ( 'urlencoded formData' , ( t ) => {
187
244
t . plan ( 2 )
188
245
0 commit comments