diff --git a/shell/browser/api/electron_api_web_request.cc b/shell/browser/api/electron_api_web_request.cc index 1d51f96379d15..b8b5e05a96a6c 100644 --- a/shell/browser/api/electron_api_web_request.cc +++ b/shell/browser/api/electron_api_web_request.cc @@ -133,8 +133,10 @@ v8::Local HttpResponseHeadersToV8( net::HttpContentDisposition header(value, std::string()); std::string decodedFilename = header.is_attachment() ? " attachment" : " inline"; - decodedFilename += "; filename=" + header.filename(); - value = decodedFilename; + // The filename must be encased in double quotes for serialization + // to happen correctly. + std::string filename = "\"" + header.filename() + "\""; + value = decodedFilename + "; filename=" + filename; } if (!values) values = response_headers.SetKey(key, base::ListValue()); diff --git a/spec-main/api-web-request-spec.ts b/spec-main/api-web-request-spec.ts index 472e9a011d4ad..ea088b64fa484 100644 --- a/spec-main/api-web-request-spec.ts +++ b/spec-main/api-web-request-spec.ts @@ -354,7 +354,7 @@ describe('webRequest module', () => { it('does not change content-disposition header by default', async () => { ses.webRequest.onHeadersReceived((details, callback) => { - expect(details.responseHeaders!['content-disposition']).to.deep.equal([' attachment; filename=aa中aa.txt']); + expect(details.responseHeaders!['content-disposition']).to.deep.equal([' attachment; filename="aa中aa.txt"']); callback({}); }); const { data, headers } = await ajax(defaultURL + 'contentDisposition');