2013-07-31 3 views
0

Iam, строя расширение, где я улавлю все почтовые запросы. Но в httpChannel.originalURI.spec нет никаких атрибутов из сообщения. Как я могу получить сообщение atrtibutes?Заголовок сообщения в расширении firefox

myObserver.prototype = { 

observe: function(subject, topic, data) { 

    if("http-on-modify-request"){ 

    var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel); 

    if(httpChannel.requestMethod=="POST") 
     alert(httpChannel.originalURI.spec); 

     } 
    } 

}, 
register: function() { 
var observerService = Components.classes["@mozilla.org/observer-service;1"] 
         .getService(Components.interfaces.nsIObserverService); 
observerService.addObserver(this, "http-on-modify-request", false); 

}, 
unregister: function() { 
var observerService = Components.classes["@mozilla.org/observer-service;1"] 
         .getService(Components.interfaces.nsIObserverService); 
observerService.removeObserver(this, "http-on-modify-request"); 
} 
} 

Любые идеи?

Спасибо в продвижении.

ответ

0

nsIHttpChannel предоставляет только доступ к HTTP-заголовкам. Данные POST отправляются как часть тела запроса, поэтому вам необходимо изменить свой интерфейс объекта на nsIUploadChannel и прочитать данные двоичной загрузки в строку.

var uploadChannel = httpChannel.QueryInterface(Ci.nsIUploadChannel); 
var uploadStream = uploadChannel.uploadStream; 
uploadStream.QueryInterface(Ci.nsISeekableStream). 
      seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); 
var binStream = Cc["@mozilla.org/binaryinputstream;1"]. 
       createInstance(Ci.nsIBinaryInputStream); 
binStream.setInputStream(uploadStream); 
var postBytes = binStream.readByteArray(binStream.available()); 
var postString = String.fromCharCode.apply(null, postBytes); 
+0

Вы хотите, чтобы убедиться, что uploadChannel.uploadStream в вопросе НЕ nsIMultiplexInputStream. Эти мультиплексированные потоки довольно затруднительны, когда дело доходит до поиска, что я усвоил, когда мой код сломал много других расширений, в основном, загрузчиков изображений. Кроме того, пожалуйста, перемотайте поток (найдите начало) после того, как вы это сделаете. – nmaier

0

Код от Luckyrat не работает должным образом для меня. Мне пришлось решать некоторые проблемы с задержкой. Замечающий nmaiers комментарий этот код работает правильно (насколько я могу сказать):

function getPostString(httpChannel) { 
    var postStr = ""; 
    try { 
     var uploadChannel = httpChannel.QueryInterface(Ci.nsIUploadChannel); 
     var uploadChannelStream = uploadChannel.uploadStream; 
     if (!(uploadChannelStream instanceof Ci.nsIMultiplexInputStream)) { 
      uploadChannelStream.QueryInterface(Ci.nsISeekableStream).seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); 
      var stream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream); 
      stream.setInputStream(uploadChannelStream); 
      var postBytes = stream.readByteArray(stream.available()); 

      uploadChannelStream.QueryInterface(Ci.nsISeekableStream).seek(0, 0); 

      postStr = String.fromCharCode.apply(null, postBytes); 
     } 
    } 
    catch (e) { 
     console.error("Error while reading post string from channel: ", e); 
    } 
    finally { 
     return postStr; 
    } 
}