如何根据Chrome扩展程序中的用户选项修改HTTP请求标头?

AFO

我正在开发我的第一个Google Chrome扩展程序。我想基于用户可以在我的扩展程序的选项页面上选择的选项向(所有)http(s)请求添加自定义标头。

我成功管理了以下内容:

  1. 手动将自定义标头添加到所有http请求
  2. 创建一个选项页面
  3. 在chrome.storage.sync中保存和还原选项

现在,我正在努力结合以上内容。这是我尝试过的:

chrome.webRequest.onBeforeSendHeaders.addListener(function(details){
    var demoOptions = new Array();
    var demoHeader = '';
    var bkg = chrome.extension.getBackgroundPage(); // for debugging
    chrome.storage.sync.get({
    demoOption: true,
    }, function(items) {
        if(items.demoOption){
            demoOptions.push('demo-header-1');
        }
        demoHeader = demoOptions.join();
        details.requestHeaders.push({
            name: 'X-Demo-Header',
            value: demoHeader //this is not showing up in the http headers
        });
        bkg.console.log('demoHeader:' + demoHeader); //this is putting the correct value to the debugging console
        bkg.console.log(details.requestHeaders); //this is putting the headers to the debugging console, incl. x-demo-header1 and x-demo-header2 (see below)
    });

    details.requestHeaders.push({
        name: 'X-Demo-Header2',
        value: 'Demo-Header-2' //this is correctly added to the headers and included in the request
    });
    
    return { requestHeaders: details.requestHeaders };
},
{urls: [ "*://*/*" ]},['requestHeaders','blocking']);

观察结果:

  1. X-Demo-Header2正确插入(在Chrome标头检查和degging控制台中可见)
  2. x-demo-header1不是发送到站点的头文件的一部分,但是在调试输出中可见
  3. x-demo-header2在控制台标题数组中的X-Demo-Header1之前的标题中(请参见屏幕截图)

假设:要获取我的选项的函数(项目)会异步执行,并在插入我的选项的标头之前返回requestHeaders。

我可以避免吗?是否有更好的选择基于选项添加标题?

截屏:

调试标头数组的输出

蒂莫·恩斯特

TL; DR

目前无法在Chrome中使用(2021年2月15日)

长答案

JavaScript在很大程度上依赖于异步代码执行的思想。在您的代码中,您将{ requestHeaders: details.requestHeaders }在注册的事件侦听器未chrome.storage.sync.get(key, listener)完成之前返回因此,demo-header-1添加为时已晚。

这就是为什么您需要使用Promise。文档中有一个示例如何执行此操作。在该页面上向下滚动至以下位置:“此代码与上一示例完全相同,不同之处在于侦听器是异步的,并返回一个由新标题解析的Promise”

在您的情况下,代码的修改后的版本将如下所示:

chrome.webRequest.onBeforeSendHeaders.addListener(
  function (details) {
    return new Promise((resolve, reject) => {
      chrome.storage.sync.get({ demoOption: true }, function (items) {
        if (items.demoOption) {
          details.requestHeaders.push({
            name: 'X-Demo-Header',
            value: 'demo-header-1',
          });
        }
        resolve({ requestHeaders: details.requestHeaders });
      });
    });
  },
  { urls: ['*://*/*'] },
  ['blocking', 'requestHeaders']
);

如您所见,我们现在返回一个Promise而不是对象文字。在此Promise中,我们等待的读取操作chrome.storage.sync.get完成。完成后,我们将解决Promise。

这应该在支持此功能的浏览器中起作用。

在Chrome中,此操作不起作用,因为:

自2018年以来,Chrome不支持从webRequest.onBeforeSendHeaders返回Promise

除非您找到一种以chrome.storage.sync.get同步方式加载数据的方法,否则恐怕会很不幸。

作为最后的选择,您可以尝试在Chromium问题上发表投诉

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Chrome扩展程序如何访问活动标签的HTTP标头?

来自分类Dev

Chrome扩展程序可基于公共IP修改请求标头

来自分类Dev

