Chrome extension to read HTTP response

后端 未结 3 1094
轮回少年
轮回少年 2020-11-29 22:10

I have this Chrome extension that modifies the header of requests before sending them. I now would like to be able, within the same extension, to check the header of the res

相关标签:
3条回答
  • 2020-11-29 22:16

    I achieved capturing all HTTP requests and responses made by a website, by injecting a script to DOM. I injected injected.js to DOM using following script:

    /**
     * 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);
    

    This would inject injected.js in website(s) that match "content_scripts" "matches" in manifest.json. Mention contentscript.js and inject.js in "js". Also, make sure you have mentioned the website in the "permissions" in manifest.json. See manifest.json at the end of answer.

    Now, the code in injected.js which does the actual capturing of requests and responses is inspired from How we captured AJAX requests from a website tab with a Chrome Extension. Also see the comment section in that article.

    The injected.js is as follows:

    (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);
    

    For reference, my manifest.json is:

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

    Hope this helps.

    0 讨论(0)
  • 2020-11-29 22:20

    See the live-headers example.

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

    0 讨论(0)
  • 2020-11-29 22:38

    FYI, there is now a way to build a Developer Tools extension which is easier than the above. For more info: https://developer.chrome.com/extensions/devtools_network

    0 讨论(0)
提交回复
热议问题