Javascript 如何使用Chrome';s用于更改http响应头的declarativeWebRequest

Javascript 如何使用Chrome';s用于更改http响应头的declarativeWebRequest,javascript,google-chrome-extension,httpresponse,Javascript,Google Chrome Extension,Httpresponse,我正在尝试编写一个简单的Chrome扩展,它使用替换http响应中的内容类型头(目前处于测试阶段;我使用的是25.0.1364.0) 代码基于示例,其中我更改了registerRules方法: var RequestMatcher = chrome.declarativeWebRequest.RequestMatcher; var RemoveResponseHeader = chrome.declarativeWebRequest.RemoveResponseHeader; var AddRe

我正在尝试编写一个简单的Chrome扩展,它使用替换http响应中的
内容类型
头(目前处于测试阶段;我使用的是25.0.1364.0)

代码基于示例,其中我更改了
registerRules
方法:

var RequestMatcher = chrome.declarativeWebRequest.RequestMatcher;
var RemoveResponseHeader = chrome.declarativeWebRequest.RemoveResponseHeader;
var AddResponseHeader = chrome.declarativeWebRequest.AddResponseHeader;

function registerRules() {
  var changeRule = {
    priority: 100,
    conditions: [
      // If any of these conditions is fulfilled, the actions are executed.
      new RequestMatcher({
        contentType: ['audio/mpeg']
      }),
    ],
    actions: [
      new RemoveResponseHeader({name: 'Content-Type'}),
      new AddResponseHeader({name: 'Content-Type', value: 'application/octet-stream'}),
      new AddResponseHeader({name: 'X-ChromeExt-Content-Type', value: 'trap'})
    ]
  };

  var callback = function() {
    if (chrome.extension.lastError) {
      console.error('Error adding rules: ' + chrome.extension.lastError);
    } else {
      console.info('Rules successfully installed');
      chrome.declarativeWebRequest.onRequest.getRules(null,
          function(rules) {
            console.info('Now the following rules are registered: ' +
                         JSON.stringify(rules, null, 2));
          });
    }
  };

  chrome.declarativeWebRequest.onRequest.addRules(
      [changeRule], callback);
}
从某种意义上说,它工作正常,规则已注册,我从浏览器控制台获得了以下反馈:

Now the following rules are registered: [
  {
    "actions": [
      {
        "instanceType": "declarativeWebRequest.RemoveResponseHeader",
        "name": "Content-Type"
      },
      {
        "instanceType": "declarativeWebRequest.AddResponseHeader",
        "name": "Content-Type",
        "value": "application/octet-stream"
      },
      {
        "instanceType": "declarativeWebRequest.AddResponseHeader",
        "name": "X-ChromeExt-Content-Type",
        "value": "trap"
      }
    ],
    "conditions": [
      {
        "contentType": [
          "audio/mpeg"
        ],
        "instanceType": "declarativeWebRequest.RequestMatcher"
      }
    ],
    "id": "_0_",
    "priority": 100
  }
]
问题是代码实际上没有产生任何效果,即http响应头保持不变。我不确定这是否与未显示更改的标题有关(仍然未固定)。但无论如何,我有以下问题:

1) 上述
RequestMatcher
是否正确地应用于
contentType
,或者我是否应该为
responseHeaders
使用匹配器(以某种方式指出
Content Type

2) 如果应将
RequestMatcher
应用于
responseHeaders
,该规则的语法是什么

new RequestMatcher({
  responseHeaders: // what to place here to match a value in a specific header line?
  // or possibly responseHeaders['Content-Type']: ...?
})
3) 如何调试规则执行?我的意思是我想跟踪和分析条件是如何处理的,以及操作是如何执行的。如果没有这一点,使用声明性WebRequest将是一个难题

提前感谢。

1)我尝试了以下代码(与您的代码几乎相同,只是它将内容类型从text/html修改为text/plain)

成功了!不过,这种修改并没有反映在DevTools中

2) 根据,你应该使用

new RequestMatcher({
  responseHeaders: [{nameEquals: "Content-Type", valueContains: "audio/mpeg"}]
})
但它不起作用(我犯了错误吗??)。 使用valueContains而不是valueEquals,因为内容类型可能包含编码

3) 除非调试Chrome本身,否则这似乎是不可能做到的

我在Chromium 25.0.1363.0(Build 173419)上进行了测试。我尝试了以下代码(与您的代码几乎相同,只是它将内容类型从text/html修改为text/plain)

成功了!不过,这种修改并没有反映在DevTools中

2) 根据,你应该使用

new RequestMatcher({
  responseHeaders: [{nameEquals: "Content-Type", valueContains: "audio/mpeg"}]
})
但它不起作用(我犯了错误吗??)。 使用valueContains而不是valueEquals,因为内容类型可能包含编码

3) 除非调试Chrome本身,否则这似乎是不可能做到的

我在铬25.0.1363.0(构建173419)上进行了测试