http2: set decodeStrings to false, test
Set writableStream decodeStrings to false to let the native layer handle converting strings to buffer. PR-URL: https://github.com/nodejs/node/pull/15140 Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com> Reviewed-By: Claudio Rodriguez <cjrodr@yahoo.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
91dc50726b
commit
2ffc8ac301
28
benchmark/http2/write.js
Normal file
28
benchmark/http2/write.js
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const common = require('../common.js');
|
||||||
|
const PORT = common.PORT;
|
||||||
|
|
||||||
|
var bench = common.createBenchmark(main, {
|
||||||
|
streams: [100, 200, 1000],
|
||||||
|
length: [64 * 1024, 128 * 1024, 256 * 1024, 1024 * 1024],
|
||||||
|
}, { flags: ['--expose-http2', '--no-warnings'] });
|
||||||
|
|
||||||
|
function main(conf) {
|
||||||
|
const m = +conf.streams;
|
||||||
|
const l = +conf.length;
|
||||||
|
const http2 = require('http2');
|
||||||
|
const server = http2.createServer();
|
||||||
|
server.on('stream', (stream) => {
|
||||||
|
stream.respond();
|
||||||
|
stream.write('ü'.repeat(l));
|
||||||
|
stream.end();
|
||||||
|
});
|
||||||
|
server.listen(PORT, () => {
|
||||||
|
bench.http({
|
||||||
|
path: '/',
|
||||||
|
requests: 10000,
|
||||||
|
maxConcurrentStreams: m,
|
||||||
|
}, () => { server.close(); });
|
||||||
|
});
|
||||||
|
}
|
@ -1161,11 +1161,6 @@ class ClientHttp2Session extends Http2Session {
|
|||||||
|
|
||||||
function createWriteReq(req, handle, data, encoding) {
|
function createWriteReq(req, handle, data, encoding) {
|
||||||
switch (encoding) {
|
switch (encoding) {
|
||||||
case 'latin1':
|
|
||||||
case 'binary':
|
|
||||||
return handle.writeLatin1String(req, data);
|
|
||||||
case 'buffer':
|
|
||||||
return handle.writeBuffer(req, data);
|
|
||||||
case 'utf8':
|
case 'utf8':
|
||||||
case 'utf-8':
|
case 'utf-8':
|
||||||
return handle.writeUtf8String(req, data);
|
return handle.writeUtf8String(req, data);
|
||||||
@ -1176,6 +1171,11 @@ function createWriteReq(req, handle, data, encoding) {
|
|||||||
case 'utf16le':
|
case 'utf16le':
|
||||||
case 'utf-16le':
|
case 'utf-16le':
|
||||||
return handle.writeUcs2String(req, data);
|
return handle.writeUcs2String(req, data);
|
||||||
|
case 'latin1':
|
||||||
|
case 'binary':
|
||||||
|
return handle.writeLatin1String(req, data);
|
||||||
|
case 'buffer':
|
||||||
|
return handle.writeBuffer(req, data);
|
||||||
default:
|
default:
|
||||||
return handle.writeBuffer(req, Buffer.from(data, encoding));
|
return handle.writeBuffer(req, Buffer.from(data, encoding));
|
||||||
}
|
}
|
||||||
@ -1287,6 +1287,7 @@ function abort(stream) {
|
|||||||
class Http2Stream extends Duplex {
|
class Http2Stream extends Duplex {
|
||||||
constructor(session, options) {
|
constructor(session, options) {
|
||||||
options.allowHalfOpen = true;
|
options.allowHalfOpen = true;
|
||||||
|
options.decodeStrings = false;
|
||||||
super(options);
|
super(options);
|
||||||
this.cork();
|
this.cork();
|
||||||
this[kSession] = session;
|
this[kSession] = session;
|
||||||
|
68
test/parallel/test-http2-createwritereq.js
Normal file
68
test/parallel/test-http2-createwritereq.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
// Flags: --expose-http2
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const common = require('../common');
|
||||||
|
if (!common.hasCrypto)
|
||||||
|
common.skip('missing crypto');
|
||||||
|
const assert = require('assert');
|
||||||
|
const http2 = require('http2');
|
||||||
|
|
||||||
|
// Tests that write uses the correct encoding when writing
|
||||||
|
// using the helper function createWriteReq
|
||||||
|
|
||||||
|
const testString = 'a\u00A1\u0100\uD83D\uDE00';
|
||||||
|
|
||||||
|
const encodings = {
|
||||||
|
'buffer': 'utf8',
|
||||||
|
'ascii': 'ascii',
|
||||||
|
'latin1': 'latin1',
|
||||||
|
'binary': 'latin1',
|
||||||
|
'utf8': 'utf8',
|
||||||
|
'utf-8': 'utf8',
|
||||||
|
'ucs2': 'ucs2',
|
||||||
|
'ucs-2': 'ucs2',
|
||||||
|
'utf16le': 'ucs2',
|
||||||
|
'utf-16le': 'ucs2',
|
||||||
|
'UTF8': 'utf8' // should fall through to Buffer.from
|
||||||
|
};
|
||||||
|
|
||||||
|
const testsToRun = Object.keys(encodings).length;
|
||||||
|
let testsFinished = 0;
|
||||||
|
|
||||||
|
const server = http2.createServer(common.mustCall((req, res) => {
|
||||||
|
const testEncoding = encodings[req.path.slice(1)];
|
||||||
|
|
||||||
|
req.on('data', common.mustCall((chunk) => assert.ok(
|
||||||
|
Buffer.from(testString, testEncoding).equals(chunk)
|
||||||
|
)));
|
||||||
|
|
||||||
|
req.on('end', () => res.end());
|
||||||
|
}, Object.keys(encodings).length));
|
||||||
|
|
||||||
|
server.listen(0, common.mustCall(function() {
|
||||||
|
Object.keys(encodings).forEach((writeEncoding) => {
|
||||||
|
const client = http2.connect(`http://localhost:${this.address().port}`);
|
||||||
|
const req = client.request({
|
||||||
|
':path': `/${writeEncoding}`,
|
||||||
|
':method': 'POST'
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(req._writableState.decodeStrings, false);
|
||||||
|
req.write(
|
||||||
|
writeEncoding !== 'buffer' ? testString : Buffer.from(testString),
|
||||||
|
writeEncoding !== 'buffer' ? writeEncoding : undefined
|
||||||
|
);
|
||||||
|
req.resume();
|
||||||
|
|
||||||
|
req.on('end', common.mustCall(function() {
|
||||||
|
client.destroy();
|
||||||
|
testsFinished++;
|
||||||
|
|
||||||
|
if (testsFinished === testsToRun) {
|
||||||
|
server.close();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
req.end();
|
||||||
|
});
|
||||||
|
}));
|
Loading…
x
Reference in New Issue
Block a user