Skip to content

Commit 943223d

Browse files
committed
Merge pull request webtorrent#52 from feross/encode-special-chars
encode special characters @*/+ in http tracker urls
2 parents 04d50cf + 6921151 commit 943223d

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

client.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,14 +454,18 @@ Tracker.prototype._handleResponse = function (requestUrl, data) {
454454
}
455455
var failure = data['failure reason']
456456
if (failure) {
457+
debug('failure from ' + requestUrl + ' (' + failure + ')')
457458
return self.client.emit('warning', new Error(failure))
458459
}
459460

460461
var warning = data['warning message']
461462
if (warning) {
463+
debug('warning from ' + requestUrl + ' (' + warning + ')')
462464
self.client.emit('warning', new Error(warning))
463465
}
464466

467+
debug('response from ' + requestUrl)
468+
465469
if (requestUrl === self._announceUrl) {
466470
var interval = data.interval || data['min interval']
467471
if (interval && !self._opts.interval && self._intervalMs !== 0) {

lib/common.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ exports.querystringStringify = function (obj) {
5959
var saved = querystring.escape
6060
querystring.escape = escape // global
6161
var ret = querystring.stringify(obj)
62+
ret = ret.replace(/[\@\*\/\+]/g, function (char) {
63+
// `escape` doesn't encode the characters @*/+ so we do it manually
64+
return '%' + char.charCodeAt(0).toString(16).toUpperCase()
65+
})
6266
querystring.escape = saved
6367
return ret
6468
}

test/querystring.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
var common = require('../lib/common')
2+
var test = require('tape')
3+
4+
// https://github.com/feross/webtorrent/issues/196
5+
test('encode special chars +* in http tracker urls', function (t) {
6+
var q = {
7+
info_hash: new Buffer('a2a15537542b22925ad10486bf7a8b2a9c42f0d1', 'hex').toString('binary')
8+
}
9+
var encoded = 'info_hash=%A2%A1U7T%2B%22%92Z%D1%04%86%BFz%8B%2A%9CB%F0%D1'
10+
t.equal(common.querystringStringify(q), encoded)
11+
12+
// sanity check that encode-decode matches up
13+
t.deepEqual(common.querystringParse(common.querystringStringify(q)), q)
14+
15+
t.end()
16+
})

0 commit comments

Comments
 (0)