mirror of
https://github.com/alibaba/anyproxy.git
synced 2025-04-23 15:41:26 +00:00
test websocket message hooks
This commit is contained in:
parent
04c46a8db6
commit
2631ca6538
@ -233,4 +233,4 @@ module.exports = function getWsHandler(userRule, recorder, wsClient, wsReq) {
|
|||||||
logUtil.debug(e.stack);
|
logUtil.debug(e.stack);
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,8 +80,11 @@ function KoaServer() {
|
|||||||
|
|
||||||
self.requestRecordMap[key] = {
|
self.requestRecordMap[key] = {
|
||||||
headers: wsReq.headers,
|
headers: wsReq.headers,
|
||||||
body: ''
|
body: '',
|
||||||
|
messages: [],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return self.requestRecordMap[key];
|
||||||
};
|
};
|
||||||
|
|
||||||
this.start();
|
this.start();
|
||||||
@ -280,18 +283,20 @@ KoaServer.prototype.createWsServer = function (httpServer) {
|
|||||||
path: '/test/socket'
|
path: '/test/socket'
|
||||||
});
|
});
|
||||||
wsServer.on('connection', (ws, wsReq) => {
|
wsServer.on('connection', (ws, wsReq) => {
|
||||||
const self = this;
|
const logRecord = this.logWsRequest(wsReq);
|
||||||
self.logWsRequest(wsReq);
|
|
||||||
const messageObj = {
|
ws.send(JSON.stringify({
|
||||||
type: 'initial',
|
type: 'initial',
|
||||||
content: 'default message'
|
content: 'default message'
|
||||||
};
|
}));
|
||||||
|
|
||||||
ws.send(JSON.stringify(messageObj));
|
|
||||||
ws.on('message', message => {
|
ws.on('message', message => {
|
||||||
printLog('message from request socket: ' + message);
|
printLog('message from request socket: ' + message);
|
||||||
self.handleRecievedMessage(ws, message);
|
this.handleRecievedMessage(ws, message);
|
||||||
|
logRecord.messages.push(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ws.on('error', e => console.error('error happened in websocket server', e));
|
||||||
})
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -322,7 +327,6 @@ KoaServer.prototype.start = function () {
|
|||||||
this.httpServer = app.listen(DEFAULT_PORT);
|
this.httpServer = app.listen(DEFAULT_PORT);
|
||||||
this.createWsServer(this.httpServer);
|
this.createWsServer(this.httpServer);
|
||||||
|
|
||||||
|
|
||||||
printLog('HTTP is now listening on port :' + DEFAULT_PORT);
|
printLog('HTTP is now listening on port :' + DEFAULT_PORT);
|
||||||
|
|
||||||
certMgr.getCertificate('localhost', (error, keyContent, crtContent) => {
|
certMgr.getCertificate('localhost', (error, keyContent, crtContent) => {
|
||||||
@ -336,19 +340,7 @@ KoaServer.prototype.start = function () {
|
|||||||
}, app.callback());
|
}, app.callback());
|
||||||
|
|
||||||
// create wss server
|
// create wss server
|
||||||
const wss = new WebSocketServer({
|
this.createWsServer(self.httpsServer);
|
||||||
server: self.httpsServer
|
|
||||||
});
|
|
||||||
|
|
||||||
wss.on('connection', (ws, wsReq) => {
|
|
||||||
self.logWsRequest(wsReq);
|
|
||||||
ws.on('message', (message) => {
|
|
||||||
printLog('received in wss: ' + message);
|
|
||||||
self.handleRecievedMessage(ws, message);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
wss.on('error', e => console.error('error happened in wss:%s', e));
|
|
||||||
|
|
||||||
self.httpsServer.listen(HTTPS_PORT);
|
self.httpsServer.listen(HTTPS_PORT);
|
||||||
|
|
||||||
|
26
test/spec_rule/rule/rule_replace_ws_message.js
Normal file
26
test/spec_rule/rule/rule_replace_ws_message.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
module.exports = {
|
||||||
|
*summary() {
|
||||||
|
return 'The rule to replace websocket message';
|
||||||
|
},
|
||||||
|
|
||||||
|
*beforeSendWsMessageToClient(requestDetail) {
|
||||||
|
const message = requestDetail.data;
|
||||||
|
try {
|
||||||
|
const messageObject = JSON.parse(message);
|
||||||
|
if (messageObject.type === 'onMessage') {
|
||||||
|
messageObject.content = 'replaced by beforeSendWsMessageToClient';
|
||||||
|
return {
|
||||||
|
data: JSON.stringify(messageObject),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) { /* ignore error */ }
|
||||||
|
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
*beforeSendWsMessageToServer() {
|
||||||
|
return {
|
||||||
|
data: 'replaced by beforeSendWsMessageToServer',
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
69
test/spec_rule/rule_replace_ws_message_spec.js
Normal file
69
test/spec_rule/rule_replace_ws_message_spec.js
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
const async = require('async');
|
||||||
|
const ProxyServerUtil = require('../util/ProxyServerUtil.js');
|
||||||
|
const TestServer = require('../server/server.js');
|
||||||
|
const { printLog } = require('../util/CommonUtil.js');
|
||||||
|
const { proxyWs, generateWsUrl } = require('../util/HttpUtil.js');
|
||||||
|
const rule = require('./rule/rule_replace_ws_message');
|
||||||
|
|
||||||
|
describe('Rule to replace the websocket message', () => {
|
||||||
|
let testServer = null;
|
||||||
|
let proxyServer = null;
|
||||||
|
|
||||||
|
beforeAll((done) => {
|
||||||
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 50000;
|
||||||
|
printLog('Start server for rule_replace_ws_message_spec');
|
||||||
|
|
||||||
|
testServer = new TestServer();
|
||||||
|
proxyServer = ProxyServerUtil.proxyServerWithRule(rule);
|
||||||
|
|
||||||
|
setTimeout(done, 2000);
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(() => {
|
||||||
|
testServer && testServer.close();
|
||||||
|
proxyServer && proxyServer.close();
|
||||||
|
printLog('Close server for rule_replace_ws_message_spec');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should replace websocket message from server', (done) => {
|
||||||
|
async.mapSeries([
|
||||||
|
{ scheme: 'ws', masked: false },
|
||||||
|
{ scheme: 'ws', masked: true },
|
||||||
|
{ scheme: 'wss', masked: false },
|
||||||
|
{ scheme: 'wss', masked: true },
|
||||||
|
], (unit, callback) => {
|
||||||
|
const url = generateWsUrl(unit.scheme, '/test/socket');
|
||||||
|
const wsClient = proxyWs(url);
|
||||||
|
|
||||||
|
wsClient.on('open', () => {
|
||||||
|
wsClient.send('test', unit.masked);
|
||||||
|
});
|
||||||
|
|
||||||
|
wsClient.on('message', (message) => {
|
||||||
|
// test beforeSendWsMessageToServer
|
||||||
|
const requestRecord = testServer.getProxyRequestRecord(url);
|
||||||
|
expect(requestRecord.messages[0]).toBe('replaced by beforeSendWsMessageToServer');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = JSON.parse(message);
|
||||||
|
if (result.type === 'onMessage') {
|
||||||
|
// test beforeSendWsMessageToClient
|
||||||
|
expect(result.content).toBe('replaced by beforeSendWsMessageToClient');
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
} catch (err) { /* ignore error */ }
|
||||||
|
});
|
||||||
|
|
||||||
|
wsClient.on('error', (err) => {
|
||||||
|
printLog('Error happened in proxy websocket');
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}, (err) => {
|
||||||
|
if (err) {
|
||||||
|
done.fail(err);
|
||||||
|
} else {
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -6,7 +6,7 @@ const color = require('colorful');
|
|||||||
|
|
||||||
function _isDeepEqual(source, target) {
|
function _isDeepEqual(source, target) {
|
||||||
// if the objects are Array
|
// if the objects are Array
|
||||||
if (source.constructor === Array && target.constructor === Array) {
|
if (Array.isArray(source) && Array.isArray(target)) {
|
||||||
if (source.length !== target.length) {
|
if (source.length !== target.length) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user