Browse Source

Merge remote-tracking branch 'origin/v0.8'

Conflicts:
	AUTHORS
	ChangeLog
	deps/uv/src/unix/pipe.c
	lib/http.js
	src/node_version.h
v0.9.11-release
Ben Noordhuis 12 years ago
parent
commit
cb87920ba9
  1. 1
      AUTHORS
  2. 13
      ChangeLog
  3. 1
      common.gypi
  4. 4
      doc/api/child_process.markdown
  5. 86
      doc/blog/release/v0.8.21.md
  6. 84
      doc/blog/release/v0.9.10.md
  7. 4
      doc/index.html
  8. 28
      lib/http.js
  9. 21
      src/node_zlib.cc
  10. 11
      test/simple/test-http-destroyed-socket-write.js

1
AUTHORS

@ -415,3 +415,4 @@ Andy Burke <aburke@bitflood.org>
Sugendran Ganess <sugendran@sugendran.net> Sugendran Ganess <sugendran@sugendran.net>
Jim Schubert <james.schubert@gmail.com> Jim Schubert <james.schubert@gmail.com>
Victor Costan <costan@gmail.com> Victor Costan <costan@gmail.com>
Timothy J Fontaine <tjfontaine@gmail.com>

13
ChangeLog

@ -1,3 +1,16 @@
2013.02.25, Version 0.8.21 (Stable)
* http: Do not free the wrong parser on socket close (isaacs)
* http: Handle hangup writes more gently (isaacs)
* zlib: fix assert on bad input (Ben Noordhuis)
* test: add TAP output to the test runner (Timothy J Fontaine)
* unix: Handle EINPROGRESS from domain sockets (Ben Noordhuis)
2013.02.19, Version 0.9.10 (Unstable) 2013.02.19, Version 0.9.10 (Unstable)
* V8: Upgrade to 3.15.11.15 * V8: Upgrade to 3.15.11.15

1
common.gypi

@ -121,6 +121,7 @@
'WarningLevel': 3, 'WarningLevel': 3,
'BufferSecurityCheck': 'true', 'BufferSecurityCheck': 'true',
'ExceptionHandling': 1, # /EHsc 'ExceptionHandling': 1, # /EHsc
'ImageHasSafeExceptionHandlers': 0, # /SAFESEH:NO
'SuppressStartupBanner': 'true', 'SuppressStartupBanner': 'true',
'WarnAsError': 'false', 'WarnAsError': 'false',
}, },

4
doc/api/child_process.markdown

@ -6,7 +6,9 @@ Node provides a tri-directional `popen(3)` facility through the
`child_process` module. `child_process` module.
It is possible to stream data through a child's `stdin`, `stdout`, and It is possible to stream data through a child's `stdin`, `stdout`, and
`stderr` in a fully non-blocking way. `stderr` in a fully non-blocking way. (Note that some programs use
line-buffered I/O internally. That doesn't affect node.js but it means
data you send to the child process is not immediately consumed.)
To create a child process use `require('child_process').spawn()` or To create a child process use `require('child_process').spawn()` or
`require('child_process').fork()`. The semantics of each are slightly `require('child_process').fork()`. The semantics of each are slightly

86
doc/blog/release/v0.8.21.md

