0
0
mirror of https://github.com/nodejs/node.git synced 2024-12-01 16:10:02 +01:00
Commit Graph

11132 Commits

Author SHA1 Message Date
Chris Dickinson
31421afe89 buffer: reword Buffer.concat error message
this brings the error messaging in line with
other node TypeError messages.

Fixes: https://github.com/joyent/node/issues/7766
PR-URL: https://github.com/joyent/node/pull/8723
Reviewed-By: James M Snell <jasnell@users.noreply.github.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
2015-03-05 09:47:20 -05:00
Bert Belder
abd3ecfbd1 win,test: fix test-stdin-from-file
The test-stdin-from-from-file test runs a subprocess that verifies stdin
can be piped from a file.

The subprocess additionally attempts to verify that the file descriptor
for stdin never gets closed. It used to do this by creating a TCP server
and asserting that the associated file descriptor is greater than two.
However this strategy doesn't work on windows, because servers don't
have an associated file descriptor. With this patch an ordinary file is
opened instead of creating a server.

PR: https://github.com/iojs/io.js/pull/1067
Reviewed-By: Fedor Indutny <fedor@indutny.com>
Reviewed-By: Rod Vagg <rod@vagg.org>
Reviewed-By: Nikolai Vavilov <vvnicholas@gmail.com>
2015-03-05 15:30:52 +01:00
Jonathan Ong
4d0329ebeb fs: remove unnecessary usage of .hasOwnProperty()
PR-URL: https://github.com/iojs/io.js/pull/635
Reviewed-By: Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com>
2015-03-05 15:35:15 +03:00
Ken Perkins
b72fa03057 test: adds a test for undefined value in setHeader
As a result of 979d0ca8 there is a new check for undefined values on
OutgoingMessage.setHeader. This commit introduces a test for this case.

PR-URL: https://github.com/iojs/io.js/pull/970
Reviewed-By: Rod Vagg <rod@vagg.org>
Reviewed-By: Brendan Ashworth <brendan.ashworth@me.com>
2015-03-04 21:57:00 -08:00
Johan Bergström
2b79052494 benchmark: check for wrk ahead of running benchmarks
PR-URL: https://github.com/iojs/io.js/pull/982
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-03-04 20:25:49 -08:00
Johan Bergström
a45d4f8fd6 build: remove tools/wrk from the tree
wrk is an optional tool that some of the http benchmarks uses. The removal
doesn't affect any users. Developers are assumed to install it before running
the tests.

This change reduces the tarball by 5%

PR-URL: https://github.com/iojs/io.js/pull/982
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-03-04 20:25:41 -08:00
Brian White
555a7c48cf events: optimize listener array cloning
This both switches to a single algorithm for array cloning and also
speeds up (by ~100% in the ee-listeners-many benchmark) the
"many elements"  case that was previously handled by
`array.slice()`.

PR-URL: https://github.com/iojs/io.js/pull/1050
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Julian Duque <julianduquej@gmail.com>
2015-03-04 22:21:47 -05:00
Johan Bergström
563771d8b1 test: split parts out of host-headers test into its own test
this makes the separation between http and https testing cleaner

PR-URL: https://github.com/iojs/io.js/pull/1049
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Shigeki Ohtsu <ohtsu@iij.ad.jp>
2015-03-05 10:31:41 +09:00
Johan Bergström
671fbd5a9d test: refactor all tests that depends on crypto
we had a few ways versions of looking for support before executing a test. this
commit unifies them as well as add the check for all tests that previously
lacked them. found by running `./configure --without-ssl && make test`. also,
produce tap skip output if the test is skipped.

PR-URL: https://github.com/iojs/io.js/pull/1049
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Shigeki Ohtsu <ohtsu@iij.ad.jp>
2015-03-05 10:31:41 +09:00
Johan Bergström
c7ad320472 test: check for openssl cli and provide path if it exists
the previous version checked if io.js was compiled with openssl support which
isn't really relevant since we're starting a http server. we on the other hand
need an openssl-cli which may or may not exist.

PR-URL: https://github.com/iojs/io.js/pull/1049
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Shigeki Ohtsu <ohtsu@iij.ad.jp>
2015-03-05 10:31:41 +09:00
Johan Bergström
71776f9057 test: remove unused https imports
PR-URL: https://github.com/iojs/io.js/pull/1049
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Shigeki Ohtsu <ohtsu@iij.ad.jp>
2015-03-05 10:31:41 +09:00
Johan Bergström
3d5726c4ad test: introduce a helper that checks if crypto is available
since this applies to tls and https (among other things), it'll be used
for those tests as well. if we decouple the build system to somehow support
crypto but not tls, we could refine this.

