Skip to content

Commit 399d3f1

Browse files
authored
fix(requester-node-http): fix handling chunked responses fix #1161 (#1164)
1 parent a91bf8e commit 399d3f1

File tree

4 files changed

+31
-5
lines changed

4 files changed

+31
-5
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"lerna": "3.20.2",
7474
"nock": "12.0.2",
7575
"prettier": "1.19.1",
76+
"readable-stream": "3.6.0",
7677
"rollup": "1.32.1",
7778
"rollup-plugin-babel": "4.4.0",
7879
"rollup-plugin-filesize": "6.2.1",

packages/requester-node-http/src/__tests__/unit/node-http-requester.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { MethodEnum, Request } from '@algolia/requester-common';
22
import nock from 'nock';
3+
// @ts-ignore
4+
import { Readable } from 'readable-stream';
35

46
import { createNodeHttpRequester } from '../..';
57

@@ -87,6 +89,27 @@ describe('status code handling', () => {
8789
expect(response.content).toBe(JSON.stringify(body));
8890
expect(response.isTimedOut).toBe(false);
8991
});
92+
93+
it('handles chunked responses inside unicode character boundaries', async () => {
94+
const testdata = Buffer.from('äöü');
95+
96+
// create a test response stream that is chunked inside a unicode character
97+
function* generate() {
98+
yield testdata.slice(0, 3);
99+
yield testdata.slice(3);
100+
}
101+
102+
const testStream = Readable.from(generate());
103+
104+
nock('https://algolia-dns.net', { reqheaders: headers })
105+
.post('/foo')
106+
.query({ 'x-algolia-header': 'foo' })
107+
.reply(200, testStream);
108+
109+
const response = await requester.send(requestStub);
110+
111+
expect(response.content).toEqual(testdata.toString());
112+
});
90113
});
91114

92115
describe('timeout handling', () => {

packages/requester-node-http/src/createNodeHttpRequester.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ export function createNodeHttpRequester(): Requester & Destroyable {
2727
};
2828

2929
const req = (url.protocol === 'https:' ? https : http).request(options, response => {
30-
// eslint-disable-next-line functional/no-let
31-
let content = '';
30+
// eslint-disable-next-line functional/no-let, functional/prefer-readonly-type
31+
let contentBuffers: Buffer[] = [];
3232

33-
response.on('data', chunk => (content += chunk));
33+
response.on('data', chunk => {
34+
contentBuffers = contentBuffers.concat(chunk);
35+
});
3436

3537
response.on('end', () => {
3638
// eslint-disable-next-line @typescript-eslint/no-use-before-define
@@ -40,7 +42,7 @@ export function createNodeHttpRequester(): Requester & Destroyable {
4042

4143
resolve({
4244
status: response.statusCode || 0,
43-
content,
45+
content: Buffer.concat(contentBuffers).toString(),
4446
isTimedOut: false,
4547
});
4648
});

yarn.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8524,7 +8524,7 @@ read@1, read@~1.0.1:
85248524
string_decoder "~1.1.1"
85258525
util-deprecate "~1.0.1"
85268526

8527-
"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0:
8527+
"readable-stream@2 || 3", readable-stream@3.6.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0:
85288528
version "3.6.0"
85298529
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
85308530
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==

0 commit comments

Comments
 (0)