1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
4
+ using System . Threading . Tasks ;
5
+ using UnityEngine ;
6
+ using UnityEngine . Networking ;
7
+
8
+ namespace PubnubApi . Unity {
9
+
10
+ /// <summary>
11
+ /// This is an implementation of the PubNub Transport Layer created for Web GL builds compatibility
12
+ /// </summary>
13
+ public class UnityWebGLHttpClientService : IHttpClientService {
14
+ private TransportResponse UnityRequestToResponse ( UnityWebRequest request ) {
15
+ return new TransportResponse ( ) {
16
+ StatusCode = ( int ) request . responseCode ,
17
+ Content = request . downloadHandler ? . data ,
18
+ RequestUrl = request . url ,
19
+ Headers = request . GetResponseHeaders ( )
20
+ . ToDictionary (
21
+ x => x . Key ,
22
+ y => ( IEnumerable < string > ) new [ ] { y . Value } )
23
+ } ;
24
+ }
25
+
26
+ private void PrepareUnityRequest ( UnityWebRequest request , TransportRequest transportRequest ) {
27
+ if ( transportRequest . Timeout . HasValue ) {
28
+ request . timeout = ( int ) transportRequest . Timeout . Value . TotalSeconds ;
29
+ }
30
+
31
+ if ( transportRequest . Headers . Keys . Count > 0 ) {
32
+ foreach ( var kvp in transportRequest . Headers ) {
33
+ request . SetRequestHeader ( kvp . Key , kvp . Value ) ;
34
+ }
35
+ }
36
+ }
37
+
38
+ public async Task < TransportResponse > DeleteRequest ( TransportRequest transportRequest ) {
39
+ TransportResponse response ;
40
+ try {
41
+ var deleteRequest = UnityWebRequest . Delete ( transportRequest . RequestUrl ) ;
42
+ PrepareUnityRequest ( deleteRequest , transportRequest ) ;
43
+ var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
44
+ transportRequest . CancellationToken . Register ( ( ) => {
45
+ deleteRequest . Abort ( ) ;
46
+ taskCompletionSource . TrySetCanceled ( ) ;
47
+ } ) ;
48
+ deleteRequest . SendWebRequest ( ) . completed += _ => {
49
+ taskCompletionSource . TrySetResult ( UnityRequestToResponse ( deleteRequest ) ) ;
50
+ } ;
51
+ response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
52
+ } catch ( Exception ex ) {
53
+ Debug . LogError ( $ "DELETE Error: { ex } ") ;
54
+ response = new TransportResponse ( ) {
55
+ RequestUrl = transportRequest . RequestUrl ,
56
+ Error = ex
57
+ } ;
58
+ }
59
+ return response ;
60
+ }
61
+
62
+ public async Task < TransportResponse > GetRequest ( TransportRequest transportRequest ) {
63
+ TransportResponse response ;
64
+ try {
65
+ var getRequest = UnityWebRequest . Get ( transportRequest . RequestUrl ) ;
66
+ PrepareUnityRequest ( getRequest , transportRequest ) ;
67
+ var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
68
+ transportRequest . CancellationToken . Register ( ( ) => {
69
+ getRequest . Abort ( ) ;
70
+ taskCompletionSource . TrySetCanceled ( ) ;
71
+ } ) ;
72
+ getRequest . SendWebRequest ( ) . completed += _ => {
73
+ taskCompletionSource . TrySetResult ( UnityRequestToResponse ( getRequest ) ) ;
74
+ } ;
75
+ response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
76
+ } catch ( Exception ex ) {
77
+ Debug . LogError ( $ "GET Error: { ex } ") ;
78
+ response = new TransportResponse ( ) {
79
+ RequestUrl = transportRequest . RequestUrl ,
80
+ Error = ex
81
+ } ;
82
+ }
83
+ return response ;
84
+ }
85
+
86
+ public async Task < TransportResponse > PostRequest ( TransportRequest transportRequest ) {
87
+ TransportResponse response ;
88
+ try {
89
+ var formData = new List < IMultipartFormSection > ( ) ;
90
+ if ( ! string . IsNullOrEmpty ( transportRequest . BodyContentString ) ) {
91
+ formData . Add ( new MultipartFormDataSection ( transportRequest . BodyContentString ) ) ;
92
+ } else if ( transportRequest . BodyContentBytes != null ) {
93
+ formData . Add ( new MultipartFormDataSection ( transportRequest . BodyContentBytes ) ) ;
94
+ }
95
+
96
+ var postRequest = UnityWebRequest . Post ( transportRequest . RequestUrl , formData ) ;
97
+ PrepareUnityRequest ( postRequest , transportRequest ) ;
98
+ var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
99
+ transportRequest . CancellationToken . Register ( ( ) => {
100
+ postRequest . Abort ( ) ;
101
+ taskCompletionSource . TrySetCanceled ( ) ;
102
+ } ) ;
103
+ postRequest . SendWebRequest ( ) . completed += _ => {
104
+ taskCompletionSource . TrySetResult ( UnityRequestToResponse ( postRequest ) ) ;
105
+ } ;
106
+ response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
107
+ } catch ( Exception ex ) {
108
+ Debug . LogError ( $ "POST Error: { ex } ") ;
109
+ response = new TransportResponse ( ) {
110
+ RequestUrl = transportRequest . RequestUrl ,
111
+ Error = ex
112
+ } ;
113
+ }
114
+ return response ;
115
+ }
116
+
117
+ public async Task < TransportResponse > PatchRequest ( TransportRequest transportRequest ) {
118
+ TransportResponse response ;
119
+ try {
120
+ UnityWebRequest patchRequest ;
121
+ if ( ! string . IsNullOrEmpty ( transportRequest . BodyContentString ) ) {
122
+ patchRequest = UnityWebRequest . Put ( transportRequest . RequestUrl , transportRequest . BodyContentString ) ;
123
+ } else if ( transportRequest . BodyContentBytes != null ) {
124
+ patchRequest = UnityWebRequest . Put ( transportRequest . RequestUrl , transportRequest . BodyContentBytes ) ;
125
+ } else {
126
+ throw new ArgumentException ( "PATCH Transport Request has no body!" ) ;
127
+ }
128
+ patchRequest . method = "PATCH" ;
129
+
130
+ PrepareUnityRequest ( patchRequest , transportRequest ) ;
131
+ var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
132
+ transportRequest . CancellationToken . Register ( ( ) => {
133
+ patchRequest . Abort ( ) ;
134
+ taskCompletionSource . TrySetCanceled ( ) ;
135
+ } ) ;
136
+ patchRequest . SendWebRequest ( ) . completed += _ => {
137
+ taskCompletionSource . TrySetResult ( UnityRequestToResponse ( patchRequest ) ) ;
138
+ } ;
139
+ response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
140
+ } catch ( Exception ex ) {
141
+ Debug . LogError ( $ "PATCH Error: { ex } ") ;
142
+ response = new TransportResponse ( ) {
143
+ RequestUrl = transportRequest . RequestUrl ,
144
+ Error = ex
145
+ } ;
146
+ }
147
+
148
+ return response ;
149
+ }
150
+
151
+ public async Task < TransportResponse > PutRequest ( TransportRequest transportRequest ) {
152
+ TransportResponse response ;
153
+ try {
154
+ UnityWebRequest putRequest ;
155
+ if ( ! string . IsNullOrEmpty ( transportRequest . BodyContentString ) ) {
156
+ putRequest = UnityWebRequest . Put ( transportRequest . RequestUrl , transportRequest . BodyContentString ) ;
157
+ } else if ( transportRequest . BodyContentBytes != null ) {
158
+ putRequest = UnityWebRequest . Put ( transportRequest . RequestUrl , transportRequest . BodyContentBytes ) ;
159
+ } else {
160
+ throw new ArgumentException ( "PUT Transport Request has no body!" ) ;
161
+ }
162
+
163
+ PrepareUnityRequest ( putRequest , transportRequest ) ;
164
+ var taskCompletionSource = new TaskCompletionSource < TransportResponse > ( ) ;
165
+ transportRequest . CancellationToken . Register ( ( ) => {
166
+ putRequest . Abort ( ) ;
167
+ taskCompletionSource . TrySetCanceled ( ) ;
168
+ } ) ;
169
+ putRequest . SendWebRequest ( ) . completed += _ => {
170
+ taskCompletionSource . TrySetResult ( UnityRequestToResponse ( putRequest ) ) ;
171
+ } ;
172
+ response = await taskCompletionSource . Task . ConfigureAwait ( false ) ;
173
+ } catch ( Exception ex ) {
174
+ Debug . LogError ( $ "PUT Error: { ex } ") ;
175
+ response = new TransportResponse ( ) {
176
+ RequestUrl = transportRequest . RequestUrl ,
177
+ Error = ex
178
+ } ;
179
+ }
180
+
181
+ return response ;
182
+ }
183
+ }
184
+ }
0 commit comments