Files
2024-09-22 21:45:37 +02:00

127 lines
5.2 KiBLFS
C#

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using Proyecto26.Common;
namespace Proyecto26
{
public static class HttpBase
{
public static IEnumerator CreateRequestAndRetry(RequestHelper options, Action<RequestException, ResponseHelper> callback)
{
var retries = 0;
do
{
using (var request = CreateRequest(options))
{
yield return request.SendWebRequestWithOptions(options);
var response = request.CreateWebResponse();
if (request.IsValidRequest(options))
{
DebugLog(options.EnableDebug, string.Format("RestClient - Response\nUrl: {0}\nMethod: {1}\nStatus: {2}\nResponse: {3}", options.Uri, options.Method, request.responseCode, options.ParseResponseBody ? response.Text : "body not parsed"), false);
callback(null, response);
break;
}
else if (!options.IsAborted && retries < options.Retries)
{
yield return new WaitForSeconds(options.RetrySecondsDelay);
retries++;
if (options.RetryCallback != null)
{
options.RetryCallback(CreateException(options, request), retries);
}
DebugLog(options.EnableDebug, string.Format("RestClient - Retry Request\nUrl: {0}\nMethod: {1}", options.Uri, options.Method), false);
}
else
{
var err = CreateException(options, request);
DebugLog(options.EnableDebug, err, true);
callback(err, response);
break;
}
}
}
while (retries <= options.Retries);
}
private static UnityWebRequest CreateRequest(RequestHelper options)
{
var url = options.Uri.BuildUrl(options.Params);
DebugLog(options.EnableDebug, string.Format("RestClient - Request\nUrl: {0}", url), false);
if (options.FormData is WWWForm && options.Method == UnityWebRequest.kHttpVerbPOST)
{
return UnityWebRequest.Post(url, options.FormData);
}
else
{
return new UnityWebRequest(url, options.Method);
}
}
private static RequestException CreateException(RequestHelper options, UnityWebRequest request)
{
return new RequestException(request.error, request.isHttpError, request.isNetworkError, request.responseCode, options.ParseResponseBody ? request.downloadHandler.text : "body not parsed");
}
private static void DebugLog(bool debugEnabled, object message, bool isError)
{
if (debugEnabled)
{
if (isError)
Debug.LogError(message);
else
Debug.Log(message);
}
}
public static IEnumerator DefaultUnityWebRequest(RequestHelper options, Action<RequestException, ResponseHelper> callback)
{
return CreateRequestAndRetry(options, callback);
}
public static IEnumerator DefaultUnityWebRequest<TResponse>(RequestHelper options, Action<RequestException, ResponseHelper, TResponse> callback)
{
return CreateRequestAndRetry(options, (RequestException err, ResponseHelper res) => {
var body = default(TResponse);
try
{
if (err == null && res.Data != null && options.ParseResponseBody)
body = JsonUtility.FromJson<TResponse>(res.Text);
}
catch (Exception error)
{
DebugLog(options.EnableDebug, string.Format("RestClient - Invalid JSON format\nError: {0}", error.Message), true);
err = new RequestException(error.Message);
}
finally
{
callback(err, res, body);
}
});
}
public static IEnumerator DefaultUnityWebRequest<TResponse>(RequestHelper options, Action<RequestException, ResponseHelper, TResponse[]> callback)
{
return CreateRequestAndRetry(options, (RequestException err, ResponseHelper res) => {
var body = default(TResponse[]);
try
{
if (err == null && res.Data != null && options.ParseResponseBody)
body = JsonHelper.ArrayFromJson<TResponse>(res.Text);
}
catch (Exception error)
{
DebugLog(options.EnableDebug, string.Format("RestClient - Invalid JSON format\nError: {0}", error.Message), true);
err = new RequestException(error.Message);
}
finally
{
callback(err, res, body);
}
});
}
}
}