- Version: v8.4.0
- Platform: Linux 4.4.0-92-generic x86_64 GNU/Linux
- Subsystem: net,tls
reproduce:
consttls=require('tls');constfs=require('fs');constkey=fs.readFileSync('key.pem');constcert=fs.readFileSync('cert.pem');constserver=tls.createServer({key, cert},(socket)=>{socket.pipe(socket);socket.on('end',()=>{server.close();});});server.listen(0,()=>{constclient=tls.connect(server.address().port,{rejectUnauthorized: false},()=>{console.log(client.bufferSize);// 1client.write(Buffer.alloc(10));console.log(client.bufferSize);// 11client.end();});client.on('finish',()=>{console.log(client.bufferSize);// 1});});bufferSize is obviously wrong in this case, this affects users who rely on this property to make judgments, for example:
if(socket.bufferSize<=0){// oops! never reach here...}why?
| TLSSocket.prototype._init=function(socket,wrap){ |
| varself=this; |
| varoptions=this._tlsOptions; |
| varssl=this._handle; |
| |
| // lib/net.js expect this value to be non-zero if write hasn't been flushed |
| // immediately |
| // TODO(indutny): revise this solution, it might be 1 before handshake and |
| // represent real writeQueueSize during regular writes. |
| ssl.writeQueueSize=1; |
| |
It seems a legacy code here. After I searched the entire lib, writeQueueSize is only use for calculating bufferSize and decide if should wait until write flushed.
| Object.defineProperty(Socket.prototype,'bufferSize',{ |
| get: function(){ |
| if(this._handle){ |
| returnthis._handle.writeQueueSize+this._writableState.length; |
| } |
| } |
| }); |
| // If it was entirely flushed, we can write some more right now. |
| // However, if more is left in the queue, then wait until that clears. |
| if(req.async&&this._handle.writeQueueSize!==0) |
| req.cb=cb; |
| else |
| cb(); |
Simply remove writeQueueSize works fine for me, and I also opened a PR to fix the problem, all local tests passed but I still not very sure whether it's a right approach, so please make a review.
reproduce:
bufferSizeis obviously wrong in this case, this affects users who rely on this property to make judgments, for example:why?
node/lib/_tls_wrap.js
Lines 427 to 437 in 3cf27f1
It seems a legacy code here. After I searched the entire
lib,writeQueueSizeis only use for calculatingbufferSizeand decide if should wait until write flushed.node/lib/net.js
Lines 465 to 471 in 3cf27f1
node/lib/net.js
Lines 768 to 773 in 3cf27f1
Simply remove
writeQueueSizeworks fine for me, and I also opened a PR to fix the problem, all local tests passed but I still not very sure whether it's a right approach, so please make a review.