From 43a690c20427dbe3882c4df18ab061c5746b06fe Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Fri, 17 Sep 2021 09:00:18 -0700 Subject: [PATCH] feat(fetch): set content-length header if post data is present (#8979) --- src/server/fetch.ts | 5 ++++- tests/browsercontext-fetch.spec.ts | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/server/fetch.ts b/src/server/fetch.ts index 1ba6d6fe46..ffea40e968 100644 --- a/src/server/fetch.ts +++ b/src/server/fetch.ts @@ -136,7 +136,10 @@ export abstract class FetchRequest extends SdkObject { postData = params.formData ? serilizeFormData(params.formData, headers) : params.postData; else if (params.postData || params.formData) throw new Error(`Method ${method} does not accept post data`); - + if (postData) { + headers['content-length'] = String(postData.byteLength); + headers['content-type'] ??= 'application/octet-stream'; + } const fetchResponse = await this._sendRequest(requestUrl, options, postData); const fetchUid = this._storeResponseBody(fetchResponse.body); if (params.failOnStatusCode && (fetchResponse.status < 200 || fetchResponse.status >= 400)) diff --git a/tests/browsercontext-fetch.spec.ts b/tests/browsercontext-fetch.spec.ts index a1b0b73a40..a76bfebf39 100644 --- a/tests/browsercontext-fetch.spec.ts +++ b/tests/browsercontext-fetch.spec.ts @@ -430,6 +430,20 @@ it('should add default headers', async ({context, server, page}) => { expect(request.headers['accept-encoding']).toBe('gzip,deflate,br'); }); +it('should send content-length', async function({context, asset, server}) { + const bytes = []; + for (let i = 0; i < 256; i++) + bytes.push(i); + const [request] = await Promise.all([ + server.waitForRequest('/empty.html'), + context._request.post(server.EMPTY_PAGE, { + data: Buffer.from(bytes) + }) + ]); + expect(request.headers['content-length']).toBe('256'); + expect(request.headers['content-type']).toBe('application/octet-stream'); +}); + it('should add default headers to redirects', async ({context, server, page}) => { server.setRedirect('/redirect', '/empty.html'); const [request] = await Promise.all([ @@ -726,6 +740,7 @@ it('should support application/x-www-form-urlencoded', async function({context, expect(req.headers['content-type']).toBe('application/x-www-form-urlencoded'); const body = (await req.postBody).toString('utf8'); const params = new URLSearchParams(body); + expect(req.headers['content-length']).toBe(String(params.toString().length)); expect(params.get('firstName')).toBe('John'); expect(params.get('lastName')).toBe('Doe'); expect(params.get('file')).toBe('f.js'); @@ -817,6 +832,7 @@ it('should support multipart/form-data with ReadSream values', async function({c expect(error).toBeFalsy(); expect(serverRequest.method).toBe('POST'); expect(serverRequest.headers['content-type']).toContain('multipart/form-data'); + expect(serverRequest.headers['content-length']).toContain('5498'); expect(fields['firstName']).toBe('John'); expect(fields['lastName']).toBe('Doe'); expect(files['readStream'].name).toBe('simplezip.json');