93 lines
3.3 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|