1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Linq ;
4
+ using System . Threading ;
4
5
using System . Threading . Tasks ;
5
6
using UnityEngine ;
6
7
using UnityEngine . Networking ;
@@ -11,6 +12,13 @@ namespace PubnubApi.Unity {
11
12
/// This is an implementation of the PubNub Transport Layer created for Web GL builds compatibility
12
13
/// </summary>
13
14
public class UnityWebGLHttpClientService : IHttpClientService {
15
+
16
+ private PubnubLogModule logger ;
17
+
18
+ public void SetLogger ( PubnubLogModule logger ) {
19
+ this . logger = logger ;
20
+ }
21
+
14
22
private TransportResponse UnityRequestToResponse ( UnityWebRequest request ) {
15
23
return new TransportResponse ( ) {
16
24
StatusCode = ( int ) request . responseCode ,
@@ -35,11 +43,52 @@ private void PrepareUnityRequest(UnityWebRequest request, TransportRequest trans
35
43
}
36
44
}
37
45
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
+
38
87
public async Task < TransportResponse > DeleteRequest ( TransportRequest transportRequest ) {
88
+ var deleteRequest = UnityWebRequest . Delete ( transportRequest . RequestUrl ) ;
89
+ PrepareUnityRequest ( deleteRequest , transportRequest ) ;
39
90
TransportResponse response ;
40
91
try {
41
- var deleteRequest = UnityWebRequest . Delete ( transportRequest . RequestUrl ) ;
42
- PrepareUnityRequest ( deleteRequest , transportRequest ) ;
43
92
var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
44
93
transportRequest . CancellationTokenSource . Token . Register ( ( ) => {
45
94
deleteRequest . Abort ( ) ;
@@ -50,20 +99,18 @@ public async Task<TransportResponse> DeleteRequest(TransportRequest transportReq
50
99
} ;
51
100
response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
52
101
} 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 ( ) ;
58
105
}
59
106
return response ;
60
107
}
61
108
62
109
public async Task < TransportResponse > GetRequest ( TransportRequest transportRequest ) {
110
+ var getRequest = UnityWebRequest . Get ( transportRequest . RequestUrl ) ;
111
+ PrepareUnityRequest ( getRequest , transportRequest ) ;
63
112
TransportResponse response ;
64
113
try {
65
- var getRequest = UnityWebRequest . Get ( transportRequest . RequestUrl ) ;
66
- PrepareUnityRequest ( getRequest , transportRequest ) ;
67
114
var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
68
115
transportRequest . CancellationTokenSource . Token . Register ( ( ) => {
69
116
getRequest . Abort ( ) ;
@@ -74,17 +121,16 @@ public async Task<TransportResponse> GetRequest(TransportRequest transportReques
74
121
} ;
75
122
response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
76
123
} 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 ( ) ;
82
127
}
83
128
return response ;
84
129
}
85
130
86
131
public async Task < TransportResponse > PostRequest ( TransportRequest transportRequest ) {
87
132
TransportResponse response ;
133
+ UnityWebRequest postRequest = null ;
88
134
try {
89
135
var formData = new List < IMultipartFormSection > ( ) ;
90
136
if ( ! string . IsNullOrEmpty ( transportRequest . BodyContentString ) ) {
@@ -93,7 +139,7 @@ public async Task<TransportResponse> PostRequest(TransportRequest transportReque
93
139
formData . Add ( new MultipartFormDataSection ( transportRequest . BodyContentBytes ) ) ;
94
140
}
95
141
96
- var postRequest = UnityWebRequest . Post ( transportRequest . RequestUrl , formData ) ;
142
+ postRequest = UnityWebRequest . Post ( transportRequest . RequestUrl , formData ) ;
97
143
PrepareUnityRequest ( postRequest , transportRequest ) ;
98
144
var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
99
145
transportRequest . CancellationTokenSource . Token . Register ( ( ) => {
@@ -105,19 +151,18 @@ public async Task<TransportResponse> PostRequest(TransportRequest transportReque
105
151
} ;
106
152
response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
107
153
} 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 ( ) ;
113
157
}
114
158
return response ;
115
159
}
116
160
117
161
public async Task < TransportResponse > PatchRequest ( TransportRequest transportRequest ) {
118
162
TransportResponse response ;
163
+ UnityWebRequest patchRequest = null ;
119
164
try {
120
- UnityWebRequest patchRequest ;
165
+
121
166
if ( ! string . IsNullOrEmpty ( transportRequest . BodyContentString ) ) {
122
167
patchRequest = UnityWebRequest . Put ( transportRequest . RequestUrl , transportRequest . BodyContentString ) ;
123
168
} else if ( transportRequest . BodyContentBytes != null ) {
@@ -138,20 +183,18 @@ public async Task<TransportResponse> PatchRequest(TransportRequest transportRequ
138
183
} ;
139
184
response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
140
185
} 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 ( ) ;
146
189
}
147
190
148
191
return response ;
149
192
}
150
193
151
194
public async Task < TransportResponse > PutRequest ( TransportRequest transportRequest ) {
195
+ UnityWebRequest putRequest = null ;
152
196
TransportResponse response ;
153
197
try {
154
- UnityWebRequest putRequest ;
155
198
if ( ! string . IsNullOrEmpty ( transportRequest . BodyContentString ) ) {
156
199
putRequest = UnityWebRequest . Put ( transportRequest . RequestUrl , transportRequest . BodyContentString ) ;
157
200
} else if ( transportRequest . BodyContentBytes != null ) {
@@ -171,11 +214,9 @@ public async Task<TransportResponse> PutRequest(TransportRequest transportReques
171
214
} ;
172
215
response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
173
216
} 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 ( ) ;
179
220
}
180
221
181
222
return response ;
0 commit comments