Skip to content
This repository was archived by the owner on Aug 11, 2021. It is now read-only.

Commit e39ae11

Browse files
othiym23zkat
authored andcommitted
request: don't return error as String
This bug has been lurking for a really long time, but was only recently exposed by changes to the registry architecture that make it more common to return a 404 without a body. Fixes: #112
1 parent dbb351a commit e39ae11

File tree

3 files changed

+24
-21
lines changed

3 files changed

+24
-21
lines changed

lib/request.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var assert = require('assert')
99
var url = require('url')
1010
var zlib = require('zlib')
1111
var Stream = require('stream').Stream
12+
var STATUS_CODES = require('http').STATUS_CODES
1213

1314
var request = require('request')
1415
var once = require('once')
@@ -208,8 +209,9 @@ function requestDone (method, where, cb) {
208209

209210
// expect data with any error codes
210211
if (!data && response.statusCode >= 400) {
212+
var code = response.statusCode
211213
return cb(
212-
response.statusCode + ' ' + require('http').STATUS_CODES[response.statusCode],
214+
new Error(code + ' ' + STATUS_CODES[code]),
213215
null,
214216
data,
215217
response

test/fetch-404.js

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
var resolve = require('path').resolve
22
var createReadStream = require('graceful-fs').createReadStream
3-
var readFileSync = require('graceful-fs').readFileSync
43

54
var tap = require('tap')
6-
var cat = require('concat-stream')
75

86
var server = require('./lib/server.js')
97
var common = require('./lib/common.js')
@@ -14,10 +12,7 @@ tap.test('fetch with a 404 response', function (t) {
1412
server.expect('/underscore/-/underscore-1.3.3.tgz', function (req, res) {
1513
t.equal(req.method, 'GET', 'got expected method')
1614

17-
res.writeHead(200, {
18-
'content-type': 'application/x-tar',
19-
'content-encoding': 'gzip'
20-
})
15+
res.writeHead(404)
2116

2217
createReadStream(tgz).pipe(res)
2318
})
@@ -27,19 +22,13 @@ tap.test('fetch with a 404 response', function (t) {
2722
client.fetch(
2823
'http://localhost:1337/underscore/-/underscore-1.3.3.tgz',
2924
defaulted,
30-
function (er, res) {
31-
t.ifError(er, 'loaded successfully')
32-
33-
var sink = cat(function (data) {
34-
t.deepEqual(data, readFileSync(tgz))
35-
t.end()
36-
})
37-
38-
res.on('error', function (error) {
39-
t.ifError(error, 'no errors on stream')
40-
})
41-
42-
res.pipe(sink)
25+
function (err, res) {
26+
t.equal(
27+
err.message,
28+
'fetch failed with status code 404',
29+
'got expected error message'
30+
)
31+
t.end()
4332
}
4433
)
4534
})

test/request.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ test('request call contract', function (t) {
8181
})
8282

8383
test('run request through its paces', function (t) {
84-
t.plan(29)
84+
t.plan(31)
8585

8686
server.expect('/request-defaults', function (req, res) {
8787
t.equal(req.method, 'GET', 'uses GET by default')
@@ -173,6 +173,13 @@ test('run request through its paces', function (t) {
173173
}))
174174
})
175175

176+
server.expect('GET', '/not-found-no-body', function (req, res) {
177+
req.pipe(concat(function () {
178+
res.statusCode = 404
179+
res.end()
180+
}))
181+
})
182+
176183
var defaults = {}
177184
client.request(
178185
common.registry + '/request-defaults',
@@ -260,4 +267,9 @@ test('run request through its paces', function (t) {
260267
client.request(common.registry + '/@scoped%2Fpackage-failing', defaults, function (er) {
261268
t.equals(er.message, 'payment required : @scoped/package-failing')
262269
})
270+
271+
client.request(common.registry + '/not-found-no-body', defaults, function (er) {
272+
t.equals(er.message, '404 Not Found')
273+
t.ok(typeof er !== 'string', "Error shouldn't be returned as string.")
274+
})
263275
})

0 commit comments

Comments
 (0)