PR-URL: https://github.com/iojs/io.js/pull/1049
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Shigeki Ohtsu <ohtsu@iij.ad.jp>
2015-03-05 10:31:41 +09:00
Johan Bergström
d0e7c359a7 test: don't assume process.versions.openssl always is available
PR-URL: https://github.com/iojs/io.js/pull/1049
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Shigeki Ohtsu <ohtsu@iij.ad.jp>
2015-03-05 10:31:32 +09:00
Trevor Norris
78581c8d90 buffer: add indexOf() method
Add Buffer#indexOf(). Support strings, numbers and other Buffers. Also
included docs and tests.

Special thanks to Sam Rijs <srijs@airpost.net> for first proposing this
change.

PR-URL: https://github.com/iojs/io.js/pull/561
Reviewed-by: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
2015-03-04 14:16:11 -07:00
Christian Tellnes
abb00cc915 url: throw for invalid values to url.format
`'use strict'` changes the behavior for `Function.prototype.call` when
the context is `undefined`. In earlier versions of node the value
`undefined` would make `url.format` look for fields in the global scope.

The docs states that `url.format` takes a parsed URL object and returns
a formatted URL string. So with this change it will now throw for other
values.

The exception is if the input is a string. Then it will call `url.parse`
on the string and then format it. The reason for that is that you can
call `url.format` on strings to clean up potentially wonky urls.

Fixes: https://github.com/iojs/io.js/issues/1033
PR-URL: https://github.com/iojs/io.js/pull/1036
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: Julian Duque <julianduquej@gmail.com>
2015-03-04 22:04:14 +01:00
Rod Vagg
31142415de doc: add TC meeting 2015-02-18 minutes
PR-URL: https://github.com/iojs/io.js/pull/1051
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
2015-03-04 10:15:02 -08:00
Ruben Verborgh
bd1bd7e38d timer: Improve performance of callbacks
setImmediate, setTimeout, and setInterval were called in an inefficient
way, especially in the presence of arguments.  This optimization
improves their performance, with special cases for up to 4 arguments.
Performance of setImmediate increases with 35%, setInterval with 60%,
setTimeout with 70%.

PR-URL: https://github.com/iojs/io.js/pull/406
Reviewed-by: Trevor Norris <trev.norris@gmail.com>
Reviewed-by: Christian Tellnes <christian@tellnes.com>
2015-03-04 10:08:04 -07:00
cjihrig
6190a2236b doc: remove cjihrig from TC
PR-URL: https://github.com/iojs/io.js/pull/1056
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2015-03-04 10:41:18 -05:00
Ben Noordhuis
fb284e2e4d src: fix compiler warning in smalloc.cc
Fix the following compiler warning by static_casting the enum values
to an uint32_t:

    ../src/smalloc.cc: In function 'void
    node::smalloc::Initialize(v8::Handle<v8::Object>,
                              v8::Handle<v8::Value>,
                              v8::Handle<v8::Context>)':
    ../src/smalloc.cc:601:203: warning: enumeral and non-enumeral type
    in conditional expression
        EXTERNAL_ARRAY_TYPES(V)

PR-URL: https://github.com/iojs/io.js/pull/1055
Reviewed-By: Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com>
2015-03-04 14:13:27 +03:00
Vladimir Kurchatkin
8f5f12bb48 smalloc: export constants from C++
PR-URL: https://github.com/iojs/io.js/pull/920
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
2015-03-04 11:37:12 +03:00
Vladimir Kurchatkin
0697f8b44d smalloc: validate arguments in js
PR-URL: https://github.com/iojs/io.js/pull/920
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
2015-03-04 11:33:48 +03:00
Brendan Ashworth
08133f45c7 http: optimize outgoing requests
This commit does some small optimization changes on
`lib/_http_outgoing.js`. These include switching from `while` loops to
`for` loops, moving away from `util` to `typeof` checks, and removing
dead code. It also includes variable caches to avoid lookups and
generic style changes. All in all, much faster execution.

It gets an across the board increase in req/sec on the benchmarks,
from my experience about a 10% increase.

PR-URL: https://github.com/iojs/io.js/pull/605
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Nicu Micleușanu <micnic90@gmail.com>
Reviewed-By: Christian Vaagland Tellnes <christian@tellnes.com>
Reviewed-By: Brian White <mscdex@mscdex.net>
2015-03-03 21:53:58 -08:00
Fedor Indutny
7b3b8acfa6 tls: accept empty net.Sockets
Accept `new net.Socket()` as a `socket` option to `tls.connect()`
without triggering an assertion error in C++.

