forked from cory/tildefriends
Add a runtime switch between httpd implementions. One of which is totally not hooked up yet.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4685 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
58e75ee276
commit
f9940fc436
@ -952,8 +952,9 @@ function stringResponse(response, data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loadSettings().then(function() {
|
loadSettings().then(function() {
|
||||||
httpd.all("/login", auth.handler);
|
let httpd_impl = (tildefriends.args.httpdc ? httpdc : httpd);
|
||||||
httpd.all("", function(request, response) {
|
httpd_impl.all("/login", auth.handler);
|
||||||
|
httpd_impl.all("", function(request, response) {
|
||||||
let match;
|
let match;
|
||||||
if (request.uri === "/" || request.uri === "") {
|
if (request.uri === "/" || request.uri === "") {
|
||||||
try {
|
try {
|
||||||
@ -1003,7 +1004,8 @@ loadSettings().then(function() {
|
|||||||
return response.end(data);
|
return response.end(data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
httpd.registerSocketHandler("/app/socket", app.socket);
|
httpd_impl.registerSocketHandler("/app/socket", app.socket);
|
||||||
|
httpd_impl.start();
|
||||||
}).catch(function(error) {
|
}).catch(function(error) {
|
||||||
print('Failed to load settings.');
|
print('Failed to load settings.');
|
||||||
printError({print: print}, error);
|
printError({print: print}, error);
|
||||||
|
119
core/httpd.js
119
core/httpd.js
@ -521,73 +521,76 @@ function handleConnection(client) {
|
|||||||
let kBacklog = 8;
|
let kBacklog = 8;
|
||||||
let kHost = platform() == 'haiku' ? 'localhost' : '::';
|
let kHost = platform() == 'haiku' ? 'localhost' : '::';
|
||||||
|
|
||||||
let socket = new Socket();
|
function start() {
|
||||||
socket.bind(kHost, tildefriends.http_port).then(function(port) {
|
print('ACTUAL START');
|
||||||
print("bound to", port);
|
let socket = new Socket();
|
||||||
print("checking", tildefriends.args.out_http_port_file);
|
socket.bind(kHost, tildefriends.http_port).then(function(port) {
|
||||||
if (tildefriends.args.out_http_port_file) {
|
print("bound to", port);
|
||||||
print("going to write the file");
|
print("checking", tildefriends.args.out_http_port_file);
|
||||||
File.writeFile(tildefriends.args.out_http_port_file, port.toString() + '\n').then(function(r) {
|
if (tildefriends.args.out_http_port_file) {
|
||||||
print("wrote port file", tildefriends.args.out_http_port_file, r);
|
print("going to write the file");
|
||||||
}).catch(function() {
|
File.writeFile(tildefriends.args.out_http_port_file, port.toString() + '\n').then(function(r) {
|
||||||
print("failed to write port file");
|
print("wrote port file", tildefriends.args.out_http_port_file, r);
|
||||||
});
|
}).catch(function() {
|
||||||
}
|
print("failed to write port file");
|
||||||
let listenResult = socket.listen(kBacklog, async function() {
|
});
|
||||||
try {
|
|
||||||
let client = await socket.accept();
|
|
||||||
client.noDelay = true;
|
|
||||||
handleConnection(client);
|
|
||||||
} catch (error) {
|
|
||||||
logError("[" + new Date() + "] accept error " + error);
|
|
||||||
}
|
}
|
||||||
});
|
let listenResult = socket.listen(kBacklog, async function() {
|
||||||
}).catch(function(error) {
|
|
||||||
logError("[" + new Date() + "] bind error " + error);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (tildefriends.https_port) {
|
|
||||||
let tls = {};
|
|
||||||
let secureSocket = new Socket();
|
|
||||||
secureSocket.bind(kHost, tildefriends.https_port).then(function() {
|
|
||||||
return secureSocket.listen(kBacklog, async function() {
|
|
||||||
try {
|
try {
|
||||||
let client = await secureSocket.accept();
|
let client = await socket.accept();
|
||||||
client.noDelay = true;
|
client.noDelay = true;
|
||||||
client.tls = true;
|
|
||||||
const kCertificatePath = "data/httpd/certificate.pem";
|
|
||||||
const kPrivateKeyPath = "data/httpd/privatekey.pem";
|
|
||||||
|
|
||||||
let stat = await Promise.all([
|
|
||||||
await File.stat(kCertificatePath),
|
|
||||||
await File.stat(kPrivateKeyPath),
|
|
||||||
]);
|
|
||||||
if (!tls.context ||
|
|
||||||
tls.certStat.mtime != stat[0].mtime ||
|
|
||||||
tls.certStat.size != stat[0].size ||
|
|
||||||
tls.keyStat.mtime != stat[1].mtime ||
|
|
||||||
tls.keyStat.size != stat[1].size) {
|
|
||||||
print("Reloading " + kCertificatePath + " and " + kPrivateKeyPath);
|
|
||||||
let privateKey = utf8Decode(await File.readFile(kPrivateKeyPath));
|
|
||||||
let certificate = utf8Decode(await File.readFile(kCertificatePath));
|
|
||||||
|
|
||||||
tls.context = new TlsContext();
|
|
||||||
tls.context.setPrivateKey(privateKey);
|
|
||||||
tls.context.setCertificate(certificate);
|
|
||||||
tls.certStat = stat[0];
|
|
||||||
tls.keyStat = stat[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
let result = client.startTls(tls.context);
|
|
||||||
handleConnection(client);
|
handleConnection(client);
|
||||||
return result;
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logError("[" + new Date() + "] " + error);
|
logError("[" + new Date() + "] accept error " + error);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}).catch(function(error) {
|
}).catch(function(error) {
|
||||||
logError("[" + new Date() + "] bind error " + error);
|
logError("[" + new Date() + "] bind error " + error);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (tildefriends.https_port) {
|
||||||
|
let tls = {};
|
||||||
|
let secureSocket = new Socket();
|
||||||
|
secureSocket.bind(kHost, tildefriends.https_port).then(function() {
|
||||||
|
return secureSocket.listen(kBacklog, async function() {
|
||||||
|
try {
|
||||||
|
let client = await secureSocket.accept();
|
||||||
|
client.noDelay = true;
|
||||||
|
client.tls = true;
|
||||||
|
const kCertificatePath = "data/httpd/certificate.pem";
|
||||||
|
const kPrivateKeyPath = "data/httpd/privatekey.pem";
|
||||||
|
|
||||||
|
let stat = await Promise.all([
|
||||||
|
await File.stat(kCertificatePath),
|
||||||
|
await File.stat(kPrivateKeyPath),
|
||||||
|
]);
|
||||||
|
if (!tls.context ||
|
||||||
|
tls.certStat.mtime != stat[0].mtime ||
|
||||||
|
tls.certStat.size != stat[0].size ||
|
||||||
|
tls.keyStat.mtime != stat[1].mtime ||
|
||||||
|
tls.keyStat.size != stat[1].size) {
|
||||||
|
print("Reloading " + kCertificatePath + " and " + kPrivateKeyPath);
|
||||||
|
let privateKey = utf8Decode(await File.readFile(kPrivateKeyPath));
|
||||||
|
let certificate = utf8Decode(await File.readFile(kCertificatePath));
|
||||||
|
|
||||||
|
tls.context = new TlsContext();
|
||||||
|
tls.context.setPrivateKey(privateKey);
|
||||||
|
tls.context.setCertificate(certificate);
|
||||||
|
tls.certStat = stat[0];
|
||||||
|
tls.keyStat = stat[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = client.startTls(tls.context);
|
||||||
|
handleConnection(client);
|
||||||
|
return result;
|
||||||
|
} catch (error) {
|
||||||
|
logError("[" + new Date() + "] " + error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}).catch(function(error) {
|
||||||
|
logError("[" + new Date() + "] bind error " + error);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { all, registerSocketHandler };
|
export { all, start, registerSocketHandler };
|
||||||
|
32
src/httpd.js.c
Normal file
32
src/httpd.js.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include "httpd.js.h"
|
||||||
|
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
static JSValue _httpd_all(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
|
{
|
||||||
|
tf_printf("HTTPD_ALL UNIMPLEMENTED\n");
|
||||||
|
return JS_UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static JSValue _httpd_register_socket_handler(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
|
{
|
||||||
|
tf_printf("HTTPD_REGISTER_SOCKET_HANDLER UNIMPLEMENTED\n");
|
||||||
|
return JS_UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static JSValue _httpd_start(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
|
{
|
||||||
|
tf_printf("HTTPD_START UNIMPLEMENTED\n");
|
||||||
|
return JS_UNDEFINED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tf_httpd_register(JSContext* context)
|
||||||
|
{
|
||||||
|
JSValue global = JS_GetGlobalObject(context);
|
||||||
|
JSValue httpd = JS_NewObject(context);
|
||||||
|
JS_SetPropertyStr(context, httpd, "all", JS_NewCFunction(context, _httpd_all, "all", 2));
|
||||||
|
JS_SetPropertyStr(context, httpd, "registerSocketHandler", JS_NewCFunction(context, _httpd_register_socket_handler, "register_socket_handler", 2));
|
||||||
|
JS_SetPropertyStr(context, httpd, "start", JS_NewCFunction(context, _httpd_start, "start", 0));
|
||||||
|
JS_SetPropertyStr(context, global, "httpdc", httpd);
|
||||||
|
JS_FreeValue(context, global);
|
||||||
|
}
|
5
src/httpd.js.h
Normal file
5
src/httpd.js.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "quickjs.h"
|
||||||
|
|
||||||
|
void tf_httpd_register(JSContext* context);
|
@ -3,6 +3,7 @@
|
|||||||
#include "bcrypt.js.h"
|
#include "bcrypt.js.h"
|
||||||
#include "database.js.h"
|
#include "database.js.h"
|
||||||
#include "file.js.h"
|
#include "file.js.h"
|
||||||
|
#include "httpd.js.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "packetstream.h"
|
#include "packetstream.h"
|
||||||
@ -1731,6 +1732,7 @@ void tf_task_activate(tf_task_t* task)
|
|||||||
JS_SetPropertyStr(context, global, "TlsContext", tf_tls_context_register(context));
|
JS_SetPropertyStr(context, global, "TlsContext", tf_tls_context_register(context));
|
||||||
tf_file_register(context);
|
tf_file_register(context);
|
||||||
tf_database_register(context);
|
tf_database_register(context);
|
||||||
|
tf_httpd_register(context);
|
||||||
|
|
||||||
task->_ssb = tf_ssb_create(&task->_loop, task->_context, task->_db_path);
|
task->_ssb = tf_ssb_create(&task->_loop, task->_context, task->_db_path);
|
||||||
tf_ssb_set_trace(task->_ssb, task->_trace);
|
tf_ssb_set_trace(task->_ssb, task->_trace);
|
||||||
|
Loading…
Reference in New Issue
Block a user