@ -0,0 +1,86 @@
date: Mon Feb 25 13:48:51 PST 2013
version: 0.8.21
category: release
title: Node v0.8.21 (Stable)
slug: node-v0-8-21-stable
2013.02.25, Version 0.8.21 (Stable)
* http: Do not free the wrong parser on socket close (isaacs)
* http: Handle hangup writes more gently (isaacs)
* zlib: fix assert on bad input (Ben Noordhuis)
* test: add TAP output to the test runner (Timothy J Fontaine)
* unix: Handle EINPROGRESS from domain sockets (Ben Noordhuis)
Source Code: http://nodejs.org/dist/v0.8.21/node-v0.8.21.tar.gz
Macintosh Installer (Universal): http://nodejs.org/dist/v0.8.21/node-v0.8.21.pkg
Windows Installer: http://nodejs.org/dist/v0.8.21/node-v0.8.21-x86.msi
Windows x64 Installer: http://nodejs.org/dist/v0.8.21/x64/node-v0.8.21-x64.msi
Windows x64 Files: http://nodejs.org/dist/v0.8.21/x64/
Linux 32-bit Binary: http://nodejs.org/dist/v0.8.21/node-v0.8.21-linux-x86.tar.gz
Linux 64-bit Binary: http://nodejs.org/dist/v0.8.21/node-v0.8.21-linux-x64.tar.gz
Solaris 32-bit Binary: http://nodejs.org/dist/v0.8.21/node-v0.8.21-sunos-x86.tar.gz
Solaris 64-bit Binary: http://nodejs.org/dist/v0.8.21/node-v0.8.21-sunos-x64.tar.gz
Other release files: http://nodejs.org/dist/v0.8.21/
Website: http://nodejs.org/docs/v0.8.21/
Documentation: http://nodejs.org/docs/v0.8.21/api/
Shasums:
```
383b9009a587b7390a5a00cef4ece441fb16dd82 node-v0.8.21-darwin-x64.tar.gz
47654ca8ecc93c846e6f7493a19931b99d5e4b87 node-v0.8.21-darwin-x86.tar.gz
46d66f3b95f447811e9253d66050859b4bb81ea0 node-v0.8.21-linux-x64.tar.gz
1f16e50dacd5e942970c28be1e578e6260a116c4 node-v0.8.21-linux-x86.tar.gz
b24b5e0acc53f004122c0cb2df775c4493b1e048 node-v0.8.21-sunos-x64.tar.gz
54ca0c94dff35e941fe90d10755427a15d6519ae node-v0.8.21-sunos-x86.tar.gz
38c5855c1ebd70fde111d50343a163a03cff9765 node-v0.8.21-x86.msi
60cd1fb8f43943bd3ed7c07745df1b3e81bafc13 node-v0.8.21.pkg
8b75377eafb5e77d6dff141c9533202d5a589ce4 node-v0.8.21.tar.gz
c310779c80d21be7556ec0921d5afca8f64792eb node.exe
61b98f9dfbe70184788b6f010ce7667c9cba0fdc node.exp
78c37ac837bbb8fefd691e351b3c20f136b212ee node.lib
40cc197db5c9fc4ded4509b5ae21bc53d178998e node.pdb
ec29a824e51308349f7895c010469f8e59939094 x64/node-v0.8.21-x64.msi
e4c5563c38a01dac1a97f6366175d1fef86da262 x64/node.exe
8e51783d5e03148f01db8386102e4ffc4e30deda x64/node.exp
a6017052052bb469a50327b4f40c990c25da0932 x64/node.lib
fb8d24e5208b14d35997bc3b46e325316e6ad94d x64/node.pdb
```
Shasums:
```
62cd69928ce2da9e8512b3efb96aba353ee54a91 node-v0.8.21-darwin-x64.tar.gz
62cf9b990f8e424e7fdb1d50a46d779e4d508b23 node-v0.8.21-darwin-x86.tar.gz
83e92aec4f4a0167e7c5b3ef04388fc33712d97b node-v0.8.21-linux-x64.tar.gz
83a8aa10dafa196b372958d1052f61fe1c16c2a4 node-v0.8.21-linux-x86.tar.gz
588830b0d095c0ef3583d9f7f574426f5b456e2e node-v0.8.21-sunos-x64.tar.gz
e4eff5914432da3cf12a833aaa0444693671cca1 node-v0.8.21-sunos-x86.tar.gz
8146b2254caa814157aa511075dcf7b42d0ecb59 node-v0.8.21-x86.msi
60cd1fb8f43943bd3ed7c07745df1b3e81bafc13 node-v0.8.21.pkg
65ab7307f1aee12be4c88e396e2510967a52b1c6 node-v0.8.21.tar.gz
5d770ad554ee4a73278b2d90029e758e0a676074 node.exe
17514f32c57c64bd0d367c71ed0e6dc399fc9e12 node.exp
9404eff8562dfb0a6e0e72167278ac6131be5d3a node.lib
94908174f715d2707d48e6d53a1f96f33059f56c node.pdb
36750abf56120a63d9fa9b2b75bdc98dfac051f7 x64/node-v0.8.21-x64.msi
b61b9620e936bc9c19043a02625aed9922aeb653 x64/node.exe
21a0e855e652e7fbe84e7efc1f7a3542fa870372 x64/node.exp
f9d017c07030599e3442a958020381a37402dc81 x64/node.lib
3b35fbac0962aaff46bdd2f06412dcb1f80b9895 x64/node.pdb
```

84
doc/blog/release/v0.9.10.md