This is done by wrapping it into a JSStream to ensure that there will be
a handle at the time of wrapping the socket into TLSSocket.

Fix: https://github.com/iojs/io.js/issues/987
PR-URL: https://github.com/iojs/io.js/pull/1046
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-03-03 17:05:55 -05:00
Fedor Indutny
e1bf6709dc test: fix racey-ness in tls-inception
Fix test failure on FreeBSD and SmartOS, which happens due to a bad
timing:

    events.js:141
          throw er; // Unhandled 'error' event
                ^
    Error: read ECONNRESET
        at exports._errnoException (util.js:734:11)
        at TLSWrap.onread (net.js:538:26)

The outer `net.conncet()` socket stays alive after the inner socket is
gone. This happens because `.pipe()`'s implementation does not `destroy`
the source side when the destination has emitted `close`.

Fix: https://github.com/iojs/io.js/issues/1012
PR-URL: https://github.com/iojs/io.js/pull/1040
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
2015-03-03 16:07:37 -05:00
Trevor Norris
e0835c9cda node: improve performance of nextTick
Couple micro optimizations to improve performance of process.nextTick().
Removes ~60ns of execution time.

Also added small threshold to test that allows timer to fire early on
the order if microseconds.

PR-URL: https://github.com/iojs/io.js/pull/985
Reviewed-By: Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com>
2015-03-03 13:45:19 -07:00
Sam Roberts
9741291fe9 doc: fix child_process heading depth
Addition of the Sync/Async headers didn't indent all the sub-headers.

Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
PR-URL: https://github.com/iojs/io.js/pull/1038
2015-03-03 11:21:33 -08:00
Johan Bergström
fd3ea29902 test: fix test-fs-access when uid is 0
Superusers can open files with W_OK permission even though their
mode is set to 0444. This commit makes the test attempt to change
its uid to nobody on non-Windows platforms. Patch originally from
https://github.com/joyent/node/commit/28d0cbbd.

Fixes: https://github.com/iojs/io.js/issues/1031
PR-URL: https://github.com/iojs/io.js/pull/1037
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
2015-03-03 10:17:03 -05:00
Michael Dawson
5abfa930b8 test: make destroyed-socket-write2.js more robust
test/simple/test-http-destroyed-socket-write2.js validates
that you get an appropriate error when trying to write to
a request when the response on the other side has been destroyed.

The test uses http.request to get a request and then keeps writing
to it until either it hits 128 writes or gets the expected error.
Since the writes are asynchronous we see that the writes just end
up adding events to the event loop, which then later get processed
once the connection supporting the request is fully ready.

The test is timing dependent and if takes too long for the connection
to be made the limit of 128 writes is exceeded and the test fails.
The fact that the test allows a number of writes is probably to allow
some delay for the connection to be ready for writing.

On AIX, in the default configuration using the loopback interface
is slower and the test fails because the delay is such that many
more writes can be queued up before the connection takes place.
If we use the host ip instead of defaulting to the loopback then
the test passes.

The test needs to be made more robust to delays. Since each write
simply enqueues an additional write to the event queue there is
probably no point in doing the second write until the first has
completed. This patch schedules the next write when the first one
completes and allows the test to pass even if it takes longer for
the connection to be ready for writing

PR-URL: https://github.com/joyent/node/pull/9270
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Timothy J Fontaine <tjfontaine@gmail.com>
2015-03-03 10:03:42 -05:00
Robert Kowalski
c8110692a5 doc: add explanations for querystring
- add an article: `decode a non-utf8 string`
 - explain default and fallback behaviour of `querystring.unescape`

PR-URL: https://github.com/joyent/node/pull/9259
Reviewed-by: Julien Gilli <julien.gilli@joyent.com>
2015-03-03 10:03:42 -05:00
h7lin
8fb711e06c doc: fix default value of opts.decodeURIComponent
In the documentation for querystring.parse, the documentation mentions
that the default value for options.decodeURIComponent is the
decodeURIComponent function, but it's actually the querystring.unescape
function.

PR-URL: https://github.com/joyent/node/pull/9259
Reviewed-by: Julien Gilli <julien.gilli@joyent.com>
2015-03-03 10:03:42 -05:00
Julien Gilli
1009130495 tests: fix race in test-http-curl-chunk-problem
This test setups two event listeners: one on a child process' exit event
, another for the same child process' stdandard output's 'data' event.
The data even listener writes to a stream, and the exit event listener
ends it.

