extends Control var mime_types := MimeTypeHelper.generate_db() var _server: HTTPServer = null onready var server_ui := $ServerUI onready var server_dir = server_ui.server_dir func _ready() -> void: pass func _start_server(port: int = 3001) -> void: if _server: return _server = HTTPServer.new() _server.endpoint(HTTPServer.Method.GET, "/", funcref(self, "_serve_file"), ["index.html"]) # this is still needed to make 'localhost:port/' to point to index.html _server.fallback(funcref(self, "_serve_file")) if _server.listen(port) != OK: # TODO: show error to user here return server_ui.is_server_running = true func _stop_server() -> void: if _server: _server.stop() _server = null server_ui.is_server_running = false func _process(_delta: float) -> void: if _server == null: return if not _server.take_connection(): # TODO: show error to user here return func _serve_file(_request: HTTPServer.Request, response: HTTPServer.Response, binds: Array) -> void: var file_name: String = binds[0] as String # TODO: deprecate binds in favor of using the Request.endpoint prop, as for this app's purposes it would be the same as the file name var f := File.new() var success = f.open(server_dir.plus_file(file_name), File.READ) if success == OK: # TODO: handle other errors like file not found var mime := mime_types.get(file_name) response.type(mime) var data = f.get_buffer(f.get_len()) response.data(data) else: response.type(mime_types.get("txt")) response.status(500) response.data("Internal Server Error") func _on_ServerUI_start_server_button_pressed(port: int, new_dir: String) -> void: server_dir = new_dir _start_server(port) func _on_ServerUI_stop_server_button_pressed() -> void: _stop_server() func _on_ServerUI_server_folder_changed(new_path: String) -> void: server_dir = new_path