如何在nsIChannel中读取cookie?

时间:2014-11-11 09:49:21

标签: firefox firefox-addon firefox-addon-sdk

const {Cc,Ci,Cr} = require("chrome");
function TracingListener() {
//this.receivedData = [];
}
function CCIN(cName, ifaceName) {
return Cc[cName].createInstance(Ci[ifaceName]);
}
function CCSV(cName, ifaceName){
    if (Cc[cName])
        // if fbs fails to load, the error can be _CC[cName] has no properties
        return Cc[cName].getService(Ci[ifaceName]);
};
TracingListener.prototype =
{
originalListener: null,
receivedData: null,   // array for incoming data.

onDataAvailable: function(request, context, inputStream, offset, count)
{
    this.originalListener.onDataAvailable(request, context,inputStream, offset, count);
},

onStartRequest: function(request, context) {
    this.receivedData = [];
    this.originalListener.onStartRequest(request, context);

//thechannel.setRequestHeader("X-Hello", "World", false);
//this part of code will stop the request
    /*request.QueryInterface(Ci.nsIHttpChannel);
var cookie=request.getRequestHeader("Cookie");
console.log("cookie="+cookie);*/
var postText = this.readPostTextFromRequest(request, context);
console.log("postText="+postText111);
},

onStopRequest: function(request, context, statusCode)
{
//this part of code will successfullly print the cookie
    /*request.QueryInterface(Ci.nsIHttpChannel);
var cookie=request.getRequestHeader("Cookie");
console.log("cookie="+cookie);*/
    this.originalListener.onStopRequest(request, context, statusCode);
},

QueryInterface: function (aIID) {
    if (aIID.equals(Ci.nsIStreamListener) ||
        aIID.equals(Ci.nsISupports)) {
        return this;
    }
    throw Cr.NS_NOINTERFACE;
},
readPostTextFromRequest : function(request, context) {
    try
    {
        var is = request.QueryInterface(Ci.nsIUploadChannel).uploadStream;
        if (is)
        {
            var ss = is.QueryInterface(Ci.nsISeekableStream);
            var prevOffset;
            if (ss)
            {
                prevOffset = ss.tell();
                ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);
            }

            // Read data from the stream..
            var charset = "UTF-8";
            var text = this.readFromStream(is, charset, true);

            // Seek locks the file so, seek to the beginning only if necko hasn't read it yet,
            // since necko doesn't seek to 0 before reading (at lest not till 459384 is fixed).
            if (ss && prevOffset == 0) 
                ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);

            return text;
        }
        else {
            //dump("Failed to Query Interface for upload stream.\n");
        }
    }
    catch(exc)
    {
        //dumpError(exc);
    }

    return null;
},
readFromStream : function(stream, charset, noClose) {

    var sis = CCSV("@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream");
    sis.setInputStream(stream);

    var segments = [];
    for (var count = stream.available(); count; count = stream.available())
        segments.push(sis.readBytes(count));

    if (!noClose)
        sis.close();

    var text = segments.join("");
    return text;
}

}


hRO = {

observe: function(request, aTopic, aData){
    try {

        if (aTopic == "http-on-examine-response") {
            request.QueryInterface(Ci.nsIHttpChannel);

            //if (request.originalURI && piratequesting.baseURL == request.originalURI.prePath && request.originalURI.path.indexOf("/index.php?ajax=") == 0) {
                var newListener = new TracingListener();
                request.QueryInterface(Ci.nsITraceableChannel);
                newListener.originalListener = request.setNewListener(newListener);
            //}
        } 
    } catch (e) {
        /*dump("\nhRO error: \n\tMessage: " + e.message + "\n\tFile: " + e.fileName + "  line: " + e.lineNumber + "\n");*/
    }
},

QueryInterface: function(aIID){

    if (aIID.equals(Ci.nsIObserver) ||
    aIID.equals(Ci.nsISupports)) {
        return this;
    }

    throw Cr.NS_NOINTERFACE;

},
};


var observerService = Cc["@mozilla.org/observer-service;1"]
.getService(Ci.nsIObserverService);

observerService.addObserver(hRO,
"http-on-examine-response", false);

我的问题是:相同的代码行:

request.QueryInterface(Ci.nsIHttpChannel);
var cookie=request.getRequestHeader("Cookie");
console.log("cookie="+cookie);

在onStartRequest和onStopRequest中执行不同的结果,为什么? 我可以在onStopRequest中读取cookie但在onStartRequest中失败。我不认为onStartRequest中的请求没有准备好,因为我可以在onStartRequest中读取postText。

0 个答案:

没有答案