diff --git a/AUTHORS.md b/AUTHORS.md index e6d57d90..138681d6 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -62,5 +62,6 @@ - Lookis (lookisliu@gmail.com) - Paul Sharypov (pavloniym@gmail.com) - Cas (6506529+ThaUnknown@users.noreply.github.com) +- Tom Snelling (tomsnelling8@gmail.com) #### Generated by tools/update-authors.sh. diff --git a/CHANGELOG.md b/CHANGELOG.md index 4150d276..dce176eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [10.0.3](https://github.com/webtorrent/bittorrent-tracker/compare/v10.0.2...v10.0.3) (2023-05-25) + + +### Performance Improvements + +* replace simple websocket with maintained one ([#464](https://github.com/webtorrent/bittorrent-tracker/issues/464)) ([3f01c29](https://github.com/webtorrent/bittorrent-tracker/commit/3f01c29122efd726d805673da82f43ce5592b793)) + ## [10.0.2](https://github.com/webtorrent/bittorrent-tracker/compare/v10.0.1...v10.0.2) (2023-02-01) diff --git a/lib/client/websocket-tracker.js b/lib/client/websocket-tracker.js index 3799510a..75892ec5 100644 --- a/lib/client/websocket-tracker.js +++ b/lib/client/websocket-tracker.js @@ -2,7 +2,7 @@ import clone from 'clone' import Debug from 'debug' import Peer from 'simple-peer' import randombytes from 'randombytes' -import Socket from 'simple-websocket' +import Socket from '@thaunknown/simple-websocket' import Socks from 'socks' import common from '../common.js' @@ -214,7 +214,7 @@ class WebSocketTracker extends Tracker { this.expectingResponse = false try { - data = JSON.parse(data) + data = JSON.parse(Buffer.from(data)) } catch (err) { this.client.emit('warning', new Error('Invalid tracker response')) return diff --git a/lib/server/parse-http.js b/lib/server/parse-http.js index 5847251f..1e6fe315 100644 --- a/lib/server/parse-http.js +++ b/lib/server/parse-http.js @@ -33,9 +33,17 @@ function parseHttpRequest (req, opts) { common.MAX_ANNOUNCE_PEERS ) - params.ip = opts.trustProxy - ? req.headers['x-forwarded-for'] || req.connection.remoteAddress - : req.connection.remoteAddress.replace(common.REMOVE_IPV4_MAPPED_IPV6_RE, '') // force ipv4 + if (opts.trustProxy) { + if (req.headers['x-forwarded-for']) { + const [realIp] = req.headers['x-forwarded-for'].split(',') + params.ip = realIp.trim() + } else { + params.ip = req.connection.remoteAddress + } + } else { + params.ip = req.connection.remoteAddress.replace(common.REMOVE_IPV4_MAPPED_IPV6_RE, '') // force ipv4 + } + params.addr = `${common.IPV6_RE.test(params.ip) ? `[${params.ip}]` : params.ip}:${params.port}` params.headers = req.headers diff --git a/lib/server/parse-websocket.js b/lib/server/parse-websocket.js index 5aeba9e1..16fea56f 100644 --- a/lib/server/parse-websocket.js +++ b/lib/server/parse-websocket.js @@ -55,9 +55,17 @@ function parseWebSocketRequest (socket, opts, params) { // On first parse, save important data from `socket.upgradeReq` and delete it // to reduce memory usage. if (socket.upgradeReq) { - socket.ip = opts.trustProxy - ? socket.upgradeReq.headers['x-forwarded-for'] || socket.upgradeReq.connection.remoteAddress - : socket.upgradeReq.connection.remoteAddress.replace(common.REMOVE_IPV4_MAPPED_IPV6_RE, '') // force ipv4 + if (opts.trustProxy) { + if (socket.upgradeReq.headers['x-forwarded-for']) { + const [realIp] = socket.upgradeReq.headers['x-forwarded-for'].split(',') + socket.ip = realIp.trim() + } else { + socket.ip = socket.upgradeReq.connection.remoteAddress + } + } else { + socket.ip = socket.upgradeReq.connection.remoteAddress.replace(common.REMOVE_IPV4_MAPPED_IPV6_RE, '') // force ipv4 + } + socket.port = socket.upgradeReq.connection.remotePort if (socket.port) { socket.addr = `${common.IPV6_RE.test(socket.ip) ? `[${socket.ip}]` : socket.ip}:${socket.port}` diff --git a/package.json b/package.json index 4d0f3abb..04b59cf3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bittorrent-tracker", "description": "Simple, robust, BitTorrent tracker (client & server) implementation", - "version": "10.0.2", + "version": "10.0.3", "author": { "name": "WebTorrent LLC", "email": "feross@webtorrent.io", @@ -27,6 +27,7 @@ }, "type": "module", "dependencies": { + "@thaunknown/simple-websocket": "^9.1.0", "bencode": "^3.0.3", "bittorrent-peerid": "^1.3.3", "bn.js": "^5.2.0", @@ -45,7 +46,6 @@ "run-series": "^1.1.9", "simple-get": "^4.0.0", "simple-peer": "^9.11.0", - "simple-websocket": "^9.1.0", "socks": "^2.0.0", "string2compact": "^2.0.0", "unordered-array-remove": "^1.0.2", @@ -53,9 +53,9 @@ }, "devDependencies": { "@mapbox/node-pre-gyp": "1.0.10", - "@webtorrent/semantic-release-config": "1.0.8", - "magnet-uri": "7.0.2", - "semantic-release": "20.1.0", + "@webtorrent/semantic-release-config": "1.0.9", + "magnet-uri": "7.0.3", + "semantic-release": "20.1.3", "standard": "*", "tape": "5.6.3", "webtorrent-fixtures": "2.0.2",