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

127 lines
5.2 KiBLFS
C#

using System.Text;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
namespace Proyecto26.Common
{
public static class Common
{
private const string CONTENT_TYPE_HEADER = "Content-Type";
private const string DEFAULT_CONTENT_TYPE = "application/json";
private static string GetFormSectionsContentType(out byte[] bodyRaw, RequestHelper options)
{
byte[] boundary = UnityWebRequest.GenerateBoundary();
byte[] formSections = UnityWebRequest.SerializeFormSections(options.FormSections, boundary);
byte[] terminate = Encoding.UTF8.GetBytes(string.Concat("\r\n--", Encoding.UTF8.GetString(boundary), "--"));
bodyRaw = new byte[formSections.Length + terminate.Length];
System.Buffer.BlockCopy(formSections, 0, bodyRaw, 0, formSections.Length);
System.Buffer.BlockCopy(terminate, 0, bodyRaw, formSections.Length, terminate.Length);
return string.Concat("multipart/form-data; boundary=", Encoding.UTF8.GetString(boundary));
}
private static void ConfigureWebRequestWithOptions(UnityWebRequest request, byte[] bodyRaw, string contentType, RequestHelper options)
{
#if UNITY_2018_1_OR_NEWER
if (options.CertificateHandler is CertificateHandler)
request.certificateHandler = options.CertificateHandler;
#endif
if (options.UploadHandler is UploadHandler)
request.uploadHandler = options.UploadHandler;
if (bodyRaw != null)
{
request.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
request.uploadHandler.contentType = contentType;
}
if (options.DownloadHandler is DownloadHandler)
{
request.downloadHandler = options.DownloadHandler;
options.ParseResponseBody = (options.DownloadHandler is DownloadHandlerBuffer);
}
else
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
if (!string.IsNullOrEmpty(contentType))
{
request.SetRequestHeader(CONTENT_TYPE_HEADER, contentType);
}
foreach (var header in RestClient.DefaultRequestHeaders)
{
request.SetRequestHeader(header.Key, header.Value);
}
foreach (var header in options.Headers)
{
request.SetRequestHeader(header.Key, header.Value);
}
if (options.Timeout.HasValue)
{
request.timeout = options.Timeout.Value;
}
if (options.ChunkedTransfer.HasValue)
{
request.chunkedTransfer = options.ChunkedTransfer.Value;
}
if (options.UseHttpContinue.HasValue)
{
request.useHttpContinue = options.UseHttpContinue.Value;
}
if (options.RedirectLimit.HasValue)
{
request.redirectLimit = options.RedirectLimit.Value;
}
options.Request = request;
}
/// <summary>
/// Send the web request to the server
/// </summary>
/// <returns>An UnityWebRequestAsyncOperation object.</returns>
/// <param name="request">An UnityWebRequest object.</param>
/// <param name="options">An options object.</param>
public static IEnumerator SendWebRequestWithOptions(this UnityWebRequest request, RequestHelper options)
{
byte[] bodyRaw = options.BodyRaw;
string contentType = string.Empty;
if (!options.Headers.TryGetValue(CONTENT_TYPE_HEADER, out contentType) && options.DefaultContentType)
{
contentType = DEFAULT_CONTENT_TYPE;
}
if (options.Body != null || !string.IsNullOrEmpty(options.BodyString))
{
var bodyString = options.BodyString;
if (options.Body != null)
{
bodyString = JsonUtility.ToJson(options.Body);
}
bodyRaw = Encoding.UTF8.GetBytes(bodyString.ToCharArray());
}
else if (options.SimpleForm != null && options.SimpleForm.Count > 0)
{
bodyRaw = UnityWebRequest.SerializeSimpleForm(options.SimpleForm);
contentType = "application/x-www-form-urlencoded";
}
else if (options.FormSections != null && options.FormSections.Count > 0)
{
contentType = GetFormSectionsContentType(out bodyRaw, options);
}
else if (options.FormData is WWWForm)
{
//The Content-Type header will be copied from the formData parameter
contentType = string.Empty;
}
if (!string.IsNullOrEmpty(options.ContentType))
{
contentType = options.ContentType;
}
ConfigureWebRequestWithOptions(request, bodyRaw, contentType, options);
#if UNITY_2017_2_OR_NEWER
yield return request.SendWebRequest();
#else
yield return request.Send();
#endif
}
}
}