Because the exit event can be emitted before the data event, there is a
chance that something will be written to the stream after it's ended,
and that an error is thrown.

This change makes the test end the stream in the listener for the child
process' standard output's end event, which is guaranteed to be emitted
after the last data event, thus avoiding the race.

PR: https://github.com/joyent/node/pull/9301
Reviewed-by: Bert Belder <bertbelder@gmail.com>
Reviewed-by: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-by: Colin Ihrig <cjihrig@gmail.com>
2015-03-03 16:00:53 +01:00
Rod Vagg
6433ad1eef doc: add missing newline in CHANGELOG
Pushed without review
2015-03-02 17:49:24 -08:00
Rod Vagg
5133304ace Working on v1.4.4 2015-03-02 16:48:12 -08:00
Rod Vagg
b0710d7657 2015-03-02 io.js v1.4.3 Release
Notable changes:

* stream: Fixed problems for platforms without `writev()` support,
  particularly Windows. Changes introduced in 1.4.1, via
  https://github.com/iojs/io.js/pull/926, broke some
  functionality for these platforms, this has now been addressed.
  https://github.com/iojs/io.js/pull/1008 (Fedor Indutny)
* arm: We have the very beginnings of ARMv8 / ARM64 / AARCH64
  support. An upgrade to OpenSSL 1.0.2 is one requirement for full
  support. https://github.com/iojs/io.js/pull/1028
  (Ben Noordhuis)
* Add new collaborator: Julian Duque @julianduque
2015-03-02 16:45:43 -08:00
Ben Noordhuis
ca3c50b789 build: add basic arm64 support
This commit adds basic arm64 support to the build.  Building the bundled
openssl is disabled pending an upgrade to openssl 1.2, the currently
bundled version has some hand-rolled assembly that is 32 bits only.

PR-URL: https://github.com/iojs/io.js/pull/1028
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-03-03 00:40:49 +01:00
Ben Noordhuis
3d6440cf2a src: fix --without-ssl build
Don't include tls_wrap.h in stream_base.cc.  It's not used and it breaks
the build when --without-ssl is passed to configure.

Fixes the following build error:

    In file included from ../src/tls_wrap.h:5:0,
                     from ../src/stream_base.cc:10:
    ../src/node_crypto.h:20:25: fatal error: openssl/ssl.h:
    No such file or directory
     #include <openssl/ssl.h>

PR-URL: https://github.com/iojs/io.js/pull/1027
Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
2015-03-03 00:17:27 +01:00
Rod Vagg
08e89b1880 doc: update AUTHORS list
Update AUTHORS file using tools/update-authors.sh

PR-URL: https://github.com/iojs/io.js/pull/1018
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
2015-03-02 00:29:53 -08:00
Julian Duque
ea02d90cd0 doc: add julianduque as collaborator
PR-URL: https://github.com/iojs/io.js/pull/1021
Reviewed-By: Evan Lucas <evanlucas@me.com>
Reviewed-By: Christian Tellnes <christian@tellnes.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Rod Vagg <r@va.gg>
2015-03-01 19:45:54 -06:00
&! (bitandbang)
dfe7a17784 doc: fix typos and sources in WORKING_GROUPS.md
`therefor` is a typo of `therefore`, and was fixed. There were also two
places where the website WG was directly linked, where they should have
put the WG's name/repo; that was fixed as well.

PR-URL: https://github.com/iojs/io.js/pull/1022
Reviewed-By: Mikeal Rogers <mikeal.rogers@gmail.com>
Reviewed-By: Christian Tellnes <christian@tellnes.no>
2015-03-01 19:39:10 -06:00
Ryan Scheel
6d26990d32 doc: Clean up net.Socket
net.Socket::connect(options[, connectListener]) was missing, with the
relevant details found on the net.connect function. I moved the
appropriate documentation over and then rewrote the documentation for
the function to say that it just creates a socket and calls the connect
method on it. I also changed the other net.Socket::connect variants to
say they are like the options version but called with a specific
options object.

net.connect and other functions were called methods even though they
don't use the `this` binding, so I changed method to function where
appropriate.

Finally, I added a missing period to the end of the module summary.
It's not really related to the rest of the changes, but benjamingr
noticed it.

