Skip to content

Commit 2c4edba

Browse files
doochikmastermatt
authored andcommitted
fix: response.complete must be true after res.end (#1601)
Fixes #1493 https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete
1 parent a952d9b commit 2c4edba

File tree

3 files changed

+68
-0
lines changed

3 files changed

+68
-0
lines changed

lib/request_overrider.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,8 @@ function RequestOverrider(req, options, interceptors, remove) {
446446
})
447447
responseBody.on('end', function() {
448448
response.push(null)
449+
// https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete
450+
response.complete = true
449451
})
450452
responseBody.on('error', function(err) {
451453
response.emit('error', err)
@@ -536,6 +538,8 @@ function RequestOverrider(req, options, interceptors, remove) {
536538
} else {
537539
debug('ending response stream')
538540
response.push(null)
541+
// https://nodejs.org/dist/latest-v10.x/docs/api/http.html#http_message_complete
542+
response.complete = true
539543
interceptor.scope.emit('replied', req, interceptor)
540544
}
541545
})

tests/test_request_overrider.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,3 +523,30 @@ test("mocked requests have 'method' property", t => {
523523
})
524524
req.end()
525525
})
526+
527+
// https://github.com/nock/nock/issues/1493
528+
test("response have 'complete' property and it's true after end", t => {
529+
const scope = nock('http://example.test')
530+
.get('/')
531+
.reply(200, 'Hello World!')
532+
533+
const req = http.request(
534+
{
535+
host: 'example.test',
536+
method: 'GET',
537+
path: '/',
538+
port: 80,
539+
},
540+
res => {
541+
res.on('end', () => {
542+
t.is(res.complete, true)
543+
scope.done()
544+
t.end()
545+
})
546+
// Streams start in 'paused' mode and must be started.
547+
// See https://nodejs.org/api/stream.html#stream_class_stream_readable
548+
res.resume()
549+
}
550+
)
551+
req.end()
552+
})

tests/test_stream.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,43 @@ test('pause response after data', t => {
7777
}, 0)
7878
})
7979

80+
// https://github.com/nock/nock/issues/1493
81+
test("response have 'complete' property and it's true after end", t => {
82+
const response = new stream.PassThrough()
83+
const scope = nock('http://example.test')
84+
.get('/')
85+
// Node does not pause the 'end' event so we need to use a stream to simulate
86+
// multiple 'data' events.
87+
.reply(200, response)
88+
89+
http.get(
90+
{
91+
host: 'example.test',
92+
path: '/',
93+
},
94+
res => {
95+
let hasData = false
96+
97+
res.on('data', () => {
98+
hasData = true
99+
})
100+
101+
res.on('end', () => {
102+
t.true(hasData)
103+
t.is(res.complete, true)
104+
scope.done()
105+
t.end()
106+
})
107+
}
108+
)
109+
110+
// Manually simulate multiple 'data' events.
111+
response.emit('data', 'one')
112+
setTimeout(() => {
113+
response.end()
114+
}, 0)
115+
})
116+
80117
// TODO Convert to async / got.
81118
test('response pipe', t => {
82119
const dest = (() => {

0 commit comments

Comments
 (0)