Wrap req.getParameter, req.getUrl
This commit is contained in:
parent
647a6ef12c
commit
80bc15915b
@ -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,
|
||||
|
@ -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};
|
||||
|
@ -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) {
|
||||
NativeString data(args.GetIsolate(), args[0]);
|
||||
char *buf = data.getData(); int length = data.getLength();
|
||||
// todo: refuse all function calls if we are not inside correct callback
|
||||
|
||||
std::string_view header = ((uWS::HttpRequest *) args.Holder()->GetAlignedPointerFromInternalField(0))->getHeader(std::string_view(buf, length));
|
||||
static inline uWS::HttpRequest *getHttpRequest(const FunctionCallbackInfo<Value> &args) {
|
||||
return ((uWS::HttpRequest *) args.Holder()->GetAlignedPointerFromInternalField(0));
|
||||
}
|
||||
|
||||
args.GetReturnValue().Set(String::NewFromUtf8(isolate, header.data(), v8::String::kNormalString, header.length()));
|
||||
}
|
||||
// req.onAbort ?
|
||||
|
||||
void initReqTemplate() {
|
||||
/*reqTemplateLocal->PrototypeTemplate()->SetAccessor(String::NewFromUtf8(isolate, "url"), Request::url);
|
||||
reqTemplateLocal->PrototypeTemplate()->SetAccessor(String::NewFromUtf8(isolate, "method"), Request::method);*/
|
||||
/* 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);
|
||||
|
||||
// Request template (do we need to clone this?)
|
||||
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));
|
||||
args.GetReturnValue().Set(String::NewFromUtf8(isolate, parameter.data(), v8::String::kNormalString, parameter.length()));
|
||||
}
|
||||
|
||||
Local<Object> reqObjectLocal = reqTemplateLocal->GetFunction()->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
|
||||
reqTemplate.Reset(isolate, reqObjectLocal);
|
||||
}
|
||||
/* 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 = getHttpRequest(args)->getHeader(std::string_view(buf, length));
|
||||
|
||||
args.GetReturnValue().Set(String::NewFromUtf8(isolate, header.data(), v8::String::kNormalString, header.length()));
|
||||
}
|
||||
|
||||
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);*/
|
||||
|
||||
/* 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);
|
||||
|
||||
/* 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;
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user