summaryrefslogtreecommitdiff
path: root/src/stream_wrap.cc
diff options
context:
space:
mode:
authorFedor Indutny <fedor.indutny@gmail.com>2014-01-24 22:08:25 +0400
committerFedor Indutny <fedor.indutny@gmail.com>2014-01-24 22:09:42 +0400
commit640912d18a63704fd493059a72b19e6367c2fc1c (patch)
tree2ad0e6e465dd981897f89d218d5a354f00fa9cf6 /src/stream_wrap.cc
parentd019eac5b5fe3522f527547046a9baef8ab9572c (diff)
downloadandroid-node-v8-640912d18a63704fd493059a72b19e6367c2fc1c.tar.gz
android-node-v8-640912d18a63704fd493059a72b19e6367c2fc1c.tar.bz2
android-node-v8-640912d18a63704fd493059a72b19e6367c2fc1c.zip
tls_wrap: propagate errors to write callbacks
fix #6903
Diffstat (limited to 'src/stream_wrap.cc')
-rw-r--r--src/stream_wrap.cc23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/stream_wrap.cc b/src/stream_wrap.cc
index 3b361f7a05..e0079b8136 100644
--- a/src/stream_wrap.cc
+++ b/src/stream_wrap.cc
@@ -215,6 +215,9 @@ void StreamWrap::WriteBuffer(const FunctionCallbackInfo<Value>& args) {
req_wrap->Dispatched();
req_wrap_obj->Set(env->bytes_string(),
Integer::NewFromUnsigned(length, node_isolate));
+ const char* msg = wrap->callbacks()->Error();
+ if (msg != NULL)
+ req_wrap_obj->Set(env->error_string(), OneByteString(env->isolate(), msg));
if (err) {
req_wrap->~WriteWrap();
@@ -300,6 +303,9 @@ void StreamWrap::WriteStringImpl(const FunctionCallbackInfo<Value>& args) {
req_wrap->Dispatched();
req_wrap->object()->Set(env->bytes_string(),
Integer::NewFromUnsigned(data_size, node_isolate));
+ const char* msg = wrap->callbacks()->Error();
+ if (msg != NULL)
+ req_wrap_obj->Set(env->error_string(), OneByteString(env->isolate(), msg));
if (err) {
req_wrap->~WriteWrap();
@@ -401,6 +407,9 @@ void StreamWrap::Writev(const FunctionCallbackInfo<Value>& args) {
req_wrap->Dispatched();
req_wrap->object()->Set(env->bytes_string(),
Number::New(node_isolate, bytes));
+ const char* msg = wrap->callbacks()->Error();
+ if (msg != NULL)
+ req_wrap_obj->Set(env->error_string(), OneByteString(env->isolate(), msg));
if (err) {
req_wrap->~WriteWrap();
@@ -441,14 +450,19 @@ void StreamWrap::AfterWrite(uv_write_t* req, int status) {
// Unref handle property
Local<Object> req_wrap_obj = req_wrap->object();
req_wrap_obj->Delete(env->handle_string());
- wrap->callbacks_->AfterWrite(req_wrap);
+ wrap->callbacks()->AfterWrite(req_wrap);
Local<Value> argv[] = {
Integer::New(status, node_isolate),
wrap->object(),
- req_wrap_obj
+ req_wrap_obj,
+ Undefined()
};
+ const char* msg = wrap->callbacks()->Error();
+ if (msg != NULL)
+ argv[3] = OneByteString(env->isolate(), msg);
+
req_wrap->MakeCallback(env->oncomplete_string(), ARRAY_SIZE(argv), argv);
req_wrap->~WriteWrap();
@@ -499,6 +513,11 @@ void StreamWrap::AfterShutdown(uv_shutdown_t* req, int status) {
}
+const char* StreamWrapCallbacks::Error() {
+ return NULL;
+}
+
+
int StreamWrapCallbacks::DoWrite(WriteWrap* w,
uv_buf_t* bufs,
size_t count,