Как использовать declarativeWebRequest Chrome для изменения заголовков http-ответов



Я пытаюсь написать простое расширение Chrome, которое заменяет Заголовок Content-Type в HTTP-ответе с помощьюdeclarativeWebRequest (в настоящее время находится в бета-версии; я использую 25.0.1364.0).



Код основан на примереCatifier , где я изменил метод 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 остаются неизменными. Я не уверен, относится ли это к (все еще незафиксированной) ошибке в Chrome, не отображающей измененные заголовки. Но в любом случае, у меня есть следующие вопросы:



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) Как можно отладить правило казнь? Я имею в виду, что я хотел бы проследить и проанализировать, как обрабатываются условия и выполняются действия. Без этого использование declarativeWebRequest было бы головоломкой, имхо.



Заранее благодарю.

600   1  

1 ответ:

1) я попробовал следующий код (который почти такой же, как Ваш, за исключением того, что он изменяет тип контента с text/html на text/plain)

chrome.declarativeWebRequest.onRequest.addRules([{
    priority: 100,
    conditions: [
      // If any of these conditions is fulfilled, the actions are executed.
      new chrome.declarativeWebRequest.RequestMatcher({
        contentType: ['text/html']
      }),
    ],
    actions: [
      new chrome.declarativeWebRequest.RemoveResponseHeader({name: 'Content-Type'}),
      new chrome.declarativeWebRequest.AddResponseHeader({name: 'Content-Type', value: 'text/plain'}),
      new chrome.declarativeWebRequest.AddResponseHeader({name: 'X-ChromeExt-Content-Type', value: 'trap'})
    ]
  }])

И это сработало! Однако модификация не отражена в DevTools.

2) Согласно https://developer.chrome.com/trunk/extensions/declarativeWebRequest.html#type-HeaderFilter , вы должны использовать

new RequestMatcher({
  responseHeaders: [{nameEquals: "Content-Type", valueContains: "audio/mpeg"}]
})

но это не сработало (я сделал ошибку??). Используйте valueContains вместо valueEquals так как контент-тип может содержать кодировку.

3) кажется, что это невозможно сделать, если вы не отладите сам Chrome.

Я тестировал на хроме 25.0.1363.0 (сборка 173419)

Comments

    Ничего не найдено.