Files
rudder-unity-sdk/Packages/rudder.sdk/Runtime/Sources/Platform/UnityTransportAdapter.cs
T
2026-08-12 14:03:44 +03:00

92 lines
2.5 KiB
C#

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RudderSdk.Core;
using RudderSdk.Core.Abstractions;
using RudderSdk.Core.Models;
namespace RudderSdk.Unity
{
internal class UnityTransportAdapter : IRudderTransport
{
private readonly string _baseUrl;
private readonly IUnityRequestExecutor _executor;
public UnityTransportAdapter(string baseUrl, IUnityRequestExecutor executor)
{
_baseUrl = baseUrl.TrimEnd('/');
_executor = executor;
}
public async Task<TResponse> SendAsync<TRequest, TResponse>(
string method,
string path,
TRequest request,
string accessToken,
CancellationToken cancellationToken = default)
{
var headers = new Dictionary<string, string>
{
["Content-Type"] = "application/json"
};
if (!string.IsNullOrEmpty(accessToken))
headers["Authorization"] = "Bearer " + accessToken;
var body = request != null ? JsonConvert.SerializeObject(request) : null;
string responseJson;
try
{
responseJson = await _executor.SendAsync(
method, _baseUrl + path, body, headers, cancellationToken).ConfigureAwait(false);
}
catch (UnityRequestException exception)
{
throw MapError(exception);
}
if (string.IsNullOrEmpty(responseJson))
return default;
return JsonConvert.DeserializeObject<TResponse>(responseJson);
}
private static RudderApiException MapError(UnityRequestException exception)
{
string code = null;
string message = null;
string requestId = null;
if (!string.IsNullOrEmpty(exception.ResponseBody))
{
try
{
var error = JsonConvert.DeserializeObject<ErrorResponse>(exception.ResponseBody);
code = error?.Code;
message = error?.Error;
requestId = error?.RequestId;
}
catch (JsonException)
{
}
}
if (string.IsNullOrEmpty(message))
message = exception.Message;
switch (exception.StatusCode)
{
case 401:
return new RudderAuthException(exception.StatusCode, code, message, requestId);
case 404:
return new RudderNotFoundException(exception.StatusCode, code, message, requestId);
case 429:
return new RudderRateLimitException(exception.StatusCode, code, message, requestId);
default:
return new RudderApiException(exception.StatusCode, code, message, requestId);
}
}
}
}