Skip to content

Commit

Permalink
fix: response.complete must be true after res.end (#1601)
Browse files Browse the repository at this point in the history
  • Loading branch information
doochik authored and mastermatt committed Jul 15, 2019
1 parent a952d9b commit 2c4edba
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/request_overrider.js
Expand Up @@ -446,6 +446,8 @@ function RequestOverrider(req, options, interceptors, remove) {
})
responseBody.on('end', function() {
response.push(null)
// https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete
response.complete = true
})
responseBody.on('error', function(err) {
response.emit('error', err)
Expand Down Expand Up @@ -536,6 +538,8 @@ function RequestOverrider(req, options, interceptors, remove) {
} else {
debug('ending response stream')
response.push(null)
// https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete
response.complete = true
interceptor.scope.emit('replied', req, interceptor)
}
})
Expand Down
27 changes: 27 additions & 0 deletions tests/test_request_overrider.js
Expand Up @@ -523,3 +523,30 @@ test("mocked requests have 'method' property", t => {
})
req.end()
})

// https://github.com/nock/nock/issues/1493
test("response have 'complete' property and it's true after end", t => {
const scope = nock('http://example.test')
.get('/')
.reply(200, 'Hello World!')

const req = http.request(
{
host: 'example.test',
method: 'GET',
path: '/',
port: 80,
},
res => {
res.on('end', () => {
t.is(res.complete, true)
scope.done()
t.end()
})
// Streams start in 'paused' mode and must be started.
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
res.resume()
}
)
req.end()
})
37 changes: 37 additions & 0 deletions tests/test_stream.js
Expand Up @@ -77,6 +77,43 @@ test('pause response after data', t => {
}, 0)
})

// https://github.com/nock/nock/issues/1493
test("response have 'complete' property and it's true after end", t => {
const response = new stream.PassThrough()
const scope = nock('http://example.test')
.get('/')
// Node does not pause the 'end' event so we need to use a stream to simulate
// multiple 'data' events.
.reply(200, response)

http.get(
{
host: 'example.test',
path: '/',
},
res => {
let hasData = false

res.on('data', () => {
hasData = true
})

res.on('end', () => {
t.true(hasData)
t.is(res.complete, true)
scope.done()
t.end()
})
}
)

// Manually simulate multiple 'data' events.
response.emit('data', 'one')
setTimeout(() => {
response.end()
}, 0)
})

// TODO Convert to async / got.
test('response pipe', t => {
const dest = (() => {
Expand Down

0 comments on commit 2c4edba

Please sign in to comment.