summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnna Henningsen <anna@addaleax.net>2018-06-25 18:46:33 +0200
committerAnna Henningsen <anna@addaleax.net>2018-06-30 15:52:54 +0200
commit64a3fadf7192485197b9695b7bb2165c7e7d762d (patch)
treec226390642b88585eebcb38899e7afb1f2fda75c
parenta078521a6a9cede03208216d58d5af13e8406cbe (diff)
downloadandroid-node-v8-64a3fadf7192485197b9695b7bb2165c7e7d762d.tar.gz
android-node-v8-64a3fadf7192485197b9695b7bb2165c7e7d762d.tar.bz2
android-node-v8-64a3fadf7192485197b9695b7bb2165c7e7d762d.zip
src: remove StreamBase::kFlagHasWritev
Since libuv 1.21.0, pipes on Windows support `writev` on the libuv side. This allows for some simplification, and makes the `StreamBase` API more uniform (multi-buffer `Write()` is always supported now, including when used by other non-JS consumers like HTTP/2). PR-URL: https://github.com/nodejs/node/pull/21527 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
-rw-r--r--lib/net.js4
-rw-r--r--src/js_stream.cc2
-rw-r--r--src/node_file.cc2
-rw-r--r--src/node_http2.cc2
-rw-r--r--src/pipe_wrap.cc4
-rw-r--r--src/stream_base-inl.h7
-rw-r--r--src/stream_base.h8
-rw-r--r--src/stream_wrap.cc5
-rw-r--r--src/stream_wrap.h3
-rw-r--r--src/tcp_wrap.cc2
-rw-r--r--src/tls_wrap.cc2
-rw-r--r--test/parallel/test-http2-pipe-named-pipe.js52
12 files changed, 63 insertions, 30 deletions
diff --git a/lib/net.js b/lib/net.js
index f8af082a85..2393539737 100644
--- a/lib/net.js
+++ b/lib/net.js
@@ -210,10 +210,6 @@ function initSocketHandle(self) {
self._handle.owner = self;
self._handle.onread = onread;
self[async_id_symbol] = getNewAsyncId(self._handle);
-
- // If handle doesn't support writev - neither do we
- if (!self._handle.writev)
- self._writev = null;
}
}
diff --git a/src/js_stream.cc b/src/js_stream.cc
index e562a62f3d..902aff7abe 100644
--- a/src/js_stream.cc
+++ b/src/js_stream.cc
@@ -208,7 +208,7 @@ void JSStream::Initialize(Local<Object> target,
env->SetProtoMethod(t, "readBuffer", ReadBuffer);
env->SetProtoMethod(t, "emitEOF", EmitEOF);
- StreamBase::AddMethods<JSStream>(env, t, StreamBase::kFlagHasWritev);
+ StreamBase::AddMethods<JSStream>(env, t);
target->Set(jsStreamString, t->GetFunction());
}
diff --git a/src/node_file.cc b/src/node_file.cc
index ed1799da58..f08833b201 100644
--- a/src/node_file.cc
+++ b/src/node_file.cc
@@ -1997,7 +1997,7 @@ void Initialize(Local<Object> target,
Local<String> handleString =
FIXED_ONE_BYTE_STRING(env->isolate(), "FileHandle");
fd->SetClassName(handleString);
- StreamBase::AddMethods<FileHandle>(env, fd, StreamBase::kFlagNone);
+ StreamBase::AddMethods<FileHandle>(env, fd);
target->Set(context, handleString, fd->GetFunction()).FromJust();
env->set_fd_constructor_template(fdt);
diff --git a/src/node_http2.cc b/src/node_http2.cc
index c1ab584134..0251777644 100644
--- a/src/node_http2.cc
+++ b/src/node_http2.cc
@@ -2840,7 +2840,7 @@ void Initialize(Local<Object> target,
env->SetProtoMethod(stream, "rstStream", Http2Stream::RstStream);
env->SetProtoMethod(stream, "refreshState", Http2Stream::RefreshState);
AsyncWrap::AddWrapMethods(env, stream);
- StreamBase::AddMethods<Http2Stream>(env, stream, StreamBase::kFlagHasWritev);
+ StreamBase::AddMethods<Http2Stream>(env, stream);
Local<ObjectTemplate> streamt = stream->InstanceTemplate();
streamt->SetInternalFieldCount(1);
env->set_http2stream_constructor_template(streamt);
diff --git a/src/pipe_wrap.cc b/src/pipe_wrap.cc
index 52e3f2730e..e2cc114479 100644
--- a/src/pipe_wrap.cc
+++ b/src/pipe_wrap.cc
@@ -83,11 +83,7 @@ void PipeWrap::Initialize(Local<Object> target,
env->SetProtoMethod(t, "ref", HandleWrap::Ref);
env->SetProtoMethod(t, "hasRef", HandleWrap::HasRef);
-#ifdef _WIN32
LibuvStreamWrap::AddMethods(env, t);
-#else
- LibuvStreamWrap::AddMethods(env, t, StreamBase::kFlagHasWritev);
-#endif
env->SetProtoMethod(t, "bind", Bind);
env->SetProtoMethod(t, "listen", Listen);
diff --git a/src/stream_base-inl.h b/src/stream_base-inl.h
index bd45103173..027b938d30 100644
--- a/src/stream_base-inl.h
+++ b/src/stream_base-inl.h
@@ -266,9 +266,7 @@ inline WriteWrap* StreamBase::CreateWriteWrap(
}
template <class Base>
-void StreamBase::AddMethods(Environment* env,
- Local<FunctionTemplate> t,
- int flags) {
+void StreamBase::AddMethods(Environment* env, Local<FunctionTemplate> t) {
HandleScope scope(env->isolate());
enum PropertyAttribute attributes =
@@ -325,8 +323,7 @@ void StreamBase::AddMethods(Environment* env,
env->SetProtoMethod(t, "readStart", JSMethod<Base, &StreamBase::ReadStartJS>);
env->SetProtoMethod(t, "readStop", JSMethod<Base, &StreamBase::ReadStopJS>);
env->SetProtoMethod(t, "shutdown", JSMethod<Base, &StreamBase::Shutdown>);
- if ((flags & kFlagHasWritev) != 0)
- env->SetProtoMethod(t, "writev", JSMethod<Base, &StreamBase::Writev>);
+ env->SetProtoMethod(t, "writev", JSMethod<Base, &StreamBase::Writev>);
env->SetProtoMethod(t,
"writeBuffer",
JSMethod<Base, &StreamBase::WriteBuffer>);
diff --git a/src/stream_base.h b/src/stream_base.h
index b91cf7df6c..4057806198 100644
--- a/src/stream_base.h
+++ b/src/stream_base.h
@@ -255,15 +255,9 @@ class StreamResource {
class StreamBase : public StreamResource {
public:
- enum Flags {
- kFlagNone = 0x0,
- kFlagHasWritev = 0x1
- };
-
template <class Base>
static inline void AddMethods(Environment* env,
- v8::Local<v8::FunctionTemplate> target,
- int flags = kFlagNone);
+ v8::Local<v8::FunctionTemplate> target);
virtual bool IsAlive() = 0;
virtual bool IsClosing() = 0;
diff --git a/src/stream_wrap.cc b/src/stream_wrap.cc
index ddeb74d809..2dea245fd1 100644
--- a/src/stream_wrap.cc
+++ b/src/stream_wrap.cc
@@ -97,8 +97,7 @@ LibuvStreamWrap::LibuvStreamWrap(Environment* env,
void LibuvStreamWrap::AddMethods(Environment* env,
- v8::Local<v8::FunctionTemplate> target,
- int flags) {
+ v8::Local<v8::FunctionTemplate> target) {
Local<FunctionTemplate> get_write_queue_size =
FunctionTemplate::New(env->isolate(),
GetWriteQueueSize,
@@ -110,7 +109,7 @@ void LibuvStreamWrap::AddMethods(Environment* env,
Local<FunctionTemplate>(),
static_cast<PropertyAttribute>(ReadOnly | DontDelete));
env->SetProtoMethod(target, "setBlocking", SetBlocking);
- StreamBase::AddMethods<LibuvStreamWrap>(env, target, flags);
+ StreamBase::AddMethods<LibuvStreamWrap>(env, target);
}
diff --git a/src/stream_wrap.h b/src/stream_wrap.h
index 7847ebe754..487a40b7ff 100644
--- a/src/stream_wrap.h
+++ b/src/stream_wrap.h
@@ -85,8 +85,7 @@ class LibuvStreamWrap : public HandleWrap, public StreamBase {
AsyncWrap* GetAsyncWrap() override;
static void AddMethods(Environment* env,
- v8::Local<v8::FunctionTemplate> target,
- int flags = StreamBase::kFlagNone);
+ v8::Local<v8::FunctionTemplate> target);
protected:
inline void set_fd(int fd) {
diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc
index 28a970a226..aa130d22e0 100644
--- a/src/tcp_wrap.cc
+++ b/src/tcp_wrap.cc
@@ -93,7 +93,7 @@ void TCPWrap::Initialize(Local<Object> target,
env->SetProtoMethod(t, "unref", HandleWrap::Unref);
env->SetProtoMethod(t, "hasRef", HandleWrap::HasRef);
- LibuvStreamWrap::AddMethods(env, t, StreamBase::kFlagHasWritev);
+ LibuvStreamWrap::AddMethods(env, t);
env->SetProtoMethod(t, "open", Open);
env->SetProtoMethod(t, "bind", Bind);
diff --git a/src/tls_wrap.cc b/src/tls_wrap.cc
index 4c4360358c..e731c0c130 100644
--- a/src/tls_wrap.cc
+++ b/src/tls_wrap.cc
@@ -895,7 +895,7 @@ void TLSWrap::Initialize(Local<Object> target,
env->SetProtoMethod(t, "destroySSL", DestroySSL);
env->SetProtoMethod(t, "enableCertCb", EnableCertCb);
- StreamBase::AddMethods<TLSWrap>(env, t, StreamBase::kFlagHasWritev);
+ StreamBase::AddMethods<TLSWrap>(env, t);
SSLWrap<TLSWrap>::AddMethods(env, t);
env->SetProtoMethod(t, "getServername", GetServername);
diff --git a/test/parallel/test-http2-pipe-named-pipe.js b/test/parallel/test-http2-pipe-named-pipe.js
new file mode 100644
index 0000000000..49fc142961
--- /dev/null
+++ b/test/parallel/test-http2-pipe-named-pipe.js
@@ -0,0 +1,52 @@
+'use strict';
+
+const common = require('../common');
+if (!common.hasCrypto)
+ common.skip('missing crypto');
+const fixtures = require('../common/fixtures');
+const assert = require('assert');
+const http2 = require('http2');
+const fs = require('fs');
+const net = require('net');
+const path = require('path');
+
+// HTTP/2 servers can listen on a named pipe.
+
+const tmpdir = require('../common/tmpdir');
+tmpdir.refresh();
+const loc = fixtures.path('url-tests.js');
+const fn = path.join(tmpdir.path, 'http2-url-tests.js');
+
+const server = http2.createServer();
+
+server.on('stream', common.mustCall((stream) => {
+ const dest = stream.pipe(fs.createWriteStream(fn));
+
+ dest.on('finish', () => {
+ assert.strictEqual(fs.readFileSync(loc).length,
+ fs.readFileSync(fn).length);
+ });
+ stream.respond();
+ stream.end();
+}));
+
+server.listen(common.PIPE, common.mustCall(() => {
+ const client = http2.connect('http://localhost', {
+ createConnection(url) {
+ return net.connect(server.address());
+ }
+ });
+
+ const req = client.request({ ':method': 'POST' });
+ req.on('response', common.mustCall());
+ req.resume();
+
+ req.on('close', common.mustCall(() => {
+ server.close();
+ client.close();
+ }));
+
+ const str = fs.createReadStream(loc);
+ str.on('end', common.mustCall());
+ str.pipe(req);
+}));