From 7e925df7956896ea36d8e745ea0494c859ac3e07 Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Wed, 28 Sep 2022 03:22:43 +0200 Subject: [PATCH] Wrap most functions of Http3Response --- src/HttpResponseWrapper.h | 57 +++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 30 deletions(-) diff --git a/src/HttpResponseWrapper.h b/src/HttpResponseWrapper.h index f94fe4b3..946239a1 100644 --- a/src/HttpResponseWrapper.h +++ b/src/HttpResponseWrapper.h @@ -23,14 +23,19 @@ using namespace v8; struct HttpResponseWrapper { - template - static inline uWS::HttpResponse *getHttpResponse(const FunctionCallbackInfo &args) { + template + static inline constexpr decltype(auto) getHttpResponse(const FunctionCallbackInfo &args) { Isolate *isolate = args.GetIsolate(); - auto *res = (uWS::HttpResponse *) args.Holder()->GetAlignedPointerFromInternalField(0); + auto *res = (uWS::HttpResponse *) args.Holder()->GetAlignedPointerFromInternalField(0); if (!res) { args.GetReturnValue().Set(isolate->ThrowException(v8::Exception::Error(String::NewFromUtf8(isolate, "Invalid access of discarded (invalid, deleted) uWS.HttpResponse/SSLHttpResponse.", NewStringType::kNormal).ToLocalChecked()))); } - return res; + + if constexpr (PROTOCOL == 2) { + return (uWS::Http3Response *) res; + } else { + return res; + } } /* Marks this JS object invalid */ @@ -214,6 +219,7 @@ struct HttpResponseWrapper { if (data.isInvalid(args)) { return; } + res->writeStatus(data.getString()); args.GetReturnValue().Set(args.Holder()); @@ -259,26 +265,17 @@ struct HttpResponseWrapper { invalidateResObject(args); - /* Override if HTTP3 */ - if constexpr (PROTOCOL == 2) { - - uWS::Http3Response *http3Res = (uWS::Http3Response *) res; - - http3Res->end(data.getString()); - - } else { - res->end(data.getString(), closeConnection); - } + res->end(data.getString(), closeConnection); args.GetReturnValue().Set(args.Holder()); } } /* Takes data and optionally totalLength, returns true for success, false for backpressure */ - template + template static void res_tryEnd(const FunctionCallbackInfo &args) { Isolate *isolate = args.GetIsolate(); - auto *res = getHttpResponse(args); + auto *res = getHttpResponse(args); if (res) { NativeString data(args.GetIsolate(), args[0]); if (data.isInvalid(args)) { @@ -307,10 +304,10 @@ struct HttpResponseWrapper { } /* Takes data, returns true for success, false for backpressure */ - template + template static void res_write(const FunctionCallbackInfo &args) { Isolate *isolate = args.GetIsolate(); - auto *res = getHttpResponse(args); + auto *res = getHttpResponse(args); if (res) { NativeString data(args.GetIsolate(), args[0]); if (data.isInvalid(args)) { @@ -323,10 +320,10 @@ struct HttpResponseWrapper { } /* Takes key, value. Returns this */ - template + template static void res_writeHeader(const FunctionCallbackInfo &args) { Isolate *isolate = args.GetIsolate(); - auto *res = getHttpResponse(args); + auto *res = getHttpResponse(args); if (res) { NativeString header(args.GetIsolate(), args[0]); if (header.isInvalid(args)) { @@ -416,19 +413,19 @@ struct HttpResponseWrapper { resTemplateLocal->InstanceTemplate()->SetInternalFieldCount(1); /* Register our functions */ + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "writeStatus", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_writeStatus)); resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "end", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_end)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "endWithoutBody", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_endWithoutBody)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "tryEnd", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_tryEnd)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "write", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_write)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "writeHeader", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_writeHeader)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "close", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_close)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "onWritable", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_onWritable)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "onAborted", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_onAborted)); + resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "onData", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_onData)); - if (SSL != 2) { - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "writeStatus", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_writeStatus)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "endWithoutBody", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_endWithoutBody)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "tryEnd", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_tryEnd)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "write", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_write)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "writeHeader", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_writeHeader)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "close", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_close)); + if constexpr (SSL != 2) { resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getWriteOffset", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_getWriteOffset)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "onWritable", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_onWritable)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "onAborted", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_onAborted)); - resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "onData", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_onData)); resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getRemoteAddress", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_getRemoteAddress)); resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "cork", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_cork)); resTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "upgrade", NewStringType::kNormal).ToLocalChecked(), FunctionTemplate::New(isolate, res_upgrade));