Skip to content

Commit 241807b

Browse files
Update UnityWebGLHttpClientService to differentiate request failure reasons
1 parent 4fcc02d commit 241807b

File tree

3 files changed

+74
-33
lines changed

3 files changed

+74
-33
lines changed
Binary file not shown.

PubNubUnity/Assets/PubNub/Runtime/Util/PNConfigAsset.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class PNConfigAsset : ScriptableObject {
1818
public bool MaintainPresenceState = true;
1919
public bool EnableEventEngine = true;
2020
public bool EnableWebGLBuildMode;
21-
public bool LogToUnityConsole;
21+
public bool LogToUnityConsole = true;
2222
public PNLogVerbosity LogVerbosity;
2323

2424
[SerializeField] private bool externalJsonEnabled = false;

PubNubUnity/Assets/PubNub/Runtime/Util/UnityWebGLHttpClientService.cs

+73-32
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Threading;
45
using System.Threading.Tasks;
56
using UnityEngine;
67
using UnityEngine.Networking;
@@ -11,6 +12,13 @@ namespace PubnubApi.Unity {
1112
/// This is an implementation of the PubNub Transport Layer created for Web GL builds compatibility
1213
/// </summary>
1314
public class UnityWebGLHttpClientService : IHttpClientService {
15+
16+
private PubnubLogModule logger;
17+
18+
public void SetLogger(PubnubLogModule logger) {
19+
this.logger = logger;
20+
}
21+
1422
private TransportResponse UnityRequestToResponse(UnityWebRequest request) {
1523
return new TransportResponse() {
1624
StatusCode = (int)request.responseCode,
@@ -35,11 +43,52 @@ private void PrepareUnityRequest(UnityWebRequest request, TransportRequest trans
3543
}
3644
}
3745

46+
private TransportResponse GetTransportResponseForRequestException(Exception exception, TransportRequest transportRequest,
47+
UnityWebRequest requestWithTimeout)
48+
{
49+
if (requestWithTimeout == null) {
50+
logger?.Error($"HttpClient Service: UnityWebRequest for url {transportRequest.RequestUrl} was null!");
51+
return new TransportResponse()
52+
{
53+
RequestUrl = transportRequest.RequestUrl,
54+
Error = exception,
55+
};
56+
}
57+
58+
TransportResponse transportResponse;
59+
if (exception is TaskCanceledException taskCanceledException) {
60+
logger?.Error($"HttpClient Service: TaskCanceledException for url {transportRequest.RequestUrl}");
61+
transportResponse = new TransportResponse()
62+
{
63+
RequestUrl = transportRequest.RequestUrl,
64+
Error = taskCanceledException,
65+
};
66+
logger?.Debug("HttpClient Service: Task cancelled due to cancellation request");
67+
transportResponse.IsCancelled = true;
68+
} else {
69+
logger?.Error(
70+
$"HttpClient Service: Exception for http call url {transportRequest.RequestUrl}, exception message: {exception.Message}, stacktrace: {exception.StackTrace}");
71+
transportResponse = new TransportResponse() {
72+
RequestUrl = transportRequest.RequestUrl,
73+
Error = exception
74+
};
75+
//Apparently error.Contains("Request timeout") is the only way to determine if request timed out
76+
if (!string.IsNullOrEmpty(requestWithTimeout.error) && requestWithTimeout.error.Contains("Request timeout") &&
77+
!transportRequest.CancellationTokenSource.IsCancellationRequested)
78+
{
79+
logger?.Debug("HttpClient Service: Request cancelled due to timeout");
80+
transportResponse.IsTimeOut = true;
81+
}
82+
}
83+
84+
return transportResponse;
85+
}
86+
3887
public async Task<TransportResponse> DeleteRequest(TransportRequest transportRequest) {
88+
var deleteRequest = UnityWebRequest.Delete(transportRequest.RequestUrl);
89+
PrepareUnityRequest(deleteRequest, transportRequest);
3990
TransportResponse response;
4091
try {
41-
var deleteRequest = UnityWebRequest.Delete(transportRequest.RequestUrl);
42-
PrepareUnityRequest(deleteRequest, transportRequest);
4392
var taskCompletionSource = new TaskCompletionSource<TransportResponse>();
4493
transportRequest.CancellationTokenSource.Token.Register(() => {
4594
deleteRequest.Abort();
@@ -50,20 +99,18 @@ public async Task<TransportResponse> DeleteRequest(TransportRequest transportReq
5099
};
51100
response = await taskCompletionSource.Task.ConfigureAwait(false);
52101
} catch (Exception ex) {
53-
Debug.LogError($"DELETE Error: {ex}");
54-
response = new TransportResponse() {
55-
RequestUrl = transportRequest.RequestUrl,
56-
Error = ex
57-
};
102+
response = GetTransportResponseForRequestException(ex, transportRequest, deleteRequest);
103+
} finally {
104+
transportRequest.CancellationTokenSource?.Dispose();
58105
}
59106
return response;
60107
}
61108

62109
public async Task<TransportResponse> GetRequest(TransportRequest transportRequest) {
110+
var getRequest = UnityWebRequest.Get(transportRequest.RequestUrl);
111+
PrepareUnityRequest(getRequest, transportRequest);
63112
TransportResponse response;
64113
try {
65-
var getRequest = UnityWebRequest.Get(transportRequest.RequestUrl);
66-
PrepareUnityRequest(getRequest, transportRequest);
67114
var taskCompletionSource = new TaskCompletionSource<TransportResponse>();
68115
transportRequest.CancellationTokenSource.Token.Register(() => {
69116
getRequest.Abort();
@@ -74,17 +121,16 @@ public async Task<TransportResponse> GetRequest(TransportRequest transportReques
74121
};
75122
response = await taskCompletionSource.Task.ConfigureAwait(false);
76123
} catch (Exception ex) {
77-
Debug.LogError($"GET Error: {ex}");
78-
response = new TransportResponse() {
79-
RequestUrl = transportRequest.RequestUrl,
80-
Error = ex
81-
};
124+
response = GetTransportResponseForRequestException(ex, transportRequest, getRequest);
125+
} finally {
126+
transportRequest.CancellationTokenSource?.Dispose();
82127
}
83128
return response;
84129
}
85130

86131
public async Task<TransportResponse> PostRequest(TransportRequest transportRequest) {
87132
TransportResponse response;
133+
UnityWebRequest postRequest = null;
88134
try {
89135
var formData = new List<IMultipartFormSection>();
90136
if (!string.IsNullOrEmpty(transportRequest.BodyContentString)) {
@@ -93,7 +139,7 @@ public async Task<TransportResponse> PostRequest(TransportRequest transportReque
93139
formData.Add(new MultipartFormDataSection(transportRequest.BodyContentBytes));
94140
}
95141

96-
var postRequest = UnityWebRequest.Post(transportRequest.RequestUrl, formData);
142+
postRequest = UnityWebRequest.Post(transportRequest.RequestUrl, formData);
97143
PrepareUnityRequest(postRequest, transportRequest);
98144
var taskCompletionSource = new TaskCompletionSource<TransportResponse>();
99145
transportRequest.CancellationTokenSource.Token.Register(() => {
@@ -105,19 +151,18 @@ public async Task<TransportResponse> PostRequest(TransportRequest transportReque
105151
};
106152
response = await taskCompletionSource.Task.ConfigureAwait(false);
107153
} catch (Exception ex) {
108-
Debug.LogError($"POST Error: {ex}");
109-
response = new TransportResponse() {
110-
RequestUrl = transportRequest.RequestUrl,
111-
Error = ex
112-
};
154+
response = GetTransportResponseForRequestException(ex, transportRequest, postRequest);
155+
} finally {
156+
transportRequest.CancellationTokenSource?.Dispose();
113157
}
114158
return response;
115159
}
116160

117161
public async Task<TransportResponse> PatchRequest(TransportRequest transportRequest) {
118162
TransportResponse response;
163+
UnityWebRequest patchRequest = null;
119164
try {
120-
UnityWebRequest patchRequest;
165+
121166
if (!string.IsNullOrEmpty(transportRequest.BodyContentString)) {
122167
patchRequest = UnityWebRequest.Put(transportRequest.RequestUrl, transportRequest.BodyContentString);
123168
} else if (transportRequest.BodyContentBytes != null) {
@@ -138,20 +183,18 @@ public async Task<TransportResponse> PatchRequest(TransportRequest transportRequ
138183
};
139184
response = await taskCompletionSource.Task.ConfigureAwait(false);
140185
} catch (Exception ex) {
141-
Debug.LogError($"PATCH Error: {ex}");
142-
response = new TransportResponse() {
143-
RequestUrl = transportRequest.RequestUrl,
144-
Error = ex
145-
};
186+
response = GetTransportResponseForRequestException(ex, transportRequest, patchRequest);
187+
} finally {
188+
transportRequest.CancellationTokenSource?.Dispose();
146189
}
147190

148191
return response;
149192
}
150193

151194
public async Task<TransportResponse> PutRequest(TransportRequest transportRequest) {
195+
UnityWebRequest putRequest = null;
152196
TransportResponse response;
153197
try {
154-
UnityWebRequest putRequest;
155198
if (!string.IsNullOrEmpty(transportRequest.BodyContentString)) {
156199
putRequest = UnityWebRequest.Put(transportRequest.RequestUrl, transportRequest.BodyContentString);
157200
} else if (transportRequest.BodyContentBytes != null) {
@@ -171,11 +214,9 @@ public async Task<TransportResponse> PutRequest(TransportRequest transportReques
171214
};
172215
response = await taskCompletionSource.Task.ConfigureAwait(false);
173216
} catch (Exception ex) {
174-
Debug.LogError($"PUT Error: {ex}");
175-
response = new TransportResponse() {
176-
RequestUrl = transportRequest.RequestUrl,
177-
Error = ex
178-
};
217+
response = GetTransportResponseForRequestException(ex, transportRequest, putRequest);
218+
} finally {
219+
transportRequest.CancellationTokenSource?.Dispose();
179220
}
180221

181222
return response;

0 commit comments

Comments
 (0)