我的目标是在firefox-plugin中识别TCP-Connections。
为此,我需要为每个连接设置一个唯一的ID。我的问题是,如果它可能并且有人知道如何从HTTP请求访问TCP连接的对象?然后我可以为它设置一个唯一的ID,并且每个请求/响应对都将唯一地设置为连接。
答案 0 :(得分:1)
虽然我不知道您问题的直接答案,但我建议您查看source code for Firebug,它似乎至少可以访问网络堆栈的HTTP请求级别,甚至可能更低
希望这有帮助,祝你好运!
答案 1 :(得分:0)
假设您正在谈论客户端javascript,有一些项目可以帮助您实现此功能。
希望它有所帮助。
答案 2 :(得分:0)
来自MDN:如何监控HTTP活动
这是他们的示例代码
// Define a reference to the interface
var nsIHttpActivityObserver = Components.interfaces.nsIHttpActivityObserver;
var httpObserver =
{
observeActivity: function(aHttpChannel, aActivityType, aActivitySubtype, aTimestamp, aExtraSizeData, aExtraStringData)
{
if (aActivityType == nsIHttpActivityObserver.ACTIVITY_TYPE_HTTP_TRANSACTION) {
switch(aActivitySubtype) {
case nsIHttpActivityObserver.ACTIVITY_SUBTYPE_RESPONSE_HEADER:
// received response header
break;
case nsIHttpActivityObserver.ACTIVITY_SUBTYPE_RESPONSE_COMPLETE:
// received complete HTTP response
break;
}
}
}
};
var activityDistributor =
Components.classes["@mozilla.org/network/http-activity-distributor;1"]
.getService(Components.interfaces.nsIHttpActivityDistributor);
activityDistributor.addObserver(httpObserver);
答案 3 :(得分:0)
我在自己的ff插件中做了类似的事情。我假设你想要一个与连接相关的nsiHttpChannel
的引用。但是,我不确定你可以只添加属性(并让它们持久化),因为它可能由本机代码支持,我不确定。但是你可以将nsiHttpChannel
存储在别处,并以这种方式保存id。
这是我用来监控插件中的http流量的一些简化代码,可以解决您的问题。
var Cc = Components.classes;
var Ci = Components.interfaces;
var MyHttpObserver = {
// must be exposed so that the ObserverService can register itself
observe: function(subject, topic, data) {
subject.QueryInterface(Ci.nsIHttpChannel);
if( topic === "http-on-modify-request" ){
// store 'subject' somewhere
} else if( topic === "http-on-examine-response" ){
// look up 'subject' it will be the same reference as before
}
},
register: function() {
var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
observerService.addObserver(this, "http-on-modify-request", false);
observerService.addObserver(this, "http-on-examine-response", false);
},
unregister: function() {
var observerService = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
observerService.removeObserver(this, "http-on-modify-request");
observerService.removeObserver(this, "http-on-examine-response");
},
QueryInterface: function (aIID) {
if (aIID.equals(Ci.nsIObserver) || aIID.equals(Ci.nsISupports) ){
return this;
}
throw Components.results.NS_NOINTERFACE;
}
};