在Chrome扩展程序中为HTTP请求设置用户代理

来自分类Dev

在Chrome扩展程序中为HTTP请求设置用户代理

来自分类Dev

如何从Android应用程序修改HTTP请求标头?

来自分类Dev

如何修改HTTP标头

来自分类Dev

如何在Node.js中修改请求标头

来自分类Dev

Chrome扩展程序访问Webrequest标头

来自分类Dev

Chrome扩展程序:如何更改AJAX请求标头中的来源?

来自分类Dev

Chrome扩展程序:如何更改AJAX请求标头中的来源?

来自分类Dev

AngularJS如何在Http请求中包含标头

来自分类Dev

如何从Rocket中的请求检索HTTP标头?

来自分类Dev

如何在ruby的http请求中包含标头

来自分类Dev

如何从Rocket中的请求检索HTTP标头?

来自分类Dev

如何在compojure请求中获取特定的HTTP标头

来自分类Dev

如何获取Meteor的HTTP.call(或get)方法来修改HTTP请求标头?

来自分类Dev

如何限制用户在Chrome扩展程序的选项中输入浮点数

来自分类Dev

Android中的HTTP请求标头问题

来自分类Dev

在 Http 请求中设置标头

来自分类Dev

Angular 6 Http Interceptors,未修改请求标头

来自分类Dev

HTTP请求标头

来自分类Dev

我如何获取我在node.js http请求中实际发送的http请求标头

来自分类Dev

如何从Chrome扩展程序发送HTTP GET请求?

来自分类Dev

如何从Chrome扩展程序发送HTTP GET请求?

来自分类Dev

Chrome的HTTP标头

来自分类Dev

如何在Firefox插件中删除(而不是修改)请求标头?

来自分类Dev

Chrome扩展程序:重新加载后检测标头

来自分类Dev

如何从ReactJS中的初始页面请求获取HTTP请求标头

来自分类Dev

如何在boost-beast http请求中设置http标头?

Related 相关文章

  1. 1

    Chrome扩展程序如何访问活动标签的HTTP标头?

  2. 2

    Chrome扩展程序可基于公共IP修改请求标头

  3. 3

    在Chrome扩展程序中为HTTP请求设置用户代理

  4. 4

    在Chrome扩展程序中为HTTP请求设置用户代理

  5. 5

    如何从Android应用程序修改HTTP请求标头?

  6. 6

    如何修改HTTP标头

  7. 7

    如何在Node.js中修改请求标头

  8. 8

    Chrome扩展程序访问Webrequest标头

  9. 9

    Chrome扩展程序:如何更改AJAX请求标头中的来源?

  10. 10

    Chrome扩展程序:如何更改AJAX请求标头中的来源?

  11. 11

    AngularJS如何在Http请求中包含标头

  12. 12

    如何从Rocket中的请求检索HTTP标头?

  13. 13

    如何在ruby的http请求中包含标头

  14. 14

    如何从Rocket中的请求检索HTTP标头?

  15. 15

    如何在compojure请求中获取特定的HTTP标头

  16. 16

    如何获取Meteor的HTTP.call(或get)方法来修改HTTP请求标头?

  17. 17

    如何限制用户在Chrome扩展程序的选项中输入浮点数

  18. 18

    Android中的HTTP请求标头问题

  19. 19

    在 Http 请求中设置标头

  20. 20

    Angular 6 Http Interceptors,未修改请求标头

  21. 21

    HTTP请求标头

  22. 22

    我如何获取我在node.js http请求中实际发送的http请求标头

  23. 23

    如何从Chrome扩展程序发送HTTP GET请求?

  24. 24

    如何从Chrome扩展程序发送HTTP GET请求?

  25. 25

    Chrome的HTTP标头

  26. 26

    如何在Firefox插件中删除(而不是修改)请求标头?

  27. 27

    Chrome扩展程序:重新加载后检测标头

  28. 28

    如何从ReactJS中的初始页面请求获取HTTP请求标头

  29. 29

    如何在boost-beast http请求中设置http标头?

热门标签

归档