2

declarativeWebRequest (現在ベータ版; 25.0.1364.0 を使用しています) をContent-Type使用して http 応答のヘッダーを置き換える単純な Chrome 拡張機能を作成しようとしています。

コードは、メソッドを変更した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ないと、パズルになります。

前もって感謝します。

4

1 に答える 1

4

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"}]
})

しかし、それはうまくいきませんでした (私は間違いを犯しましたか??)。 Content-Type にはエンコーディングが含まれる場合があるため、valueEquals の代わりに valueContains を使用します。

3)Chrome自体をデバッグしない限り、それを行うことは不可能のようです。

Chromium 25.0.1363.0 (ビルド 173419) でテストしました

于 2012-12-19T04:45:12.247 に答える