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

58 lines
1.7 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using RudderSdk.Core;
using RudderSdk.Core.Abstractions;
using UnityEngine.Networking;
namespace RudderSdk.Unity
{
internal sealed class UnityUploadTransport : IUploadTransport
{
private const int DefaultTimeoutSeconds = 10;
private readonly int _timeoutSeconds;
public UnityUploadTransport(int timeoutSeconds = DefaultTimeoutSeconds)
{
_timeoutSeconds = timeoutSeconds > 0 ? timeoutSeconds : DefaultTimeoutSeconds;
}
public async Task PutAsync(string url, byte[] data, string contentType, CancellationToken cancellationToken = default)
{
using (var request = UnityWebRequest.Put(url, data ?? System.Array.Empty<byte>()))
{
if (!string.IsNullOrEmpty(contentType))
request.SetRequestHeader("Content-Type", contentType);
request.timeout = _timeoutSeconds;
var operation = request.SendWebRequest();
var completion = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
operation.completed += _ => completion.TrySetResult(true);
using (cancellationToken.Register(() =>
{
request.Abort();
completion.TrySetCanceled(cancellationToken);
}))
{
await completion.Task.ConfigureAwait(false);
}
if (request.result == UnityWebRequest.Result.ConnectionError)
{
throw new RudderNetworkException(request.error);
}
if (request.result == UnityWebRequest.Result.ProtocolError)
{
throw new RudderApiException(
(int)request.responseCode,
string.Empty,
request.error + ": " + request.downloadHandler?.text);
}
}
}
}
}