Skip to content

Commit bbd4e0f

Browse files
committed
WIP
1 parent 4397231 commit bbd4e0f

File tree

3 files changed

+31
-18
lines changed

3 files changed

+31
-18
lines changed

src/index.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {getExpressMiddleware} from "./plugins/express-plugin";
2-
import {lowerCaseObjectKeys} from "./utils";
2+
import {formatRequestHeaders} from "./utils";
33
import {UP9HttpConnector} from "./http-connector";
44

55
const POLL_INTERVAL_MS = 5000;
@@ -48,8 +48,9 @@ class UP9Monitor {
4848
try {
4949
if (this.ownState?.shouldTap && this.ownState.model) {
5050
message = this.replaceOverridenUrlsInMessage(message);
51-
if (!this.isRequestUrlBlacklisted(message.request.request_url))
51+
if (!this.isRequestUrlBlacklisted(message.request.request_url)) {
5252
await this.httpConnector.sendTrafficMessage(this.ownState.model, message);
53+
}
5354
else if (this.isDebug)
5455
console.log(`ignoring blacklisted request to ${message.request.request_url}`);
5556
}
@@ -79,10 +80,14 @@ class UP9Monitor {
7980
}
8081

8182
requestLogger = (httpModule, protocol) => {
82-
let original = httpModule.request
83-
httpModule.request = (request, callback) => {
83+
httpModule.request = this.getHttpTappedFunc(httpModule.request, protocol);
84+
httpModule.get = this.getHttpTappedFunc(httpModule.get, protocol);
85+
}
86+
87+
private getHttpTappedFunc = (originalModule, protocol) => {
88+
return (request, callback) => {
8489
const startUnixTimestamp = + new Date();
85-
return original(request, (response) => {
90+
return originalModule(request, (response) => {
8691
try {
8792
let body = "";
8893
response.on('readable', () => {
@@ -98,7 +103,7 @@ class UP9Monitor {
98103
}
99104
if (callback)
100105
callback(response);
101-
})
106+
});
102107
}
103108
}
104109

@@ -116,32 +121,37 @@ class UP9Monitor {
116121

117122
private processOutgoingMessage = (request, response, responseBody, protocol, startUnixTimestamp, requestDuration) => {
118123
let url = "";
119-
if (request.protocol)
124+
if (typeof request == "string") {
125+
url = request;
126+
}
127+
else if (request.protocol)
120128
url = `${request.protocol}//${request.hostname}${request.path}`;
121129
else {
122130
url = request.href;
123131
}
124132
if (url.indexOf(this.env) == -1) {
133+
const urlParts = new URL(url);
125134
const requestHeaders = {...request.headers};
126-
requestHeaders[':method'] = request.method;
127-
requestHeaders[':path'] = request.path;
128-
requestHeaders[':authority'] = request.hostname;
135+
requestHeaders[':method'] = response.req.method;
136+
requestHeaders[':path'] = urlParts.pathname;
137+
requestHeaders[':authority'] = urlParts.hostname;
129138
requestHeaders[':scheme'] = protocol;
130139
requestHeaders['x-up9-destination'] = this.serviceName;
140+
requestHeaders['host'] = urlParts.hostname;
131141
const requestBody = request.body;
132142
const message = {
133143
request: {
134-
headers: lowerCaseObjectKeys(requestHeaders),
144+
headers: formatRequestHeaders(requestHeaders),
135145
body: {
136146
"truncated": false,
137147
"as_bytes": requestBody ? Buffer.from(requestBody).toString('base64') : ""
138148
},
139149
request_url: url,
140-
hostname: request.hostname,
150+
hostname: urlParts.hostname,
141151
started_at_unix: startUnixTimestamp / 1000
142152
},
143153
response: {
144-
headers: lowerCaseObjectKeys({...response.headers, ":status": response.statusCode.toString(), 'duration_ms': requestDuration.toString()}),
154+
headers: formatRequestHeaders({...response.headers, ":status": response.statusCode.toString(), 'duration_ms': requestDuration.toString()}),
145155
body: {
146156
"truncated": false,
147157
"as_bytes": responseBody ? Buffer.from(responseBody).toString('base64') : ""

src/plugins/express-plugin.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {lowerCaseObjectKeys} from "../utils";
1+
import {formatRequestHeaders} from "../utils";
22

33
function getResponseHeaders(responseHeaderString) {
44
let headers = {};
@@ -23,7 +23,7 @@ const extractUp9MessageFromExpress = (req, res, responseContents, serviceName, s
2323
resHeaders['duration_ms'] = requestDurationMs.toString();
2424
return {
2525
request: {
26-
headers: lowerCaseObjectKeys(reqHeaders),
26+
headers: formatRequestHeaders(reqHeaders),
2727
body: {
2828
"truncated": false,
2929
"as_bytes": req.body ? Buffer.from(JSON.stringify(req.body)).toString('base64') : ""
@@ -33,7 +33,7 @@ const extractUp9MessageFromExpress = (req, res, responseContents, serviceName, s
3333
started_at_unix: startUnixTimestamp / 1000
3434
},
3535
response: {
36-
headers: lowerCaseObjectKeys(resHeaders),
36+
headers: formatRequestHeaders(resHeaders),
3737
body: {
3838
"truncated": false,
3939
"as_bytes": responseContents

src/utils.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
export const lowerCaseObjectKeys = (obj) => {
1+
export const formatRequestHeaders = (obj) => {
22
const newObj = {};
3-
for (const key of Object.keys(obj)) {
3+
for (const key in obj) {
4+
// happens with cookies in http module responses sometimes
5+
if (Array.isArray(obj[key]))
6+
obj[key] = obj[key].join(';');
47
newObj[key.toLowerCase()] = obj[key];
58
}
69
return newObj;

0 commit comments

Comments
 (0)