|
@@ -219,26 +219,31 @@ describe('net module', () => {
|
|
|
expect(loginAuthInfo.scheme).to.equal('basic')
|
|
|
})
|
|
|
|
|
|
- it('should produce an error on the response object when cancelling authentication', async () => {
|
|
|
+ it('should response when cancelling authentication', async () => {
|
|
|
const serverUrl = await respondOnce.toSingleURL((request, response) => {
|
|
|
if (!request.headers.authorization) {
|
|
|
- return response.writeHead(401, { 'WWW-Authenticate': 'Basic realm="Foo"' }).end()
|
|
|
+ response.writeHead(401, { 'WWW-Authenticate': 'Basic realm="Foo"' })
|
|
|
+ response.end('unauthenticated')
|
|
|
+ } else {
|
|
|
+ response.writeHead(200).end('ok')
|
|
|
}
|
|
|
- response.writeHead(200).end('ok')
|
|
|
})
|
|
|
- await expect(new Promise((resolve, reject) => {
|
|
|
+ expect(await new Promise((resolve, reject) => {
|
|
|
const request = net.request({ method: 'GET', url: serverUrl })
|
|
|
request.on('response', (response) => {
|
|
|
+ let data = ''
|
|
|
response.on('error', reject)
|
|
|
- response.on('data', () => {})
|
|
|
- response.on('end', () => resolve())
|
|
|
+ response.on('data', (chunk) => {
|
|
|
+ data += chunk
|
|
|
+ })
|
|
|
+ response.on('end', () => resolve(data))
|
|
|
})
|
|
|
request.on('login', (authInfo, cb) => {
|
|
|
cb()
|
|
|
})
|
|
|
request.on('error', reject)
|
|
|
request.end()
|
|
|
- })).to.eventually.be.rejectedWith('net::ERR_HTTP_RESPONSE_CODE_FAILURE')
|
|
|
+ })).to.equal('unauthenticated')
|
|
|
})
|
|
|
|
|
|
it('should share credentials with WebContents', async () => {
|
|
@@ -717,6 +722,53 @@ describe('net module', () => {
|
|
|
expect(abortsEmitted).to.equal(1, 'request should emit exactly 1 "abort" event')
|
|
|
})
|
|
|
|
|
|
+ it('should allow to read response body from non-2xx response', async () => {
|
|
|
+ const bodyData = randomString(kOneKiloByte)
|
|
|
+ const serverUrl = await respondOnce.toSingleURL((request, response) => {
|
|
|
+ response.statusCode = 404
|
|
|
+ response.end(bodyData)
|
|
|
+ })
|
|
|
+
|
|
|
+ let requestResponseEventEmitted = false
|
|
|
+ let responseDataEventEmitted = false
|
|
|
+
|
|
|
+ const urlRequest = net.request(serverUrl)
|
|
|
+ const eventHandlers = Promise.all([
|
|
|
+ emittedOnce(urlRequest, 'response')
|
|
|
+ .then(async (params: any[]) => {
|
|
|
+ const response: Electron.IncomingMessage = params[0]
|
|
|
+ requestResponseEventEmitted = true
|
|
|
+ const statusCode = response.statusCode
|
|
|
+ expect(statusCode).to.equal(404)
|
|
|
+ const buffers: Buffer[] = []
|
|
|
+ response.on('data', (chunk) => {
|
|
|
+ buffers.push(chunk)
|
|
|
+ responseDataEventEmitted = true
|
|
|
+ })
|
|
|
+ await new Promise((resolve, reject) => {
|
|
|
+ response.on('error', () => {
|
|
|
+ reject(new Error('error emitted'))
|
|
|
+ })
|
|
|
+ emittedOnce(response, 'end')
|
|
|
+ .then(() => {
|
|
|
+ const receivedBodyData = Buffer.concat(buffers)
|
|
|
+ expect(receivedBodyData.toString()).to.equal(bodyData)
|
|
|
+ })
|
|
|
+ .then(resolve)
|
|
|
+ .catch(reject)
|
|
|
+ })
|
|
|
+ }),
|
|
|
+ emittedOnce(urlRequest, 'close')
|
|
|
+ ])
|
|
|
+
|
|
|
+ urlRequest.end()
|
|
|
+
|
|
|
+ await eventHandlers
|
|
|
+
|
|
|
+ expect(requestResponseEventEmitted).to.equal(true)
|
|
|
+ expect(responseDataEventEmitted).to.equal(true)
|
|
|
+ })
|
|
|
+
|
|
|
describe('webRequest', () => {
|
|
|
afterEach(() => {
|
|
|
session.defaultSession.webRequest.onBeforeRequest(null)
|