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:
		| @@ -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); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user