Browse Source

fix: properly handle optional requestHeaders with onBeforeSendHeaders (#29834)

Co-authored-by: David Sanders <[email protected]>
trop[bot] 3 years ago
parent
commit
4baa634d7b
2 changed files with 17 additions and 2 deletions
  1. 5 2
      shell/browser/api/electron_api_web_request.cc
  2. 12 0
      spec-main/api-web-request-spec.ts

+ 5 - 2
shell/browser/api/electron_api_web_request.cc

@@ -214,8 +214,11 @@ void ReadFromResponse(v8::Isolate* isolate,
 void ReadFromResponse(v8::Isolate* isolate,
                       gin::Dictionary* response,
                       net::HttpRequestHeaders* headers) {
-  headers->Clear();
-  response->Get("requestHeaders", headers);
+  v8::Local<v8::Value> value;
+  if (response->Get("requestHeaders", &value) && value->IsObject()) {
+    headers->Clear();
+    gin::Converter<net::HttpRequestHeaders>::FromV8(isolate, value, headers);
+  }
 }
 
 void ReadFromResponse(v8::Isolate* isolate,

+ 12 - 0
spec-main/api-web-request-spec.ts

@@ -214,6 +214,18 @@ describe('webRequest module', () => {
       await ajax(defaultURL);
     });
 
+    it('leaves headers unchanged when no requestHeaders in callback', async () => {
+      let originalRequestHeaders: Record<string, string>;
+      ses.webRequest.onBeforeSendHeaders((details, callback) => {
+        originalRequestHeaders = details.requestHeaders;
+        callback({});
+      });
+      ses.webRequest.onSendHeaders((details) => {
+        expect(details.requestHeaders).to.deep.equal(originalRequestHeaders);
+      });
+      await ajax(defaultURL);
+    });
+
     it('works with file:// protocol', async () => {
       const requestHeaders = {
         Test: 'header'