Skip to content

Commit a2ba9aa

Browse files
committed
Merge branch 'master' into breaking-changes
2 parents c921fcd + ac406e8 commit a2ba9aa

File tree

5 files changed

+47
-8
lines changed

5 files changed

+47
-8
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,12 +313,13 @@ The callback function is called with the following three arguments:
313313
* `headers` {Object} - The HTTP headers sent in the upgrade request.
314314
* `request` {http.IncomingMessage} - The full HTTP request received by the underlying webserver.
315315

316+
* `signal` {AbortSignal} - An `AbortSignal` used to indicate whether the websocket upgrade has been aborted during the authentication process. The `signal.reason` is also available as the `error` property of the ['upgradeAborted'](#event-upgradeaborted) event.
316317

317318
Example:
318319

319320
```js
320321
const rpcServer = new RPCServer();
321-
rpcServer.auth((accept, reject, handshake) => {
322+
rpcServer.auth((accept, reject, handshake, signal) => {
322323
if (handshake.identity === 'TEST') {
323324
accept();
324325
} else {

lib/server.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,9 @@ class RPCServer extends EventEmitter {
8181
return async (request, socket, head) => {
8282

8383
let resolved = false;
84-
let emittedAbort = false;
84+
85+
const ac = new AbortController();
86+
const {signal} = ac;
8587

8688
const url = new URL(request.url, 'http://localhost');
8789
const pathParts = url.pathname.split('/');
@@ -96,8 +98,8 @@ class RPCServer extends EventEmitter {
9698
abortHandshake(socket, 500);
9799
}
98100

99-
if (!emittedAbort) {
100-
emittedAbort = true;
101+
if (!signal.aborted) {
102+
ac.abort(error);
101103
this.emit('upgradeAborted', {
102104
error,
103105
socket,
@@ -187,6 +189,10 @@ class RPCServer extends EventEmitter {
187189
abortUpgrade(new WebsocketUpgradeError(code, message));
188190
};
189191

192+
socket.once('end', () => {
193+
reject(400, `Client connection closed before upgrade complete`);
194+
});
195+
190196
socket.once('close', () => {
191197
reject(400, `Client connection closed before upgrade complete`);
192198
});
@@ -199,7 +205,8 @@ class RPCServer extends EventEmitter {
199205
await this.authCallback(
200206
accept,
201207
reject,
202-
handshake
208+
handshake,
209+
signal
203210
);
204211
} else {
205212
accept();

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ocpp-rpc",
3-
"version": "1.8.0",
3+
"version": "1.9.0",
44
"description": "A client & server implementation of the WAMP-like RPC-over-websocket system defined in the OCPP protcols (e.g. OCPP1.6-J and OCPP2.0.1).",
55
"main": "index.js",
66
"scripts": {

test/server.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -937,6 +937,37 @@ describe('RPCServer', function(){
937937

938938
});
939939

940+
it("should abort auth on upgrade error", async () => {
941+
942+
const {endpoint, close, server} = await createServer();
943+
const cli = new RPCClient({
944+
endpoint,
945+
identity: 'X',
946+
});
947+
948+
let completeAuth;
949+
let authCompleted = new Promise(r => {completeAuth = r;})
950+
951+
server.auth(async (accept, reject, handshake, signal) => {
952+
const abortProm = once(signal, 'abort');
953+
await cli.close({force: true, awaitPending: false});
954+
await abortProm;
955+
completeAuth();
956+
});
957+
958+
try {
959+
const connErr = await cli.connect().catch(e=>e);
960+
await authCompleted;
961+
assert.ok(connErr instanceof Error);
962+
963+
} finally {
964+
await cli.close();
965+
close();
966+
}
967+
968+
});
969+
970+
940971
});
941972

942973
});

0 commit comments

Comments
 (0)