Расширение Chrome для чтения HTTP-ответа - PullRequest
5 голосов
/ 20 января 2012

У меня есть это расширение Chrome, которое изменяет заголовок запросов перед их отправкой.Теперь я хотел бы иметь возможность в одном и том же расширении проверить заголовок ответа.Я искал в API расширений Chrome, но не нашел ничего интересного.

Это код, который я использую для изменения заголовка запроса, может быть, вам полезно знать, как я это делаю.

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

Кто-нибудь знает, как это сделать, или может указать мне на интересный источник?Спасибо

Ответы [ 2 ]

12 голосов
/ 07 января 2018

Я добился захвата всех HTTP-запросов и ответов, сделанных веб-сайтом, внедрив скрипт в DOM.Я внедрил injected.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);

Это приведет к тому, что injected.js будет внедрен на веб-сайты, которые соответствуют "content_scripts", "совпадают" в manifest.json.Упомяните contentcript.js и inject.js в "js".Кроме того, убедитесь, что вы упомянули веб-сайт в «разрешениях» в manifest.json.См. Manifest.json в конце ответа.

Теперь код в injected.js, который выполняет фактический захват запросов и ответов, основан на Как мы захватывали запросы AJAX с вкладки веб-сайта с помощьюРасширение Chrome .Также см. Раздел комментариев в этой статье.

Файл injected.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"]
}

Надеюсь, это поможет.

2 голосов
/ 20 января 2012

См. Пример с живыми заголовками.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...