-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathnode.patch
More file actions
57 lines (54 loc) · 1.95 KB
/
node.patch
File metadata and controls
57 lines (54 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
diff --git a/lib/_http_server.js b/lib/_http_server.js
index a899f651be..d8e1b0df3f 100644
--- a/lib/_http_server.js
+++ b/lib/_http_server.js
@@ -24,6 +24,7 @@
const util = require('util');
const net = require('net');
const assert = require('internal/assert');
+const { Session } = require('inspector');
const {
parsers,
freeParser,
@@ -294,8 +295,43 @@ function Server(options, requestListener) {
net.Server.call(this, { allowHalfOpen: true });
+ const session = new Session();
+ session.connect();
+
+ // This is the internal objectId of the passed in requestListener.
+ let requestListenerObjectId;
+
+ // To retrieve it, we need to briefly pause the server during startup,
+ // take a stack trace, walk it to the "Server()" frame and evaluate the local
+ // variable. After that we resume.
+ session.on('Debugger.paused', (message) => {
+ for (let callFrame of message.params.callFrames) {
+ if (callFrame.functionName == "Server") {
+ session.post('Debugger.evaluateOnCallFrame', {expression: "requestListener", callFrameId: callFrame.callFrameId}, (err, result) => {
+ // console.log(result);
+ requestListenerObjectId = result.result.objectId;
+ session.on('Debugger.paused', () => {});
+ session.post('Debugger.resume');
+ });
+ break;
+ }
+ }
+ });
+
+ session.post('Debugger.enable', (err) => {
+ session.post('Debugger.pause');
+ });
+
if (requestListener) {
- this.on('request', requestListener);
+ this.on('request', (request, response) => {
+ if (request.headers['devtools'] === 'step-in' || request.headers['user-agent'] == 'Debugging') {
+ session.post('Debugger.setBreakpointOnFunctionCall', {objectId: requestListenerObjectId}, (err, result) => {
+ requestListener(request, response);
+ });
+ } else {
+ requestListener(request, response);
+ }
+ });
}
// Similar option to this. Too lazy to write my own docs.