Skip to content

Commit 2631ca6

Browse files
committed
test websocket message hooks
1 parent 04c46a8 commit 2631ca6

5 files changed

Lines changed: 110 additions & 23 deletions

File tree

lib/handlers/wsHandler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,4 @@ module.exports = function getWsHandler(userRule, recorder, wsClient, wsReq) {
233233
logUtil.debug(e.stack);
234234
console.error(e);
235235
}
236-
}
236+
}

test/server/server.js

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,11 @@ function KoaServer() {
8080

8181
self.requestRecordMap[key] = {
8282
headers: wsReq.headers,
83-
body: ''
83+
body: '',
84+
messages: [],
8485
}
86+
87+
return self.requestRecordMap[key];
8588
};
8689

8790
this.start();
@@ -280,18 +283,20 @@ KoaServer.prototype.createWsServer = function (httpServer) {
280283
path: '/test/socket'
281284
});
282285
wsServer.on('connection', (ws, wsReq) => {
283-
const self = this;
284-
self.logWsRequest(wsReq);
285-
const messageObj = {
286+
const logRecord = this.logWsRequest(wsReq);
287+
288+
ws.send(JSON.stringify({
286289
type: 'initial',
287290
content: 'default message'
288-
};
291+
}));
289292

290-
ws.send(JSON.stringify(messageObj));
291293
ws.on('message', message => {
292294
printLog('message from request socket: ' + message);
293-
self.handleRecievedMessage(ws, message);
295+
this.handleRecievedMessage(ws, message);
296+
logRecord.messages.push(message);
294297
});
298+
299+
ws.on('error', e => console.error('error happened in websocket server', e));
295300
})
296301
};
297302

@@ -322,7 +327,6 @@ KoaServer.prototype.start = function () {
322327
this.httpServer = app.listen(DEFAULT_PORT);
323328
this.createWsServer(this.httpServer);
324329

325-
326330
printLog('HTTP is now listening on port :' + DEFAULT_PORT);
327331

328332
certMgr.getCertificate('localhost', (error, keyContent, crtContent) => {
@@ -336,19 +340,7 @@ KoaServer.prototype.start = function () {
336340
}, app.callback());
337341

338342
// create wss server
339-
const wss = new WebSocketServer({
340-
server: self.httpsServer
341-
});
342-
343-
wss.on('connection', (ws, wsReq) => {
344-
self.logWsRequest(wsReq);
345-
ws.on('message', (message) => {
346-
printLog('received in wss: ' + message);
347-
self.handleRecievedMessage(ws, message);
348-
});
349-
});
350-
351-
wss.on('error', e => console.error('error happened in wss:%s', e));
343+
this.createWsServer(self.httpsServer);
352344

353345
self.httpsServer.listen(HTTPS_PORT);
354346

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module.exports = {
2+
*summary() {
3+
return 'The rule to replace websocket message';
4+
},
5+
6+
*beforeSendWsMessageToClient(requestDetail) {
7+
const message = requestDetail.data;
8+
try {
9+
const messageObject = JSON.parse(message);
10+
if (messageObject.type === 'onMessage') {
11+
messageObject.content = 'replaced by beforeSendWsMessageToClient';
12+
return {
13+
data: JSON.stringify(messageObject),
14+
}
15+
}
16+
} catch (err) { /* ignore error */ }
17+
18+
return null;
19+
},
20+
21+
*beforeSendWsMessageToServer() {
22+
return {
23+
data: 'replaced by beforeSendWsMessageToServer',
24+
};
25+
},
26+
};
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
const async = require('async');
2+
const ProxyServerUtil = require('../util/ProxyServerUtil.js');
3+
const TestServer = require('../server/server.js');
4+
const { printLog } = require('../util/CommonUtil.js');
5+
const { proxyWs, generateWsUrl } = require('../util/HttpUtil.js');
6+
const rule = require('./rule/rule_replace_ws_message');
7+
8+
describe('Rule to replace the websocket message', () => {
9+
let testServer = null;
10+
let proxyServer = null;
11+
12+
beforeAll((done) => {
13+
jasmine.DEFAULT_TIMEOUT_INTERVAL = 50000;
14+
printLog('Start server for rule_replace_ws_message_spec');
15+
16+
testServer = new TestServer();
17+
proxyServer = ProxyServerUtil.proxyServerWithRule(rule);
18+
19+
setTimeout(done, 2000);
20+
});
21+
22+
afterAll(() => {
23+
testServer && testServer.close();
24+
proxyServer && proxyServer.close();
25+
printLog('Close server for rule_replace_ws_message_spec');
26+
});
27+
28+
it('should replace websocket message from server', (done) => {
29+
async.mapSeries([
30+
{ scheme: 'ws', masked: false },
31+
{ scheme: 'ws', masked: true },
32+
{ scheme: 'wss', masked: false },
33+
{ scheme: 'wss', masked: true },
34+
], (unit, callback) => {
35+
const url = generateWsUrl(unit.scheme, '/test/socket');
36+
const wsClient = proxyWs(url);
37+
38+
wsClient.on('open', () => {
39+
wsClient.send('test', unit.masked);
40+
});
41+
42+
wsClient.on('message', (message) => {
43+
// test beforeSendWsMessageToServer
44+
const requestRecord = testServer.getProxyRequestRecord(url);
45+
expect(requestRecord.messages[0]).toBe('replaced by beforeSendWsMessageToServer');
46+
47+
try {
48+
const result = JSON.parse(message);
49+
if (result.type === 'onMessage') {
50+
// test beforeSendWsMessageToClient
51+
expect(result.content).toBe('replaced by beforeSendWsMessageToClient');
52+
callback();
53+
}
54+
} catch (err) { /* ignore error */ }
55+
});
56+
57+
wsClient.on('error', (err) => {
58+
printLog('Error happened in proxy websocket');
59+
callback(err);
60+
});
61+
}, (err) => {
62+
if (err) {
63+
done.fail(err);
64+
} else {
65+
done();
66+
}
67+
});
68+
});
69+
});

test/util/CommonUtil.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const color = require('colorful');
66

77
function _isDeepEqual(source, target) {
88
// if the objects are Array
9-
if (source.constructor === Array && target.constructor === Array) {
9+
if (Array.isArray(source) && Array.isArray(target)) {
1010
if (source.length !== target.length) {
1111
return false;
1212
}

0 commit comments

Comments
 (0)