Wrap req.getParameter, req.getUrl

This commit is contained in:
Alex Hultman 2019-01-14 12:44:29 +01:00
parent 647a6ef12c
commit 80bc15915b
4 changed files with 65 additions and 27 deletions

View File

@ -7,8 +7,10 @@ const app = uWS./*SSL*/App({
key_file_name: '/home/alexhultman/key.pem',
cert_file_name: '/home/alexhultman/cert.pem',
passphrase: '1234'
}).get('/static/:param', (res, req) => {
res.end('Hello, your url is ' + req.getUrl() + ". The param1 is " + req.getParameter(0));
}).get('/hello', (res, req) => {
res.end('Hejdå!');
res.end('Hej, du är på url: ' + req.getUrl());
}).ws('/*', {
compression: 0,
maxPayloadLength: 16 * 1024 * 1024,

View File

@ -145,7 +145,7 @@ void uWS_App_get(const FunctionCallbackInfo<Value> &args) {
Local<Object> resObject = getResInstance<APP>();
resObject->SetAlignedPointerInInternalField(0, res);
Local<Object> reqObject = Local<Object>::New(isolate, reqTemplate)->Clone();
Local<Object> reqObject = HttpRequestWrapper::getReqInstance();//Local<Object>::New(isolate, reqTemplate)->Clone();
reqObject->SetAlignedPointerInInternalField(0, req);
Local<Value> argv[] = {resObject, reqObject};

View File

@ -1,34 +1,70 @@
// req.getParam(int)
// req.getUrl()
// req.onAbort ?
/* Helping QtCreator */
#include "App.h"
#include <v8.h>
#include "Utilities.h"
using namespace v8;
/* The only thing this req needs is getHeader and similar, getParameter, getUrl and so on */
Persistent<Object> reqTemplate;
/* This one is the same for SSL and non-SSL */
struct HttpRequestWrapper {
static Persistent<Object> reqTemplate;
void req_getHeader(const FunctionCallbackInfo<Value> &args) {
// todo: refuse all function calls if we are not inside correct callback
static inline uWS::HttpRequest *getHttpRequest(const FunctionCallbackInfo<Value> &args) {
return ((uWS::HttpRequest *) args.Holder()->GetAlignedPointerFromInternalField(0));
}
// req.onAbort ?
/* Takes int, returns string (must be in bounds) */
static void req_getParameter(const FunctionCallbackInfo<Value> &args) {
int index = args[0]->Uint32Value();
std::string_view parameter = getHttpRequest(args)->getParameter(index);
args.GetReturnValue().Set(String::NewFromUtf8(isolate, parameter.data(), v8::String::kNormalString, parameter.length()));
}
/* Takes nothing, returns string */
static void req_getUrl(const FunctionCallbackInfo<Value> &args) {
std::string_view url = getHttpRequest(args)->getUrl();
args.GetReturnValue().Set(String::NewFromUtf8(isolate, url.data(), v8::String::kNormalString, url.length()));
}
/* Takes String, returns String */
static void req_getHeader(const FunctionCallbackInfo<Value> &args) {
NativeString data(args.GetIsolate(), args[0]);
char *buf = data.getData(); int length = data.getLength();
std::string_view header = ((uWS::HttpRequest *) args.Holder()->GetAlignedPointerFromInternalField(0))->getHeader(std::string_view(buf, length));
std::string_view header = getHttpRequest(args)->getHeader(std::string_view(buf, length));
args.GetReturnValue().Set(String::NewFromUtf8(isolate, header.data(), v8::String::kNormalString, header.length()));
}
void initReqTemplate() {
static void initReqTemplate() {
/* The only thing this req needs is getHeader and similar, getParameter, getUrl and so on */
/*reqTemplateLocal->PrototypeTemplate()->SetAccessor(String::NewFromUtf8(isolate, "url"), Request::url);
reqTemplateLocal->PrototypeTemplate()->SetAccessor(String::NewFromUtf8(isolate, "method"), Request::method);*/
// Request template (do we need to clone this?)
/* We do clone every request object, we could share them, they are illegal to use outside the function anyways */
Local<FunctionTemplate> reqTemplateLocal = FunctionTemplate::New(isolate);
reqTemplateLocal->SetClassName(String::NewFromUtf8(isolate, "uWS.HttpRequest"));
reqTemplateLocal->InstanceTemplate()->SetInternalFieldCount(1);
reqTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getHeader"), FunctionTemplate::New(isolate, req_getHeader));
/* Register our functions */
reqTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getHeader"), FunctionTemplate::New(isolate, req_getHeader));
reqTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getParameter"), FunctionTemplate::New(isolate, req_getParameter));
reqTemplateLocal->PrototypeTemplate()->Set(String::NewFromUtf8(isolate, "getUrl"), FunctionTemplate::New(isolate, req_getUrl));
/* Create the template */
Local<Object> reqObjectLocal = reqTemplateLocal->GetFunction()->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
reqTemplate.Reset(isolate, reqObjectLocal);
}
//template <class APP>
static Local<Object> getReqInstance() {
return Local<Object>::New(isolate, reqTemplate)->Clone();
}
};
Persistent<Object> HttpRequestWrapper::reqTemplate;

View File

@ -84,7 +84,7 @@ void Main(Local<Object> exports) {
initResTemplate<1>();
/* Init a shared request object */
initReqTemplate();
HttpRequestWrapper::initReqTemplate();
}
/* This is required when building as a Node.js addon */