JD2022-TU1/main/phone_apps/JDCompanionApp/Assets/Scripts/Online/HttpEngine_BestHTTP.cs

93 lines
3.3 KiB
C#

using System.Text;
using BestHTTP;
using LightJSON;
using uPromise;
using UnityEngine;
namespace Online
{
public class HttpEngine_BestHTTP : IHttpEngine
{
public Promise<HttpResponse> Execute(HttpRequest request)
{
var deferred = new Deferred<HttpResponse>();
var postData = (request.PostData != null) ? Encoding.UTF8.GetBytes(JSON.Stringify(request.PostData)) : null;
var httpRequest = new HTTPRequest(new System.Uri(request.Url), convertHttpMethod(request.Method), (req, res) =>
{
if (req.State == HTTPRequestStates.Finished)
{
if (!res.IsSuccess && request.FailFromStatusCode)
{
Debug.LogError("[HTTP] " + request.Method.ToString().ToUpper() + " " + request.Url + " (" + res.StatusCode + "): " + res.DataAsText);
var HTTPStateStatusCode = new HTTPReqStateStatusCode(req.State, res.StatusCode);
deferred.Reject(HTTPStateStatusCode);
return;
}
HttpResponse response = new HttpResponse();
response.StatusCode = res.StatusCode;
foreach (var header in res.Headers)
{
response.Headers.Add(header.Key, header.Value[0]);
}
response.Body = res.DataAsText != null ? JSON.Parse(res.DataAsText) : null;
deferred.Resolve(response);
}
else
{
Debug.LogError("[HTTP] " + request.Method.ToString().ToUpper() + " " + request.Url + " (" + req.State + ")");
var HTTPStateStatusCode = new HTTPReqStateStatusCode(req.State, -1);
deferred.Reject(HTTPStateStatusCode);
}
});
httpRequest.Timeout = OnlineEngine.TimeoutDisconnection;
foreach (var header in request.Headers)
httpRequest.AddHeader(header.Key, header.Value);
if (postData != null)
{
httpRequest.RawData = postData;
httpRequest.AddHeader("Content-Type", "application/json");
}
httpRequest.Send();
return deferred.Promise;
}
public class HTTPReqStateStatusCode
{
public HTTPRequestStates reqState;
public int statusCode;
public HTTPReqStateStatusCode(HTTPRequestStates reqState, int statusCode)
{
this.reqState = reqState;
this.statusCode = statusCode;
}
}
// convert from HttpMethod (defined in IHttpEngine) to the equivalent BestHTTP enum
private HTTPMethods convertHttpMethod(HttpMethod method)
{
switch (method)
{
case HttpMethod.Get: return HTTPMethods.Get;
case HttpMethod.Post: return HTTPMethods.Post;
case HttpMethod.Put: return HTTPMethods.Put;
case HttpMethod.Delete: return HTTPMethods.Delete;
}
Debug.Assert(false, "Invalid HTTP method!");
return HTTPMethods.Get;
}
}
}