PR-URL: https://github.com/iojs/io.js/pull/951
Reviewed-By: Sam Roberts <vieuxtech@gmail.com>
Reviewed-By: Christian Tellnes <christian@tellnes.no>
2015-03-01 19:36:00 +01:00
Benjamin Gruenbaum
c380ac6e98 doc: suggest alternatives to deprecated APs
At the moment users who want to use `fs.exists` get a warning that the
method is deprecated but do not get offered an alternative in the page.
This PR suggests `fs.stat` and `fs.access` as alternatives while
keeping the warning about the use case in place.

Fixes: https://github.com/iojs/io.js/issues/1002
PR-URL: https://github.com/iojs/io.js/pull/1007
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: Christian Tellnes <christian@tellnes.no>
2015-03-01 18:46:28 +01:00
Fedor Indutny
2b47fd2eb6 stream_base: .writev() has limited support
Only TCP and JSStream do support `.writev()` on all platforms at the
moment. Ensure that it won't be enabled everywhere.

Fix: https://github.com/iojs/io.js/issues/995
PR-URL: https://github.com/iojs/io.js/pull/1008
Reviewed-by: Bert Belder <bertbelder@gmail.com>
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-02-28 16:50:36 -06:00
Rod Vagg
c9151547bc Working on v1.4.3 2015-02-28 15:16:32 -06:00
Rod Vagg
b6b9628df7 2015-02-28 io.js v1.4.2 Release
Notable changes:

* tls: A typo introduced in the TLSWrap changes in
  https://github.com/iojs/io.js/pull/840 only encountered as a bug on
  Windows was not caught by the io.js CI system due to problems with the
  Windows build script and the Windows CI slave configuration, see
  Fixed in https://github.com/iojs/io.js/pull/994 &
  https://github.com/iojs/io.js/pull/1004 (Fedor Indutny)
* npm: Upgrade npm to 2.6.1. See
  https://github.com/npm/npm/blob/master/CHANGELOG.md#v260-2015-02-12
  for details.
* Add new collaborators:
  - Robert Kowalski (@robertkowalski)
  - Christian Vaagland Tellnes (@tellnes)
  - Brian White (@mscdex)
2015-02-28 15:12:58 -06:00
Fedor Indutny
1ab7e80838 tls: proxy handle.reading back to parent handle
Fix: https://github.com/iojs/io.js/issues/995
PR-URL: https://github.com/iojs/io.js/pull/1004
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-02-28 14:16:32 -06:00
Russell Dempsey
7887e119ed install: new performance counters provider guid
The io.js performance counters manifest conflicts with the one from
node, causing installer failures. Change the GUID in the io.js
performance counters manifest file to resolve the conflicts.

Fixes: https://github.com/iojs/io.js/issues/524
PR: https://github.com/iojs/io.js/pull/1001
Reviewed-by: Bert Belder <bertbelder@gmail.com>
2015-02-28 17:05:15 +01:00
Fedor Indutny
755461219d tls: fix typo handle._reading => handle.reading
The problem does not manifest itself on unixes, because
`uv_read_start()` always return 0 there. However on Windows on a second
call `uv_read_start()` returns `UV__EALREADY` destroying all sockets on
a read attempt.

Set `.reading` property that is already handled by `net.js` code.

Fix: https://github.com/iojs/io.js/issues/988
PR-URL: https://github.com/iojs/io.js/pull/994
Reviewed-By: Chris Dickinson <christopher.s.dickinson@gmail.com>
2015-02-27 21:59:19 -08:00
Christian Tellnes
675cffb33e http: don't confuse automatic headers for others
If you set a custom http header which includes eg. the string `Date`,
then http will not automatically send the `Date` header.

This is also true for other automatic http headers.

PR-URL: https://github.com/iojs/io.js/pull/828
Reviewed-By: Brendan Ashworth <brendan.ashworth@me.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
2015-02-27 21:47:39 -08:00
Bert Belder
25da0742ee build: improve vcbuild.bat
* Support running multiple test suites (e.g. vcbuild test-simple test-gc).
* Removed a nonexisting test suite (test-uv).
* Removed superfluous extra layer of argument parsing.
* Fix the node-weak build.

R=@rvagg

PR-URL: https://github.com/iojs/io.js/pull/998
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-02-27 22:48:56 -06:00
Johan Bergström
b8310cbd3e build: reduce tarball size by 8-10%
Slim the tarballs further by removing examples, documentation and test for
third party libraries. Also switch to checkout-index versus archive so we avoid
using tar.

PR-URL: https://github.com/iojs/io.js/pull/961
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Rod Vagg <rod@vagg.org>
2015-02-27 18:25:39 -06:00