2013-02-07 3 views
0

POST 요청 데이터를 수정하는 Firefox Extension을 구현하려고합니다.Firefox 확장에서 POST 데이터를 수정할 수 없습니다.

코드가 표시된 곳은 실패, 다음 "여기에 실패!"

모든 통찰력 도움이 될 것입니다.

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); 

    var newData = "test 123"; 
    function LOG(msg) { 
     var consoleService = Components.classes["@mozilla.org/consoleservice;1"] 
            .getService(Components.interfaces.nsIConsoleService); 
     consoleService.logStringMessage(msg); 
    } 

    function CMP() { 
     this.registered = false; 
     this.register(); 
    } 

    CMP.prototype = { 

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

     observe: function(subject, topic, data) 
     { 
      LOG("Inside observe"); 
      if (topic == "http-on-modify-request") 
      { 
       LOG("TOPIC is http-on-modify-request"); 
       var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel); 

       if(httpChannel.requestMethod == "POST"){ 
        LOG("Inside POST") 
        var uploadChannel = httpChannel.QueryInterface(Components.interfaces.nsIUploadChannel); 
        //var uploadChannelStream = uploadChannel.uploadStream; 

여기에서 데이터를 수정하십시오. 다음은 테스트를 위해 내가 위의 코드에 따라 변경하여 고정 새로운 데이터

    var newStringInputStream = Components.classes['@mozilla.org/io/string-input-stream;1'].createInstance(Components.interfaces.nsIStringInputStream); 
        newStringInputStream.setData(newData,newData.length); 
        LOG("set data in newStringInputStream!!"); 

        uploadChannel.setUploadStream(newStringInputStream, "text/plain", -1);// Fails here!!! 
        httpChannel.requestMethod = "POST"; 
        LOG("upload DONE!!") 
       } 
      } 
     }, 

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

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

     classID: Components.ID('{F799F47E-ABA5-4AF1-B8F2-BD74E3E5BCC0}'), 
     QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIObserver]) 
    }; 

    if (XPCOMUtils.generateNSGetFactory) 
    { 
     var NSGetFactory = XPCOMUtils.generateNSGetFactory([CMP]); 
    } 

답변

1

으로 "테스트 123"을 통과하고있다. 주요 변경 사항은 httpChannel.uploadStream에서 수정 된 데이터를 설정하는 데있었습니다.

희망이 있으면 도움이됩니다.

var httpChannel = subject.QueryInterface(Components.interfaces.nsIHttpChannel); 
      if(httpChannel.requestMethod == "POST") 
      { 
       LOG("Inside POST") 
       var uploadChannel = httpChannel.QueryInterface(Components.interfaces.nsIUploadChannel); 
       var newStringInputStream = Components.classes['@mozilla.org/io/string-input-stream;1'].createInstance(Components.interfaces.nsIStringInputStream); 
       newStringInputStream.setData(newData,newData.length); 
       var uploadChannelStream = uploadChannel.uploadStream; 
       uploadChannelStream = uploadChannelStream.QueryInterface(Components.interfaces.nsISeekableStream).seek(Components.interfaces.nsISeekableStream.NS_SEEK_SET, 0); 
       httpChannel.uploadStream.QueryInterface(Components.interfaces.nsIMIMEInputStream); 
       httpChannel.uploadStream.setData(newStringInputStream); 
       LOG("Done POST") 
      } 
관련 문제