From 728027702980105d8936ae5b6b9370316969a247 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lera=20Elvo=C3=A9?= Date: Sat, 2 Jul 2022 02:11:29 +0300 Subject: [PATCH] add proper image handling to http server --- Main.gd | 10 ++---- addons/http_server/http_server.gd | 2 +- addons/http_server/response.gd | 51 +++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/Main.gd b/Main.gd index ec5159f..35ee2b9 100644 --- a/Main.gd +++ b/Main.gd @@ -29,7 +29,7 @@ func _start_server(port: int = 3001) -> void: file_name = dir.get_next() continue - print(file_name) +# print(file_name) _server.endpoint(HTTPServer.Method.GET, "/%s" % file_name, funcref(self, "_serve_file"), [file_name]) @@ -64,19 +64,15 @@ func _process(_delta: float) -> void: 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) + response.type(mime) - # variant - # warning-ignore:incompatible_ternary - var data = f.get_as_text() if mime.type == 'text' else f.get_buffer(f.get_len()) + var data = f.get_buffer(f.get_len()) response.data(data) diff --git a/addons/http_server/http_server.gd b/addons/http_server/http_server.gd index e22ee8a..23f3bf5 100644 --- a/addons/http_server/http_server.gd +++ b/addons/http_server/http_server.gd @@ -106,7 +106,7 @@ func __process_connection(connection: StreamPeerTCP) -> void: body = PoolStringArray(body_parts).join("\r\n") var response: Response = __process_request(method, endpoint, headers, body) - connection.put_data(response.to_utf8()) + connection.put_data(response.get_data()) func __process_request(method: String, endpoint: String, headers: Dictionary, body: String) -> Response: diff --git a/addons/http_server/response.gd b/addons/http_server/response.gd index e7d3424..7c09d75 100644 --- a/addons/http_server/response.gd +++ b/addons/http_server/response.gd @@ -11,6 +11,7 @@ var __headers: Dictionary = { # value: Variant, header value } var __status: int = 200 +var __type: MimeTypeHelper.MimeType # Public methods @@ -32,6 +33,10 @@ func status(status: int) -> void: __status = status +func type(type: MimeTypeHelper.MimeType) -> void: + __type = type + + func to_utf8() -> PoolByteArray: var content = PoolStringArray() @@ -45,6 +50,7 @@ func to_utf8() -> PoolByteArray: data = JSON.print(data) __headers['content-length'] = len(data) + __headers["content-type"] = "application/octet-stream" if !__type else __type.full_type for header in __headers: content.append("%s: %s" % [header, String(__headers[header])]) @@ -55,3 +61,48 @@ func to_utf8() -> PoolByteArray: content.append(data) return content.join("\r\n").to_utf8() + + +func get_data() -> PoolByteArray: + var res = __response_headers() + + var data = __data + if !data: + return res + + var type: MimeTypeHelper.MimeType = __type + if !type: + type = MimeTypeHelper.MimeType.new() + + if data is String: # else, assume data is PoolByteArray + data = data.to_utf8() + + res.append_array(data) + + return res + + +# Private methods + +func __response_headers() -> PoolByteArray: + var res = PoolStringArray() + + res.append(Status.code_to_status_line(__status)) + + var data = __data + if !data: + data = Status.code_to_description(__status) + + __headers["content-length"] = len(data) + + __headers["content-type"] = "application/octet-stream" if !__type else __type.full_type + + for header in __headers: + res.append("%s: %s" % [header, String(__headers[header])]) + + res.append("") + + var s = res.join("\r\n") + s = s + "\r\n" + + return s.to_utf8()