Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Commit

Permalink
Handle binary websocket messages (#410)
Browse files Browse the repository at this point in the history
Fixes #604 and #1231
  • Loading branch information
davidmurdoch committed Apr 15, 2019
1 parent 7a260eb commit e876dfb
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 3 deletions.
15 changes: 12 additions & 3 deletions lib/webSocketServer.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
var WebSocketServer = require("websocket").server;
var websocket = require("websocket");
var WebSocketServer = websocket.server;

module.exports = function(httpServer, provider, logger) {
var connectionManager = new ConnectionManager(provider, logger);
Expand Down Expand Up @@ -43,10 +44,18 @@ ConnectionManager.prototype.manageConnection = function(connection) {
};

connection.on("message", function(message) {
let payload;
try {
var payload = JSON.parse(message.utf8Data);
if (message.type === "utf8") {
payload = JSON.parse(message.utf8Data);
} else if (message.type === "binary") {
payload = JSON.parse(message.binaryData.toString("utf8").trim());
} else {
throw new Error("Invalid message type");
}
} catch (e) {
connection.reject(400, "Bad Request");
connection.close(websocket.connection.CLOSE_REASON_UNPROCESSABLE_INPUT, e.message);
return;
}

self._logPayload(payload);
Expand Down
47 changes: 47 additions & 0 deletions test/requests.js
Original file line number Diff line number Diff line change
Expand Up @@ -1620,6 +1620,53 @@ describe("WebSockets Server:", function() {

tests(web3);

it("Can also handle binary websocket data", async() => {
// Python web3 only sends binary over websockets and we should
// be able to handle it.

// web3.eth.getAccounts transmits over utf8, so use that as our baseline.
const accounts = await web3.eth.getAccounts();

// Listen for messages:
const pendingMessage = new Promise((resolve, reject) => {
function message(result) {
cleanup();
resolve(JSON.parse(result.data));
}
function close(err) {
cleanup();
reject(err.reason);
}
function cleanup() {
web3.currentProvider.connection.removeEventListener("message", message);
web3.currentProvider.connection.removeEventListener("close", close);
}
web3.currentProvider.connection.addEventListener("message", message);
web3.currentProvider.connection.addEventListener("close", close);
});

// generate a binary jsonrpc message:
const jsonRpc = Buffer.from(
JSON.stringify({
jsonrpc: "2.0",
id: 9999,
method: "eth_accounts",
params: []
})
);

// send the binary data:
web3.currentProvider.connection.send(jsonRpc);
const result = await pendingMessage;

// And compare
assert.deepStrictEqual(
result.result,
accounts.map((a) => a.toLocaleLowerCase()),
"Accounts don't match between binary and utf8 websocket requests!"
);
}).timeout(500); // fail quick if our hacked-together websocket handler fails.

after("Shutdown server", async function() {
let provider = web3._provider;
web3.setProvider();
Expand Down

0 comments on commit e876dfb

Please sign in to comment.