Skip to content

Commit 8b17731

Browse files
committed
parsing of header messages from firephp.org working
1 parent f47b4c3 commit 8b17731

10 files changed

Lines changed: 338 additions & 38 deletions

File tree

client/lib/main.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ function main(options, callbacks) {
5757
uri = "http://localhost:8080/bundles/main.js";
5858
}
5959
SANDBOX(uri, {
60+
debug: API.inDevMode(),
6061
global: {
6162
// Not available in this context.
6263
Components: undefined
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
2+
exports.for = function (API) {
3+
4+
const OBSERVER_SERVICE = API.CC["@mozilla.org/observer-service;1"].getService(API.CI.nsIObserverService);
5+
6+
var processors = [];
7+
var requestIndex = 0;
8+
9+
const LISTENER = {
10+
observe: function(subject, topic, data) {
11+
if (topic == "http-on-modify-request") {
12+
13+
var httpChannel = subject.QueryInterface(API.CI.nsIHttpChannel);
14+
15+
try {
16+
17+
var requestHeaders = [];
18+
var requestId;
19+
httpChannel.visitRequestHeaders({
20+
visitHeader: function(name, value) {
21+
requestHeaders.push({name: name, value: value});
22+
if (name.toLowerCase() === "x-request-id") {
23+
requestId = value;
24+
}
25+
}
26+
});
27+
28+
processors.forEach(function (processor) {
29+
processor({
30+
"id": requestId || "id:" + httpChannel.URI.spec + ":" + requestIndex,
31+
"url": httpChannel.URI.spec,
32+
"hostname": httpChannel.URI.host,
33+
"port": httpChannel.URI.port,
34+
"method": httpChannel.requestMethod,
35+
"headers": requestHeaders,
36+
"httpChannel": httpChannel,
37+
setRequestHeader: function (name, value) {
38+
httpChannel.setRequestHeader(name, value, false);
39+
}
40+
});
41+
});
42+
43+
} catch (err) {
44+
API.console.error(err);
45+
}
46+
}
47+
}
48+
};
49+
50+
51+
OBSERVER_SERVICE.addObserver(LISTENER, "http-on-modify-request", false);
52+
53+
API.on("destroy", function () {
54+
OBSERVER_SERVICE.removeObserver(LISTENER, "http-on-modify-request");
55+
});
56+
57+
return {
58+
register: function (processor) {
59+
processors.push(processor);
60+
}
61+
};
62+
}

components/adapters/http-response-observer.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,13 @@ exports.for = function (API) {
4343
"method": httpChannel.requestMethod,
4444
"headers": requestHeaders
4545
},
46+
"httpChannel": httpChannel,
4647
"status": httpChannel.responseStatus,
4748
"contentType": contentType,
4849
"headers": responseHeaders
4950
};
5051

51-
API.console.log("response", response);
52+
//API.console.log("response", response);
5253

5354
API.emit("response", response);
5455

@@ -66,5 +67,7 @@ exports.for = function (API) {
6667
OBSERVER_SERVICE.removeObserver(LISTENER, "http-on-examine-response");
6768
});
6869

69-
return {};
70+
return {
71+
on: API.on.bind(API)
72+
};
7073
}

components/main.js

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,25 @@ const EVENTS = require("eventemitter2");
44

