2022-06-21 12:48:14 +00:00
|
|
|
extends Control
|
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
var mime_types := MimeTypeHelper.generate_db()
|
2022-06-21 12:48:14 +00:00
|
|
|
|
|
|
|
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:
|
2022-06-25 08:56:45 +00:00
|
|
|
if dir.list_dir_begin() != OK:
|
|
|
|
# TODO: show error to user here
|
|
|
|
return
|
2022-06-21 12:48:14 +00:00
|
|
|
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"])
|
|
|
|
|
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
if _server.listen(port) != OK:
|
|
|
|
# TODO: show error to user here
|
|
|
|
return
|
2022-06-21 12:48:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
func _stop_server() -> void:
|
|
|
|
if _server:
|
|
|
|
_server = null
|
|
|
|
|
|
|
|
|
|
|
|
func _process(_delta: float) -> void:
|
|
|
|
if _server == null:
|
|
|
|
return
|
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
if not _server.take_connection():
|
|
|
|
# TODO: show error to user here
|
|
|
|
return
|
2022-06-21 12:48:14 +00:00
|
|
|
|
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
func _serve_file(_request: HTTPServer.Request, response: HTTPServer.Response, binds: Array) -> void:
|
2022-06-21 12:48:14 +00:00
|
|
|
var file_name: String = binds[0] as String
|
|
|
|
print(file_name)
|
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
var f := File.new()
|
|
|
|
var success = f.open("res://server_files/%s" % file_name, File.READ)
|
2022-06-21 12:48:14 +00:00
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
if success == OK:
|
2022-06-21 12:48:14 +00:00
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
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())
|
2022-06-21 12:48:14 +00:00
|
|
|
|
2022-06-25 08:56:45 +00:00
|
|
|
response.data(data)
|
|
|
|
|
|
|
|
else:
|
|
|
|
response.header("content-type", "text/plain")
|
|
|
|
response.data("500 - Read Error")
|
2022-06-21 12:48:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
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"
|