How can I modify the XMLHttpRequest responsetext received by another function?

前端 未结 7 1957
面向向阳花
面向向阳花 2020-12-01 04:11

I am trying to modify the responseText received by a function that I cannot modify. This function creates a XMLHttpRequest that I can attach to, but I have been unable to \"

7条回答
  •  不思量自难忘°
    2020-12-01 04:32

    I ran into the same problem when I was making a Chrome extension to allow cross origin API calls. This worked in Chrome. (Update: It doesn't work in the newest Chrome version).

    delete _this.responseText;
    _this.responseText = "Anything you want";
    

    The snippet runs inside a monkeypatched XMLHttpRequest.prototype.send who is redirecting the requests to the extensions background script and replace all the properties on response. Like this:

    // Delete removes the read only restriction
    delete _this.response;
    _this.response = event.data.response.xhr.response;
    delete _this.responseText;
    _this.responseText = event.data.response.xhr.responseText;
    delete _this.status;
    _this.status = event.data.response.xhr.status;
    delete _this.statusText;
    _this.statusText = event.data.response.xhr.statusText;
    delete _this.readyState;
    _this.readyState = event.data.response.xhr.readyState;
    

    That didn't work in Firefox, but I found a solution that worked:

    var test = new XMLHttpRequest();
    Object.defineProperty(test, 'responseText', {
      configurable: true,
      writable: true,
    });
    
    test.responseText = "Hey";
    

    That doesn't work in Chrome, but this work in both Chrome and Firefox:

    var test = new XMLHttpRequest();
    var aValue;
    Object.defineProperty(test, 'responseText', {
      get: function() { return aValue; },
      set: function(newValue) { aValue = newValue; },
      enumerable: true,
      configurable: true
    });
    
    test.responseText = "Hey";
    

    The last was copy past from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    None of the solutions works in Safari. I tried to make a new XMLHttpRequest with writable properties, but it was not allowed to call open or send from it. I also tried this solution: https://stackoverflow.com/a/28513219/3717718. Unfortunately it produced the same error in Safari:

    TypeError: Attempting to configurable attribute of unconfigurable property.

提交回复
热议问题