add proper image handling to http server #7
							
								
								
									
										10
									
								
								Main.gd
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								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)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user