@ -0,0 +1,84 @@
category: release
date: Tue Feb 19 14:00:08 PST 2013
slug: node-v0-9-10-unstable
title: Node v0.9.10 (Unstable)
version: 0.9.10
2013.02.19, Version 0.9.10 (Unstable)
* V8: Upgrade to 3.15.11.15
* npm: Upgrade to 1.2.12
* fs: Change default WriteStream config, increase perf (isaacs)
* process: streamlining tick callback logic (Trevor Norris)
* stream_wrap, udp_wrap: add read-only fd property (Ben Noordhuis)
* buffer: accept negative indices in Buffer#slice() (Ben Noordhuis)
* tls: Cycle data when underlying socket drains (isaacs)
* stream: read(0) should not always trigger _read(n,cb) (isaacs)
* stream: Empty strings/buffers do not signal EOF any longer (isaacs)
* crypto: improve cipher/decipher error messages (Ben Noordhuis)
* net: Respect the 'readable' flag on sockets (isaacs)
* net: don't suppress ECONNRESET (Ben Noordhuis)
* typed arrays: copy Buffer in typed array constructor (Ben Noordhuis)
* typed arrays: make DataView throw on non-ArrayBuffer (Ben Noordhuis)
* windows: MSI installer enhancements (Scott Blomquist, Jim Schubert)
Source Code: http://nodejs.org/dist/v0.9.10/node-v0.9.10.tar.gz
Macintosh Installer (Universal): http://nodejs.org/dist/v0.9.10/node-v0.9.10.pkg
Windows Installer: http://nodejs.org/dist/v0.9.10/node-v0.9.10-x86.msi
Windows x64 Installer: http://nodejs.org/dist/v0.9.10/x64/node-v0.9.10-x64.msi
Windows x64 Files: http://nodejs.org/dist/v0.9.10/x64/
Linux 32-bit Binary: http://nodejs.org/dist/v0.9.10/node-v0.9.10-linux-x86.tar.gz
Linux 64-bit Binary: http://nodejs.org/dist/v0.9.10/node-v0.9.10-linux-x64.tar.gz
Solaris 32-bit Binary: http://nodejs.org/dist/v0.9.10/node-v0.9.10-sunos-x86.tar.gz
Solaris 64-bit Binary: http://nodejs.org/dist/v0.9.10/node-v0.9.10-sunos-x64.tar.gz
Other release files: http://nodejs.org/dist/v0.9.10/
Website: http://nodejs.org/docs/v0.9.10/
Documentation: http://nodejs.org/docs/v0.9.10/api/
Shasums:
```
813d5f42b156b7d64f00b86e13d26ada3ef352e5 node-v0.9.10-darwin-x64.tar.gz
99dbe66fd0fc176fb3459ffcf62212dcb27bef10 node-v0.9.10-darwin-x86.tar.gz
3a5a465238cbdbdac9786c204fd27be61ce7159a node-v0.9.10-linux-x64.tar.gz
3340ac206ec1a1f827c954efdfa1351dcfe9f419 node-v0.9.10-linux-x86.tar.gz
b920b2e57c6df1e080966fdeccbfd1b384b156d4 node-v0.9.10-sunos-x64.tar.gz
9c1744352bb1bc71f48f8aea1aff6aeefe35a394 node-v0.9.10-sunos-x86.tar.gz
f1daaafc330cc9993a3a6f7ca8b9cc870b49e75c node-v0.9.10-x86.msi
2b6c70f57c1513e8f5151785b1ac263565983918 node-v0.9.10.pkg
265542c15cf939b7c71a545758d835ed44d791d3 node-v0.9.10.tar.gz
653f24d53f411217d57ed18d73921ff4721f00dd node.exe
7d62da67a7b33628d7d90c9d5037cf564dfc5ce4 node.exp
cfebbcd81db602b2f051328a9924e19ca2cb6235 node.lib
a31694cb9e03d13a616f3cc634852d8dc98e69b8 node.pdb
5f94c1cc9301a8b85082fee7549aa376aedd8ec5 x64/node-v0.9.10-x64.msi
7716c01ce60f7c65100cc405726badf8476afebd x64/node.exe
121d4a721968ba4631d29de07e5d6c326d259b4b x64/node.exp
17f651000f6b0c840efe539ae5257cb894481c49 x64/node.lib
d04242a5ec3a3104931ec8de6a846a8f7746b1fd x64/node.pdb
```

4
doc/index.html

@ -89,7 +89,9 @@ http.createServer(function (req, res) {
}).listen(1337, '127.0.0.1'); }).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');</pre> console.log('Server running at http://127.0.0.1:1337/');</pre>
<p>To run the server, put the code into a file <code>example.js</code> and execute it with the <code>node</code> program:</p> <p>To run the server, put the code into a file
<code>example.js</code> and execute it with the
<code>node</code> program from the command line:</p>
<pre class="sh_none"> <pre class="sh_none">
% node example.js % node example.js
Server running at http://127.0.0.1:1337/</pre> Server running at http://127.0.0.1:1337/</pre>

28
lib/http.js