55
exports.main = function (API) {
66

7+
8+
var makeAPI = API.makeAPI = function (_API, extra) {
9+
var API = new EVENTS();
10+
for (var name in extra) {
11+
API[name] = extra[name];
12+
}
13+
for (var name in _API) {
14+
API[name] = _API[name];
15+
if (
16+
name === "console" &&
17+
typeof (API[name].for) === "function"
18+
) {
19+
API[name] = API[name].for(API);
20+
}
21+
}
22+
return API;
23+
}
24+
25+
726
const FBTRACE_API = makeAPI(API, {
827
name: "fbtrace"
928
});
@@ -43,19 +62,6 @@ exports.main = function (API) {
4362

4463

4564

46-
const HTTP_RESPONSE_OBSERVER_API = makeAPI(API, {
47-
name: "adapters/http-response-observer"
48-
});
49-
const HTTP_RESPONSE_OBSERVER_EXPORTS = require("./adapters/http-response-observer").for(HTTP_RESPONSE_OBSERVER_API);
50-
51-
HTTP_RESPONSE_OBSERVER_API.on("response", function (response) {
52-
53-
API.console.log("response in MAIN", response);
54-
55-
});
56-
57-
58-
5965
const UI_DEVTOOLS_PANEL_API = makeAPI(API, {
6066
name: "ui/devtools-panel"
6167
});
@@ -70,6 +76,23 @@ exports.main = function (API) {
7076

7177

7278

79+
const RECEIVERS_API = makeAPI(API, {
80+
name: "receivers/_boot"
81+
});
82+
RECEIVERS_API.REQUEST_OBSERVER = require("./adapters/http-request-observer").for(makeAPI(API, {
83+
name: "adapters/http-request-observer"
84+
}));
85+
RECEIVERS_API.RESPONSE_OBSERVER = require("./adapters/http-response-observer").for(makeAPI(API, {
86+
name: "adapters/http-response-observer"
87+
}));
88+
const RECEIVERS_EXPORTS = require("./receivers/_boot").for(RECEIVERS_API);
89+
90+
91+
//API.TABS.open("http://localhost:49084/");
92+
API.TABS.open("http://firephp.org/");
93+
94+
95+
7396
} catch (err) {
7497
console.error(err.stack);
7598
throw err;
@@ -78,20 +101,3 @@ exports.main = function (API) {
78101
console.log("... init components done!");
79102
}
80103

81-
82-
function makeAPI (_API, extra) {
83-
var API = new EVENTS();
84-
for (var name in extra) {
85-
API[name] = extra[name];
86-
}
87-
for (var name in _API) {
88-
API[name] = _API[name];
89-
if (
90-
name === "console" &&
91-
typeof (API[name].for) === "function"
92-
) {
93-
API[name] = API[name].for(API);
94-
}
95-
}
96-
return API;
97-
}

components/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
}
2222
},
2323
"mappings": {
24-
"firebug.sdk": "top/firebug.sdk"
24+
"firebug.sdk": "top/firebug.sdk",
25+
"wildfire-for-js": "top/wildfire-for-js"
2526
},
2627
"dependencies": {
2728
"eventemitter2": "~0.4.14"

components/receivers/_boot.js

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
2+
const WILDFIRE = require("wildfire-for-js");
3+
4+
5+
exports.for = function (API) {
6+
7+
API.WILDFIRE = WILDFIRE;
8+
9+
10+
function isEnabled () {
11+
return true;
12+
}
13+
14+
15+
var httpHeaderChannel = API.httpHeaderChannel = API.WILDFIRE.HttpHeaderChannel({
16+
"enableTransport": false
17+
});
18+
httpHeaderChannel.setNoReceiverCallback(function(id) {
19+
API.console.error("trying to log to unknown receiver: " + id);
20+
});
21+
22+
23+
// TODO: Use a PINF directive to get list of receivers.
24+
var receivers = [
25+
["receivers/firephp", require("./firephp"), null /* api */, null /* exports */]
26+
];
27+
receivers.forEach(function (receiver) {
28+
receiver[2] = API.makeAPI(API, {
29+
name: receiver[0]
30+
});
31+
receiver[3] = receiver[1].for(receiver[2]);
32+
});
33+
34+
35+
36+
var announceDispatcher = API.WILDFIRE.Dispatcher();
37+
announceDispatcher.setProtocol('http://registry.pinf.org/cadorn.org/wildfire/@meta/protocol/announce/0.1.0');
38+
announceDispatcher.setChannel(httpHeaderChannel);
39+
40+
function getAnnounceMessageForRequest (request) {
41+
42+
if (!getAnnounceMessageForRequest._forHostnames) {
43+
getAnnounceMessageForRequest._forHostnames = {};
44+
}
45+
var cache = getAnnounceMessageForRequest._forHostnames;
46+
47+
// TODO: Don't just use `request.hostname` for cache.
48+
// TODO: If config changes this announceMessage needs to be reset
49+
50+
if (cache[request.hostname]) {
51+
return cache[request.hostname];
52+
}
53+
54+
cache[request.hostname] = new API.WILDFIRE.Message();
55+
cache[request.hostname].setData(JSON.stringify({
56+
// TODO: Populate crypto-based key
57+
"authkey": null,
58+
"receivers": httpHeaderChannel.receivers.map(function (receiver) {
59+
return receiver.getId();
60+
})
61+
}));
62+
63+
return cache[request.hostname];
64+
}
65+
66+
API.REQUEST_OBSERVER.register(function (request) {
67+
if (!isEnabled()) return;
68+
69+
if (!request.httpChannel.getRequestHeader("User-Agent").match(/\sFirePHP\/([\.|\d]*)\s?/)) {
70+
request.httpChannel.setRequestHeader("User-Agent", request.httpChannel.getRequestHeader("User-Agent") + " FirePHP/0.5", false);
71+
}
72+
73+
// NOTE: Do NOT set this header. This only works with FirePHPCore 0.3.2 and most users are using
74+
// FirePHPCore 0.3.1. If someone does not want their user-agent modified they should use FirePHP 1.0 with DeveloperCompanion
75+
// and disable the 'extensions.devcomp.firePHPCoreCompatibility' option.
76+
// request.httpChannel.setRequestHeader("X-FirePHP-Version", "0.4", false);
77+
78+
var announceMessage = getAnnounceMessageForRequest(request);
79+
if (announceMessage) {
80+
// dispatch announce message
81+
announceDispatcher.dispatch(announceMessage);
82+
83+
// flush channel
84+
httpHeaderChannel.flush({
85+
setMessagePart: function(name, value) {
86+
request.httpChannel.setRequestHeader(name, value, false);
87+
},
88+
getMessagePart: function(name) {
89+
if (request.httpChannel.getRequestHeader) {
90+
return null;
91+
}
92+
// HACK: Do not use exception for flow control
93+
try {
94+
return request.httpChannel.getRequestHeader(name);
95+
} catch (err) {
96+
return null;
97+
}
98+
}
99+
});
100+
} else {
101+
// TODO: Use a proper unique ID + counter.
102+
request.httpChannel.setRequestHeader("x-request-id", ""+(new Date().getTime()) + "" + Math.floor(Math.random()*1000+1), false);
103+
}
104+
105+
// API.console.log("REQUEST", request);
106+
107+
});
108+
109+
API.RESPONSE_OBSERVER.on("response", function (response) {
110+
if (!isEnabled()) return;
111+
112+
// API.console.log("RESPONSE", response);
113+
114+
try {
115+
116+
httpHeaderChannel.parseReceived(response.headers, {
117+
"MozillaRequestObserverListener": {
118+
"httpChannel": response.httpChannel
119+
},
120+
"id": response.request.id,
121+
"url": response.request.url,
122+
"hostname": response.request.hostname,
123+
"port": response.request.port,
124+
"method": response.request.method,
125+
"status": response.status,
126+
"contentType": response.contentType,
127+
"requestHeaders": response.request.headers
128+
});
129+
130+
} catch (err) {
131+
API.console.error(err);
132+
}
133+
134+
});
135+
}
136+

components/receivers/firephp.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
2+
3+
exports.for = function (API) {
4+
5+
6+
var transportReceiver1 = API.WILDFIRE.Receiver();
7+
transportReceiver1.setId("http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1");
8+
transportReceiver1.addListener({
9+
onMessageReceived: function(request, message) {
10+
11+
try {
12+
13+
API.console.log("FirebugConsole onMessageReceived", message);
14+
15+
} catch (err) {
16+
API.console.error(err);
17+
}
18+
}
19+
});
20+
API.httpHeaderChannel.addReceiver(transportReceiver1);
21+
22+
23+
var transportReceiver2 = API.WILDFIRE.Receiver();
24+
transportReceiver2.setId("http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1");
25+
transportReceiver2.addListener({
26+
onMessageReceived: function(request, message) {
27+
28+
try {
29+
30+
API.console.log("FirePHP onMessageReceived", message);
31+
32+
} catch (err) {
33+
API.console.error(err);
34+
}
35+
}
36+
});
37+
API.httpHeaderChannel.addReceiver(transportReceiver2);
38+
39+
40+
/*
41+
// FirePHP 0.x compatibility
42+
var transportReceiver = API.WILDFIRE.Receiver();
43+
transportReceiver.setId("http://registry.pinf.org/cadorn.org/github/fireconsole/@meta/receiver/console/0.1.0");
44+
transportReceiver.addListener({
45+
onMessageReceived: function(request, message) {
46+
47+
try {
48+
49+
API.console.log("FireConsole onMessageReceived: " + message);
50+
51+
} catch (err) {
52+
API.console.error(err);
53+
}
54+
}
55+
});
56+
API.httpHeaderChannel.addReceiver(transportReceiver);
57+
*/
58+
59+
60+
return {};
61+
}
62+

0 commit comments

Comments
 (0)