Skip to content

Commit 60f03b9

Browse files
committed
Provide IP and HTTP headers in both HTTP and Websocket server
1 parent 9e02f8e commit 60f03b9

File tree

4 files changed

+22
-8
lines changed

4 files changed

+22
-8
lines changed

lib/common-node.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ var querystring = require('querystring')
77

88
exports.IPV4_RE = /^[\d\.]+$/
99
exports.IPV6_RE = /^[\da-fA-F:]+$/
10+
exports.REMOVE_IPV4_MAPPED_IPV6_RE = /^::ffff:/
1011

1112
exports.CONNECTION_ID = Buffer.concat([ toUInt32(0x417), toUInt32(0x27101980) ])
1213
exports.ACTIONS = { CONNECT: 0, ANNOUNCE: 1, SCRAPE: 2, ERROR: 3 }

lib/server/parse-http.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ module.exports = parseHttpRequest
22

33
var common = require('../common')
44

5-
var REMOVE_IPV4_MAPPED_IPV6_RE = /^::ffff:/
6-
75
function parseHttpRequest (req, opts) {
86
if (!opts) opts = {}
97
var s = req.url.split('?')
@@ -34,8 +32,10 @@ function parseHttpRequest (req, opts) {
3432

3533
params.ip = opts.trustProxy
3634
? req.headers['x-forwarded-for'] || req.connection.remoteAddress
37-
: req.connection.remoteAddress.replace(REMOVE_IPV4_MAPPED_IPV6_RE, '') // force ipv4
35+
: req.connection.remoteAddress.replace(common.REMOVE_IPV4_MAPPED_IPV6_RE, '') // force ipv4
3836
params.addr = (common.IPV6_RE.test(params.ip) ? '[' + params.ip + ']' : params.ip) + ':' + params.port
37+
38+
params.headers = req.headers
3939
} else if (opts.action === 'scrape' || s[0] === '/scrape') {
4040
params.action = common.ACTIONS.SCRAPE
4141

lib/server/parse-websocket.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ module.exports = parseWebSocketRequest
22

33
var common = require('../common')
44

5-
function parseWebSocketRequest (socket, params) {
5+
function parseWebSocketRequest (socket, opts, params) {
6+
if (!opts) opts = {}
67
params = JSON.parse(params) // may throw
78

89
params.action = common.ACTIONS.ANNOUNCE
@@ -32,5 +33,15 @@ function parseWebSocketRequest (socket, params) {
3233
)
3334
params.compact = -1 // return full peer objects (used for websocket responses)
3435

36+
params.ip = opts.trustProxy
37+
? socket.upgradeReq.headers['x-forwarded-for'] || socket.upgradeReq.connection.remoteAddress
38+
: (socket.upgradeReq.connection.remoteAddress && socket.upgradeReq.connection.remoteAddress.replace(common.REMOVE_IPV4_MAPPED_IPV6_RE, '')) // force ipv4
39+
params.port = socket.upgradeReq.connection.remotePort
40+
if (params.port) {
41+
params.addr = (common.IPV6_RE.test(params.ip) ? '[' + params.ip + ']' : params.ip) + ':' + params.port
42+
}
43+
44+
params.headers = socket.upgradeReq.headers
45+
3546
return params
3647
}

server.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -294,21 +294,23 @@ Server.prototype.onUdpRequest = function (msg, rinfo) {
294294
})
295295
}
296296

297-
Server.prototype.onWebSocketConnection = function (socket) {
297+
Server.prototype.onWebSocketConnection = function (socket, opts) {
298298
var self = this
299+
if (!opts) opts = {}
300+
opts.trustProxy = opts.trustProxy || self._trustProxy
299301
socket.peerId = null // as hex
300302
socket.infoHashes = []
301303
socket.onSend = self._onWebSocketSend.bind(self, socket)
302-
socket.on('message', self._onWebSocketRequest.bind(self, socket))
304+
socket.on('message', self._onWebSocketRequest.bind(self, socket, opts))
303305
socket.on('error', self._onWebSocketError.bind(self, socket))
304306
socket.on('close', self._onWebSocketClose.bind(self, socket))
305307
}
306308

307-
Server.prototype._onWebSocketRequest = function (socket, params) {
309+
Server.prototype._onWebSocketRequest = function (socket, opts, params) {
308310
var self = this
309311

310312
try {
311-
params = parseWebSocketRequest(socket, params)
313+
params = parseWebSocketRequest(socket, opts, params)
312314
} catch (err) {
313315
socket.send(JSON.stringify({
314316
'failure reason': err.message

0 commit comments

Comments
 (0)