Search code examples
javascriptajaxcookiesxmlhttprequest

Is it possible to retry an XMLHttpRequest that I Intercepted?


I am overriding the XMLHttpRequest.prototype.send = function(a,b) { } and XMLHttpRequest.prototype.open = function(a,b) { } so I can intercept every single response I get from every ajax call. Sometimes, some of those requests fail, and when that happens I need to update the cookies for the DOM and retry the failed original XHRs.

Taking in consideration that I have no control over those XHRs, meaning that I don't create them, or execute them, would it be possible for me to retry those XHR with new updated cookies?

Right now, I save the original XHR in a new variable, and when it fails, I do an xhr.open.apply() and then xhr.send.apply(). Using an HTTP Web Proxy like Charles I am able to check my response and I always get error message: Invalid request... I also realized that the difference between the original XHR and the retried XHR is that the X-Request-With header is always missing.

Any ideas on how to solve this issue?


Solution

  • Well, it is possible and I managed to do it.

    I created a function to retry the original request, where I pass the same parameters that were passed to the XMLHTTPRequest.prototype.send function that intercepted the XMLHTTPRequest before being send.

    function retryOriginalRequest(a,b, args) {
       var originalRequest = new XMLHttpRequest();
       originalRequest.open(a,b, true);
       // The request headers need to be set up after the open call and before the send.
       originalRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
       originalRequest.send(args, null); 
    };