Browse Source

refactor: HTTPUtils.fetch

Bryan Lee 1 year ago
parent
commit
159e0c857f

File diff suppressed because it is too large
+ 0 - 0
project/export_presets.cfg


+ 1 - 0
project/project.godot

@@ -19,6 +19,7 @@ config/icon="res://icon.svg"
 [autoload]
 
 Program="*res://program.gd"
+HTTPUtils="*res://utils/http_utils.gd"
 RPCUtils="*res://utils/rpc_utils.gd"
 ServiceManager="*res://services/service_manager.gd"
 Authentication="*res://authentication/authentication.gd"

+ 10 - 28
project/services/web_oauth2/web_oauth2_service.gd

@@ -98,36 +98,18 @@ func get_user_info() -> Result:
 	if access_token_result.is_none():
 		return Result.Err("access_token not loaded")
 	var access_token = access_token_result.unwrap()
-
-
-	var http_request := HTTPRequest.new()
-	http_request.accept_gzip = false
-	add_child(http_request)
-
-	var request_handler := Promise.new(func(resolve, reject):
-		http_request.request_completed.connect(func (
-			result: int,
-			response_code: int,
-			_headers: PackedStringArray,
-			body: PackedByteArray,
-		):
-			http_request.queue_free()
-			if result != HTTPRequest.RESULT_SUCCESS:
-				return reject.call("unsuccessful http request: %s" % result)
-			if response_code != HTTPClient.RESPONSE_OK:
-				return reject.call("non-200 response code received: %s" % response_code)
-			var body_text := body.get_string_from_utf8()
-			var body_json = JSON.parse_string(body_text)
-			return resolve.call(body_json)
-		)
-	)
-
-	var request_result := Result.from_gderr(http_request.request(
+	
+	var request_result: Result = await HTTPUtils.fetch(
 		USER_INFO_REQUEST_URI, ["Authorization: Bearer %s" % access_token]
-	))
-
+	).settled
+	
 	if request_result.is_err():
 		push_error(request_result.unwrap_err())
 		return request_result
 	
-	return await request_handler.settled
+	var response = request_result.unwrap()
+	if response.response_code != HTTPClient.RESPONSE_OK:
+		return Result.Err("failed to get data from Google's user info endpoint: %s" % response.response_code)
+	
+	var body_text: String = response.body.get_string_from_utf8()
+	return Result.Ok(JSON.parse_string(body_text))

+ 52 - 0
project/utils/http_utils.gd

@@ -0,0 +1,52 @@
+extends Node
+
+
+## [codeblock]
+## @returns Promise<Response {
+##   result: HTTPRequest.Result
+##   response_code: HTTPClient.ResponseCode
+##   headers: PackedStringArray
+##   body: PackedByteArray
+## }, String>
+## [/codeblock]
+func fetch(
+	url: String,
+	req_headers: PackedStringArray = PackedStringArray(),
+	method: HTTPClient.Method = HTTPClient.METHOD_GET,
+	req_data: String = "",
+) -> Promise:
+	var http_request := HTTPRequest.new()
+	if OS.has_feature("web"):
+		## HTML5 exports fail to decompress gzip payloads.
+		http_request.accept_gzip = false
+	add_child(http_request)
+	
+	var request_handler := Promise.new(func(resolve, reject):
+		http_request.request_completed.connect(func (
+			result: HTTPRequest.Result,
+			response_code: HTTPClient.ResponseCode,
+			headers: PackedStringArray,
+			body: PackedByteArray,
+		):
+			http_request.queue_free()
+			if result != HTTPRequest.RESULT_SUCCESS:
+				return reject.call("unsuccessful http request: %s" % result)
+			return resolve.call({
+				"result": result,
+				"response_code": response_code,
+				"headers": headers,
+				"body": body,
+			}),
+			CONNECT_ONE_SHOT,
+		)
+	)
+	
+	var request_result := Result.from_gderr(http_request.request(
+		url, req_headers, method, req_data
+	))
+
+	if request_result.is_err():
+		push_error(request_result.unwrap_err())
+		return request_result.to_promise()
+	
+	return request_handler

Some files were not shown because too many files changed in this diff