1
1
using System ;
2
2
using System . Diagnostics . CodeAnalysis ;
3
+ using System . IO ;
3
4
using System . Net . WebSockets ;
4
5
using System . Text ;
5
6
using System . Threading ;
@@ -136,18 +137,16 @@ private static void ScheduleTransportTask(Func<CancellationToken, Task> taskFact
136
137
/// Starts listening the socket.
137
138
/// </summary>
138
139
/// <returns>The start.</returns>
139
- private async Task < object > GetResponseAsync ( CancellationToken cancellationToken )
140
+ private async Task GetResponseAsync ( CancellationToken cancellationToken )
140
141
{
141
142
var buffer = new byte [ 2048 ] ;
142
143
143
144
while ( ! IsClosed )
144
145
{
145
- var endOfMessage = false ;
146
- var response = new StringBuilder ( ) ;
147
-
148
- while ( ! endOfMessage )
146
+ MemoryStream memoryStream = null ;
147
+ WebSocketReceiveResult result ;
148
+ do
149
149
{
150
- WebSocketReceiveResult result ;
151
150
try
152
151
{
153
152
result = await _client . ReceiveAsync (
@@ -156,31 +155,35 @@ private async Task<object> GetResponseAsync(CancellationToken cancellationToken)
156
155
}
157
156
catch ( OperationCanceledException )
158
157
{
159
- return null ;
158
+ return ;
160
159
}
161
160
catch ( Exception ex )
162
161
{
163
162
OnClose ( ex . Message ) ;
164
- return null ;
163
+ return ;
165
164
}
166
165
167
- endOfMessage = result . EndOfMessage ;
168
-
169
- if ( result . MessageType == WebSocketMessageType . Text )
166
+ if ( result . MessageType == WebSocketMessageType . Close )
170
167
{
171
- response . Append ( Encoding . UTF8 . GetString ( buffer , 0 , result . Count ) ) ;
168
+ OnClose ( "WebSocket closed" ) ;
169
+ return ;
172
170
}
173
- else if ( result . MessageType == WebSocketMessageType . Close )
171
+ else if ( result . MessageType == WebSocketMessageType . Binary )
174
172
{
175
- OnClose ( "WebSocket closed" ) ;
176
- return null ;
173
+ continue ;
177
174
}
175
+
176
+ if ( memoryStream is null && ! result . EndOfMessage )
177
+ {
178
+ memoryStream = new MemoryStream ( buffer . Length ) ;
179
+ }
180
+
181
+ memoryStream ? . Write ( buffer , 0 , result . Count ) ;
178
182
}
183
+ while ( ! result . EndOfMessage ) ;
179
184
180
- MessageReceived ? . Invoke ( this , new MessageReceivedEventArgs ( response . ToString ( ) ) ) ;
185
+ MessageReceived ? . Invoke ( this , new MessageReceivedEventArgs ( memoryStream is null ? buffer . AsSpan ( 0 , result . Count ) . ToArray ( ) : memoryStream . ToArray ( ) ) ) ;
181
186
}
182
-
183
- return null ;
184
187
}
185
188
186
189
private void OnClose ( string closeReason )
0 commit comments