forked from cory/tildefriends
core: Get rid of the httpd JS object. Potential progress on #108.
This commit is contained in:
parent
8104f6f228
commit
5bba5776b3
@ -47,7 +47,6 @@ static const char* _make_set_session_cookie_header(tf_http_request_t* request, c
|
|||||||
const char** _form_data_decode(const char* data, int length);
|
const char** _form_data_decode(const char* data, int length);
|
||||||
const char* _form_data_get(const char** form_data, const char* key);
|
const char* _form_data_get(const char** form_data, const char* key);
|
||||||
|
|
||||||
static JSClassID _httpd_class_id;
|
|
||||||
static JSClassID _httpd_request_class_id;
|
static JSClassID _httpd_request_class_id;
|
||||||
|
|
||||||
typedef struct _http_user_data_t
|
typedef struct _http_user_data_t
|
||||||
@ -538,12 +537,6 @@ static const char* _ext_to_content_type(const char* ext, bool use_fallback)
|
|||||||
return use_fallback ? "application/binary" : NULL;
|
return use_fallback ? "application/binary" : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _httpd_finalizer(JSRuntime* runtime, JSValue value)
|
|
||||||
{
|
|
||||||
tf_http_t* http = JS_GetOpaque(value, _httpd_class_id);
|
|
||||||
tf_http_destroy(http);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _httpd_request_finalizer(JSRuntime* runtime, JSValue value)
|
static void _httpd_request_finalizer(JSRuntime* runtime, JSValue value)
|
||||||
{
|
{
|
||||||
tf_http_request_t* request = JS_GetOpaque(value, _httpd_request_class_id);
|
tf_http_request_t* request = JS_GetOpaque(value, _httpd_request_class_id);
|
||||||
@ -2362,16 +2355,7 @@ static const char* _httpd_read_file(tf_task_t* task, const char* path)
|
|||||||
|
|
||||||
void tf_httpd_register(JSContext* context)
|
void tf_httpd_register(JSContext* context)
|
||||||
{
|
{
|
||||||
JS_NewClassID(&_httpd_class_id);
|
|
||||||
JS_NewClassID(&_httpd_request_class_id);
|
JS_NewClassID(&_httpd_request_class_id);
|
||||||
JSClassDef httpd_def = {
|
|
||||||
.class_name = "Httpd",
|
|
||||||
.finalizer = &_httpd_finalizer,
|
|
||||||
};
|
|
||||||
if (JS_NewClass(JS_GetRuntime(context), _httpd_class_id, &httpd_def) != 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "Failed to register Httpd.\n");
|
|
||||||
}
|
|
||||||
JSClassDef request_def = {
|
JSClassDef request_def = {
|
||||||
.class_name = "Request",
|
.class_name = "Request",
|
||||||
.finalizer = &_httpd_request_finalizer,
|
.finalizer = &_httpd_request_finalizer,
|
||||||
@ -2382,14 +2366,19 @@ void tf_httpd_register(JSContext* context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
JSValue global = JS_GetGlobalObject(context);
|
JSValue global = JS_GetGlobalObject(context);
|
||||||
JSValue httpd = JS_NewObjectClass(context, _httpd_class_id);
|
JSValue httpd = JS_NewObject(context);
|
||||||
|
JS_SetPropertyStr(context, httpd, "auth_query", JS_NewCFunction(context, _httpd_auth_query, "auth_query", 1));
|
||||||
|
JS_SetPropertyStr(context, global, "httpd", httpd);
|
||||||
|
JS_FreeValue(context, global);
|
||||||
|
}
|
||||||
|
|
||||||
|
tf_http_t* tf_httpd_create(JSContext* context)
|
||||||
|
{
|
||||||
tf_task_t* task = tf_task_get(context);
|
tf_task_t* task = tf_task_get(context);
|
||||||
tf_ssb_t* ssb = tf_task_get_ssb(task);
|
tf_ssb_t* ssb = tf_task_get_ssb(task);
|
||||||
uv_loop_t* loop = tf_task_get_loop(task);
|
uv_loop_t* loop = tf_task_get_loop(task);
|
||||||
tf_http_t* http = tf_http_create(loop);
|
tf_http_t* http = tf_http_create(loop);
|
||||||
tf_http_set_trace(http, tf_task_get_trace(task));
|
tf_http_set_trace(http, tf_task_get_trace(task));
|
||||||
JS_SetOpaque(httpd, http);
|
|
||||||
|
|
||||||
int64_t http_port = 0;
|
int64_t http_port = 0;
|
||||||
int64_t https_port = 0;
|
int64_t https_port = 0;
|
||||||
@ -2454,10 +2443,6 @@ void tf_httpd_register(JSContext* context)
|
|||||||
|
|
||||||
tf_http_add_handler(http, "/app/socket", _httpd_endpoint_app_socket, NULL, task);
|
tf_http_add_handler(http, "/app/socket", _httpd_endpoint_app_socket, NULL, task);
|
||||||
|
|
||||||
JS_SetPropertyStr(context, httpd, "auth_query", JS_NewCFunction(context, _httpd_auth_query, "auth_query", 1));
|
|
||||||
JS_SetPropertyStr(context, global, "httpd", httpd);
|
|
||||||
JS_FreeValue(context, global);
|
|
||||||
|
|
||||||
if (http_port > 0 || *out_http_port_file)
|
if (http_port > 0 || *out_http_port_file)
|
||||||
{
|
{
|
||||||
httpd_listener_t* listener = tf_malloc(sizeof(httpd_listener_t));
|
httpd_listener_t* listener = tf_malloc(sizeof(httpd_listener_t));
|
||||||
@ -2502,4 +2487,10 @@ void tf_httpd_register(JSContext* context)
|
|||||||
tf_free((char*)private_key);
|
tf_free((char*)private_key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return http;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tf_httpd_destroy(tf_http_t* http)
|
||||||
|
{
|
||||||
|
tf_http_destroy(http);
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
#include "quickjs.h"
|
#include "quickjs.h"
|
||||||
|
|
||||||
|
typedef struct _tf_http_t tf_http_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
** Register the HTTP script interface. Also registers a number of built-in
|
** Register the HTTP script interface. Also registers a number of built-in
|
||||||
** request handlers. An ongoing project is to move the JS request handlers
|
** request handlers. An ongoing project is to move the JS request handlers
|
||||||
@ -21,4 +23,16 @@
|
|||||||
*/
|
*/
|
||||||
void tf_httpd_register(JSContext* context);
|
void tf_httpd_register(JSContext* context);
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Create the HTTP server instance.
|
||||||
|
** @param context The JS context.
|
||||||
|
*/
|
||||||
|
tf_http_t* tf_httpd_create(JSContext* context);
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Destroy the HTTP server instance.
|
||||||
|
** @param http The HTTP server instance.
|
||||||
|
*/
|
||||||
|
void tf_httpd_destroy(tf_http_t* http);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
11
src/task.c
11
src/task.c
@ -128,6 +128,7 @@ typedef struct _tf_task_t
|
|||||||
sqlite3* _db;
|
sqlite3* _db;
|
||||||
|
|
||||||
tf_ssb_t* _ssb;
|
tf_ssb_t* _ssb;
|
||||||
|
tf_http_t* _http;
|
||||||
|
|
||||||
tf_trace_t* _trace;
|
tf_trace_t* _trace;
|
||||||
|
|
||||||
@ -1756,6 +1757,7 @@ void tf_task_activate(tf_task_t* task)
|
|||||||
JS_SetPropertyStr(context, global, "getStats", JS_NewCFunction(context, _tf_task_getStats, "getStats", 0));
|
JS_SetPropertyStr(context, global, "getStats", JS_NewCFunction(context, _tf_task_getStats, "getStats", 0));
|
||||||
|
|
||||||
tf_httpd_register(context);
|
tf_httpd_register(context);
|
||||||
|
task->_http = tf_httpd_create(context);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1868,13 +1870,10 @@ void tf_task_destroy(tf_task_t* task)
|
|||||||
{
|
{
|
||||||
tf_ssb_destroy(task->_ssb);
|
tf_ssb_destroy(task->_ssb);
|
||||||
}
|
}
|
||||||
|
if (task->_http)
|
||||||
/* This ensures the HTTP handlers get cleaned up. */
|
|
||||||
if (task->_trusted)
|
|
||||||
{
|
{
|
||||||
JSValue global = JS_GetGlobalObject(task->_context);
|
tf_httpd_destroy(task->_http);
|
||||||
JS_SetPropertyStr(task->_context, global, "httpd", JS_UNDEFINED);
|
task->_http = NULL;
|
||||||
JS_FreeValue(task->_context, global);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_FreeContext(task->_context);
|
JS_FreeContext(task->_context);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user