2013-11-19 2 views
8

Я разрабатываю аддон Firefox, который должен перехватить процесс HTTP-запроса и вернуть фальшивый ответ для определенных URL-адресов. Это код, я использую:Обратный ответ до http-on-study-response

function TracingListener() { 
    this.originalListener = null; 
} 

TracingListener.prototype = { 
    onDataAvailable: function(request, context, inputStream, offset, count) { 
     LOG("onDataAvailable"); 
     this.originalListener.onDataAvailable(request, context, inputStream, offset, count); 
    }, 

    onStartRequest: function(request, context) { 
     LOG("onStartRequest"); 
     this.originalListener.onStartRequest(request, context); 
    }, 


    onStopRequest: function(request, context, statusCode) { 
     LOG("onStopRequest"); 
     this.originalListener.onStopRequest(request, context, statusCode); 
     var stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); 
     stream.setData("Test", -1); 
     this.originalListener.onStopRequest(request, context, Components.results.NS_OK); 

    }, 

    QueryInterface: function (aIID) { 
     if (aIID.equals(Ci.nsIStreamListener) || 
     aIID.equals(Ci.nsISupports)) { 
      return this; 
     } 
     throw Components.results.NS_NOINTERFACE; 
    } 
}; 

var observer = { 
    observe: function(subject, topic, data) { 
     LOG(topic); 
     var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel); 
     var url = httpChannel.URI.spec; 
     LOG("Test:" + url); 
     if (!pattern.test(url)) return; 

     if (topic == 'http-on-modify-request') { 
      var newListener = new TracingListener(); 
      newListener.originalListener = httpChannel.setNewListener(newListener); 

      } else if (topic == "http-on-examine-response" || topic == "http-on-examine-cached-response" || topic == "http-on-examine-merged-response") { 
      var newListener = new TracingListener(); 
      newListener.originalListener = httpChannel.setNewListener(newListener); 
     } 
    } 
}; 


var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService); 
observerService.addObserver(observer, "http-on-modify-request", false); 
observerService.addObserver(observer, "http-on-opening-request", false); 

Он отлично работает, когда есть ответ URL: я могу изменить ответ на «Test».

Но для некоторых URL-адресов, которые не могут быть достигнуты или действительно медленны, onStopRequest никогда не вызывается.

Мне нужно вернуть запрос перед отправкой любого реального запроса, который является «http-on-open-request» или «http-on-modify-request». Но в этот момент Firefox отказывается принять любой ответ, потому что он думает (что верно), что ответ не должен быть доступен.

Как я могу это сделать?

ответ

10

http-on-modify-request, вы должны иметь возможность позвонить redirectTo или изменить nsIChannel.URI, чтобы отправить запрос на URI данных, например data:text/plain,Test.

+0

Прошу прощения за ответ, отличный ответ! – xfx

Смежные вопросы