extends Control var mime_types := MimeTypeHelper.generate_db() var _server: HTTPServer = null var files: Array = [] func _ready() -> void: _start_server() func _start_server(port: int = 3001) -> void: if _server: return _server = HTTPServer.new() var dir := Directory.new() if dir.open("res://server_files") == OK: if dir.list_dir_begin() != OK: # TODO: show error to user here return var file_name := dir.get_next() while file_name != "": if !dir.current_is_dir(): if file_name.get_extension() == "import": file_name = dir.get_next() continue print(file_name) _server.endpoint(HTTPServer.Method.GET, "/%s" % file_name, funcref(self, "_serve_file"), [file_name]) file_name = dir.get_next() _server.endpoint(HTTPServer.Method.GET, "/", funcref(self, "_serve_file"), ["index.html"]) if _server.listen(port) != OK: # TODO: show error to user here return func _stop_server() -> void: if _server: _server = null 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 print(file_name) var f := File.new() var success = f.open("res://server_files/%s" % file_name, File.READ) if success == OK: var mime := mime_types.get(file_name) response.header("content-type", mime.full_type) # variant # warning-ignore:incompatible_ternary var data = f.get_as_text() if mime.type == 'text' else f.get_buffer(f.get_len()) response.data(data) else: response.header("content-type", "text/plain") response.data("500 - Read Error") func get_mime_type(file_name: String) -> String: var ext := file_name.get_extension().to_lower() return mime_types[ext] if ext in mime_types else "application/octet-stream"