Skip to content

Commit 3a9754a

Browse files
committed
Merge remote-tracking branch 'joyent/v0.12' into v0.12
Conflicts: lib/path.js
2 parents cee3f51 + c2b4f48 commit 3a9754a

File tree

5 files changed

+89
-6
lines changed

5 files changed

+89
-6
lines changed

doc/api/net.markdown

+8-1
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,21 @@ automatically set as a listener for the ['connection'][] event.
1313

1414
`options` is an object with the following defaults:
1515

16-
{ allowHalfOpen: false
16+
{
17+
allowHalfOpen: false,
18+
pauseOnConnect: false
1719
}
1820

1921
If `allowHalfOpen` is `true`, then the socket won't automatically send a FIN
2022
packet when the other end of the socket sends a FIN packet. The socket becomes
2123
non-readable, but still writable. You should call the `end()` method explicitly.
2224
See ['end'][] event for more information.
2325

26+
If `pauseOnConnect` is `true`, then the socket associated with each incoming
27+
connection will be paused, and no data will be read from its handle. This allows
28+
connections to be passed between processes without any data being read by the
29+
original process. To begin reading data from a paused socket, call `resume()`.
30+
2431
Here is an example of an echo server which listens for connections
2532
on port 8124:
2633

doc/api/smalloc.markdown

+7-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ possible options are listed in `smalloc.Types`. Example usage:
4848

4949
// { '0': 0, '1': 0.1, '2': 0.2 }
5050

51+
It is not possible to freeze, seal and prevent extensions of objects with
52+
external data using `Object.freeze`, `Object.seal` and
53+
`Object.preventExtensions` respectively.
54+
5155
### smalloc.copyOnto(source, sourceStart, dest, destStart, copyLength);
5256

5357
* `source` {Object} with external array allocation
@@ -105,8 +109,10 @@ careful. Cryptic errors may arise in applications that are difficult to trace.
105109
smalloc.copyOnto(b, 2, a, 0, 2);
106110

107111
// now results in:
108-
// Error: source has no external array data
112+
// RangeError: copy_length > source_length
109113

114+
After `dispose()` is called object still behaves as one with external data, for
115+
example `smalloc.hasExternalData()` returns `true`.
110116
`dispose()` does not support Buffers, and will throw if passed.
111117

112118
### smalloc.hasExternalData(obj)

lib/net.js

+13-3
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,16 @@ function Socket(options) {
180180

181181
// if we have a handle, then start the flow of data into the
182182
// buffer. if not, then this will happen when we connect
183-
if (this._handle && options.readable !== false)
184-
this.read(0);
183+
if (this._handle && options.readable !== false) {
184+
if (options.pauseOnCreate) {
185+
// stop the handle from reading and pause the stream
186+
this._handle.reading = false;
187+
this._handle.readStop();
188+
this._readableState.flowing = false;
189+
} else {
190+
this.read(0);
191+
}
192+
}
185193
}
186194
util.inherits(Socket, stream.Duplex);
187195

@@ -1024,6 +1032,7 @@ function Server(/* [ options, ] listener */) {
10241032
this._slaves = [];
10251033

10261034
this.allowHalfOpen = options.allowHalfOpen || false;
1035+
this.pauseOnConnect = !!options.pauseOnConnect;
10271036
}
10281037
util.inherits(Server, events.EventEmitter);
10291038
exports.Server = Server;
@@ -1287,7 +1296,8 @@ function onconnection(err, clientHandle) {
12871296

12881297
var socket = new Socket({
12891298
handle: clientHandle,
1290-
allowHalfOpen: self.allowHalfOpen
1299+
allowHalfOpen: self.allowHalfOpen,
1300+
pauseOnCreate: self.pauseOnConnect
12911301
});
12921302
socket.readable = socket.writable = true;
12931303

lib/path.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,10 @@ if (isWindows) {
164164
!resolvedAbsolute).join('\\');
165165

166166
// If device is a drive letter, we'll normalize to lower case.
167-
if (resolvedDevice && resolvedDevice.charAt(1) === ':')
167+
if (resolvedDevice && resolvedDevice.charAt(1) === ':') {
168168
resolvedDevice = resolvedDevice[0].toLowerCase() +
169169
resolvedDevice.substr(1);
170+
}
170171

171172
return (resolvedDevice + (resolvedAbsolute ? '\\' : '') + resolvedTail) ||
172173
'.';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright Joyent, Inc. and other Node contributors.
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a
4+
// copy of this software and associated documentation files (the
5+
// "Software"), to deal in the Software without restriction, including
6+
// without limitation the rights to use, copy, modify, merge, publish,
7+
// distribute, sublicense, and/or sell copies of the Software, and to permit
8+
// persons to whom the Software is furnished to do so, subject to the
9+
// following conditions:
10+
//
11+
// The above copyright notice and this permission notice shall be included
12+
// in all copies or substantial portions of the Software.
13+
//
14+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15+
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16+
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
17+
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19+
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20+
// USE OR OTHER DEALINGS IN THE SOFTWARE.
21+
22+
var common = require('../common');
23+
var assert = require('assert');
24+
var net = require('net');
25+
var msg = 'test';
26+
var stopped = true;
27+
var server1 = net.createServer({pauseOnConnect: true}, function(socket) {
28+
socket.on('data', function(data) {
29+
if (stopped) {
30+
assert(false, 'data event should not have happened yet');
31+
}
32+
33+
assert.equal(data.toString(), msg, 'invalid data received');
34+
socket.end();
35+
server1.close();
36+
});
37+
38+
setTimeout(function() {
39+
assert.equal(socket.bytesRead, 0, 'no data should have been read yet');
40+
socket.resume();
41+
stopped = false;
42+
}, 3000);
43+
});
44+
45+
var server2 = net.createServer({pauseOnConnect: false}, function(socket) {
46+
socket.on('data', function(data) {
47+
assert.equal(data.toString(), msg, 'invalid data received');
48+
socket.end();
49+
server2.close();
50+
});
51+
});
52+
53+
server1.listen(common.PORT, function() {
54+
net.createConnection({port: common.PORT}).write(msg);
55+
});
56+
57+
server2.listen(common.PORT + 1, function() {
58+
net.createConnection({port: common.PORT + 1}).write(msg);
59+
});

0 commit comments

Comments
 (0)