-
-
Notifications
You must be signed in to change notification settings - Fork 935
/
get-response.ts
37 lines (30 loc) · 1.23 KB
/
get-response.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import decompressResponse = require('decompress-response');
import EventEmitter = require('events');
import mimicResponse = require('mimic-response');
import stream = require('stream');
import {IncomingMessage} from 'http';
import {promisify} from 'util';
import {createProgressStream} from './progress';
import {NormalizedOptions} from './types';
const pipeline = promisify(stream.pipeline);
export default async (response: IncomingMessage, options: NormalizedOptions, emitter: EventEmitter): Promise<void> => {
const downloadBodySize = Number(response.headers['content-length']) || undefined;
const progressStream = createProgressStream('downloadProgress', emitter, downloadBodySize);
mimicResponse(response, progressStream);
const newResponse = (
options.decompress &&
options.method !== 'HEAD' ? decompressResponse(progressStream as unknown as IncomingMessage) : progressStream
) as IncomingMessage;
if (!options.decompress && ['gzip', 'deflate', 'br'].includes(newResponse.headers['content-encoding'] ?? '')) {
options.responseType = 'buffer';
}
emitter.emit('response', newResponse);
return pipeline(
response,
progressStream
).catch(error => {
if (error.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
throw error;
}
});
};