@ -437,6 +437,7 @@ function OutgoingMessage() {
this._trailer = ''; this._trailer = '';
this.finished = false; this.finished = false;
this._hangupClose = false;
} }
util.inherits(OutgoingMessage, Stream); util.inherits(OutgoingMessage, Stream);
@ -491,14 +492,24 @@ OutgoingMessage.prototype._writeRaw = function(data, encoding) {
return this.connection.write(data, encoding); return this.connection.write(data, encoding);
} else if (this.connection && this.connection.destroyed) { } else if (this.connection && this.connection.destroyed) {
// The socket was destroyed. If we're still trying to write to it, // The socket was destroyed. If we're still trying to write to it,
// then something bad happened. // then something bad happened, but it could be just that we haven't
// If we've already raised an error on this message, then just ignore. // gotten the 'close' event yet.
// XXX This was necessary in v0.8, but in v0.10, we no longer ignore //
// ECONNRESET anyway. Is this still required? // In v0.10 and later, this isn't a problem, since ECONNRESET isn't
if (!this._hadError) { // ignored in the first place. We'll probably emit 'close' on the
this.emit('error', createHangUpError()); // next tick, but just in case it's not coming, set a timeout that
this._hadError = true; // will emit it for us.
if (!this._hangupClose) {
this._hangupClose = true;
var socket = this.socket;
var timer = setTimeout(function() {
socket.emit('close');
});
socket.on('close', function() {
clearTimeout(timer);
});
} }
return false;
} else { } else {
// buffer, as long as we're not destroyed. // buffer, as long as we're not destroyed.
this._buffer(data, encoding); this._buffer(data, encoding);
@ -1810,7 +1821,8 @@ function connectionListener(socket) {
function serverSocketCloseListener() { function serverSocketCloseListener() {
debug('server socket close'); debug('server socket close');
// mark this parser as reusable // mark this parser as reusable
freeParser(parser); if (this.parser)
freeParser(this.parser);
abortIncoming(); abortIncoming();
} }

21
src/node_zlib.cc

@ -59,7 +59,22 @@ void InitZlib(v8::Handle<v8::Object> target);
class ZCtx : public ObjectWrap { class ZCtx : public ObjectWrap {
public: public:
ZCtx(node_zlib_mode mode) : ObjectWrap(), dictionary_(NULL), mode_(mode) {} ZCtx(node_zlib_mode mode)
: ObjectWrap()
, init_done_(false)
, level_(0)
, windowBits_(0)
, memLevel_(0)
, strategy_(0)
, err_(0)
, dictionary_(NULL)
, dictionary_len_(0)
, flush_(0)
, chunk_size_(0)
, write_in_progress_(false)
, mode_(mode)
{
}
~ZCtx() { ~ZCtx() {
@ -108,6 +123,7 @@ class ZCtx : public ObjectWrap {
assert(!ctx->write_in_progress_ && "write already in progress"); assert(!ctx->write_in_progress_ && "write already in progress");
ctx->write_in_progress_ = true; ctx->write_in_progress_ = true;
ctx->Ref();
assert(!args[0]->IsUndefined() && "must provide flush value"); assert(!args[0]->IsUndefined() && "must provide flush value");
@ -167,8 +183,6 @@ class ZCtx : public ObjectWrap {
ZCtx::Process, ZCtx::Process,
ZCtx::After); ZCtx::After);
ctx->Ref();
return ctx->handle_; return ctx->handle_;
} }
@ -283,6 +297,7 @@ class ZCtx : public ObjectWrap {
MakeCallback(ctx->handle_, onerror_sym, ARRAY_SIZE(args), args); MakeCallback(ctx->handle_, onerror_sym, ARRAY_SIZE(args), args);
// no hope of rescue. // no hope of rescue.
ctx->write_in_progress_ = false;
ctx->Unref(); ctx->Unref();
} }

11
test/simple/test-http-destroyed-socket-write.js

@ -75,15 +75,6 @@ server.listen(common.PORT, function() {
var writes = 0; var writes = 0;
var sawFalseWrite; var sawFalseWrite;
var gotError = false;
sec.on('error', function(er) {
assert.equal(gotError, false);
gotError = true;
assert(er.code === 'ECONNRESET');
clearTimeout(timer);
test();
});
function write() { function write() {
if (++writes === 64) { if (++writes === 64) {
clearTimeout(timer); clearTimeout(timer);
@ -121,7 +112,7 @@ server.listen(common.PORT, function() {
console.error('bad happened', sec.output, sec.outputEncodings); console.error('bad happened', sec.output, sec.outputEncodings);
assert.equal(sec.output.length, 0); assert.equal(sec.output.length, 0);
assert.equal(sec.outputEncodings, 0); assert.equal(sec.outputEncodings, 0);
assert(gotError); assert(sawFalseWrite);
assert(gotFirstResponse); assert(gotFirstResponse);
assert(gotFirstData); assert(gotFirstData);
assert(gotFirstEnd); assert(gotFirstEnd);

Loading…
Cancel
Save