【问题标题】:Chrome extension to read HTTP response用于读取 HTTP 响应的 Chrome 扩展程序
【发布时间】:2012-01-20 09:51:29
【问题描述】:

我有这个 Chrome 扩展,可以在发送请求之前修改请求的标头。我现在希望能够在同一个扩展中检查响应的标头。我搜索了整个 Chrome 扩展 API,但找不到任何感兴趣的内容。

这是我用来修改请求头的代码,也许对你知道我是怎么做的有用。

chrome.webRequest.onBeforeSendHeaders.addListener(
      function(details) {/*do something*/},
      {urls: ["<all_urls>"]},
      ["blocking", "requestHeaders"]);

有谁知道如何做到这一点,或者可以指出一个有趣的来源?谢谢

【问题讨论】:

  • 我目前正在寻找可以修改响应标头的 Chrome 扩展程序(我不知道如何编写自己的)。具体来说,我想将 Content-Type image/x-png 动态更改为 image/png 因为 Chrome 不理解 x-png(早期的一个老错误,仍未修复)。你是否成功地创建了你的扩展程序,如果成功了,它可以满足我的需要吗?
  • 更新:Chrome 扩展“重定向器”可以满足我的需要。谢谢。

标签: google-chrome-extension


【解决方案1】:

通过将脚本注入 DOM,我实现了捕获网站发出的所有 HTTP 请求和响应。我使用以下脚本将 injection.js 注入 DOM:

/**
 * code in inject.js
 * added "web_accessible_resources": ["injected.js"] to manifest.json
 */
var s = document.createElement('script');
s.src = chrome.extension.getURL('injected.js');
s.onload = function() {
    this.remove();
};
(document.head || document.documentElement).appendChild(s);

这会在与 manifest.json 中的“content_scripts”“matches”匹配的网站中注入injected.js。在“js”中提及 contentscript.js 和 inject.js。 另外,请确保您在 manifest.json 的“权限”中提到了该网站。请参阅答案末尾的 manifest.json。

现在,injected.js 中实际捕获请求和响应的代码的灵感来自How we captured AJAX requests from a website tab with a Chrome Extension。另请参阅该文章中的评论部分。

注入的.js如下:

(function(xhr) {

    var XHR = XMLHttpRequest.prototype;

    var open = XHR.open;
    var send = XHR.send;
    var setRequestHeader = XHR.setRequestHeader;

    XHR.open = function(method, url) {
        this._method = method;
        this._url = url;
        this._requestHeaders = {};
        this._startTime = (new Date()).toISOString();

        return open.apply(this, arguments);
    };

    XHR.setRequestHeader = function(header, value) {
        this._requestHeaders[header] = value;
        return setRequestHeader.apply(this, arguments);
    };

    XHR.send = function(postData) {

        this.addEventListener('load', function() {
            var endTime = (new Date()).toISOString();

            var myUrl = this._url ? this._url.toLowerCase() : this._url;
            if(myUrl) {

                if (postData) {
                    if (typeof postData === 'string') {
                        try {
                            // here you get the REQUEST HEADERS, in JSON format, so you can also use JSON.parse
                            this._requestHeaders = postData;    
                        } catch(err) {
                            console.log('Request Header JSON decode failed, transfer_encoding field could be base64');
                            console.log(err);
                        }
                    } else if (typeof postData === 'object' || typeof postData === 'array' || typeof postData === 'number' || typeof postData === 'boolean') {
                            // do something if you need
                    }
                }

                // here you get the RESPONSE HEADERS
                var responseHeaders = this.getAllResponseHeaders();

                if ( this.responseType != 'blob' && this.responseText) {
                    // responseText is string or null
                    try {

                        // here you get RESPONSE TEXT (BODY), in JSON format, so you can use JSON.parse
                        var arr = this.responseText;

                        // printing url, request headers, response headers, response body, to console

                        console.log(this._url);
                        console.log(JSON.parse(this._requestHeaders));
                        console.log(responseHeaders);
                        console.log(JSON.parse(arr));                        

                    } catch(err) {
                        console.log("Error in responseType try catch");
                        console.log(err);
                    }
                }

            }
        });

        return send.apply(this, arguments);
    };

})(XMLHttpRequest);

作为参考,我的 manifest.json 是:

{
  "manifest_version": 2,

  "name": "Extension Name",
  "description": "Some Desc.",
  "version": "1.1",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "activeTab",
    "storage",
    "tabs",
    "*://website.com/*"
  ],
  "content_scripts": [
    {
      "matches": ["*://website.com/*"],
      "run_at": "document_start",
      "js": ["contentscript.js", "inject.js"]
    }
  ],
  "web_accessible_resources": ["injected.js"]
}

希望这会有所帮助。

【讨论】:

  • 它对我有用,我认为这是做这件事最合适的方式。
  • 嗨,inject.js 怎么样?
  • @user5155835 谢谢,那么现在 contentscript.js 是什么?你能帮我吗:stackoverflow.com/questions/52669328/… ?谢谢
  • 内容脚本用于与您的injected.js 进行通信。我还在您提出的问题中添加了这个作为答案。
  • @user5155835 contentscript.js 文件呢?
【解决方案2】:

查看实时标题示例。

http://code.google.com/chrome/extensions/examples/api/debugger/live-headers.zip

编辑:对于后代,您可以在他们存档的错误/补丁站点https://chromiumcodereview.appspot.com/9289057上找到 live-headers.zip 的版本@

最新版本 (2021) 不再包含 zip,但这里是目录 https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/debugger/live-headers/?pathrev=226223

【讨论】:

  • 如果我错了,请纠正我,我应该使用chrome.experimental.debugger.onEvent.addListener(aFunction);,然后在aFunction 中使用params.response,其中我拥有一切,对吧?
  • 或者,如果您使用 Web 请求 api 无法在修改标头时记录 requestId,然后在 onHeadersReceived 事件中检查该 requestId。
  • 我使用了同样的东西,但返回的参数响应没有正文。它有标题和其他信息,但内容本身不可访问。
  • 我正在尝试在这里完成同样的事情,只是看到 live-headers 示例我无法理解我应该做什么。
  • @OroshiX - 已修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多