mirror of https://github.com/lukechilds/node.git
Browse Source
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>canary-base
committed by
James M Snell
3 changed files with 102 additions and 5 deletions
@ -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(); }); |
||||
|
}); |
||||
|
} |
@ -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…
Reference in new issue