Skip to content

Commit 40cdf62

Browse files
authored
Use byte array in message received to avoid some unnecessary encoding (#2748) (#2770)
1 parent 68d60c7 commit 40cdf62

File tree

3 files changed

+28
-21
lines changed

3 files changed

+28
-21
lines changed

lib/PuppeteerSharp/Cdp/Connection.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,11 @@ private async Task ProcessMessage(MessageReceivedEventArgs e)
285285
return;
286286
}
287287

288-
_logger.LogTrace("◀ Receive {Message}", response);
288+
if (_logger.IsEnabled(LogLevel.Trace))
289+
{
290+
_logger.LogTrace("◀ Receive {Message}", Encoding.UTF8.GetString(response));
291+
}
292+
289293
ProcessIncomingMessage(obj);
290294
}
291295
catch (Exception ex)

lib/PuppeteerSharp/Transport/MessageReceivedEventArgs.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ public class MessageReceivedEventArgs : EventArgs
1212
/// Initializes a new instance of the <see cref="PuppeteerSharp.Transport.MessageReceivedEventArgs"/> class.
1313
/// </summary>
1414
/// <param name="message">Message.</param>
15-
public MessageReceivedEventArgs(string message) => Message = message;
15+
public MessageReceivedEventArgs(byte[] message) => Message = message;
1616

1717
/// <summary>
1818
/// Transport message.
1919
/// </summary>
20-
public string Message { get; }
20+
public byte[] Message { get; }
2121
}
2222
}

lib/PuppeteerSharp/Transport/WebSocketTransport.cs

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Diagnostics.CodeAnalysis;
3+
using System.IO;
34
using System.Net.WebSockets;
45
using System.Text;
56
using System.Threading;
@@ -136,18 +137,16 @@ private static void ScheduleTransportTask(Func<CancellationToken, Task> taskFact
136137
/// Starts listening the socket.
137138
/// </summary>
138139
/// <returns>The start.</returns>
139-
private async Task<object> GetResponseAsync(CancellationToken cancellationToken)
140+
private async Task GetResponseAsync(CancellationToken cancellationToken)
140141
{
141142
var buffer = new byte[2048];
142143

143144
while (!IsClosed)
144145
{
145-
var endOfMessage = false;
146-
var response = new StringBuilder();
147-
148-
while (!endOfMessage)
146+
MemoryStream memoryStream = null;
147+
WebSocketReceiveResult result;
148+
do
149149
{
150-
WebSocketReceiveResult result;
151150
try
152151
{
153152
result = await _client.ReceiveAsync(
@@ -156,31 +155,35 @@ private async Task<object> GetResponseAsync(CancellationToken cancellationToken)
156155
}
157156
catch (OperationCanceledException)
158157
{
159-
return null;
158+
return;
160159
}
161160
catch (Exception ex)
162161
{
163162
OnClose(ex.Message);
164-
return null;
163+
return;
165164
}
166165

167-
endOfMessage = result.EndOfMessage;
168-
169-
if (result.MessageType == WebSocketMessageType.Text)
166+
if (result.MessageType == WebSocketMessageType.Close)
170167
{
171-
response.Append(Encoding.UTF8.GetString(buffer, 0, result.Count));
168+
OnClose("WebSocket closed");
169+
return;
172170
}
173-
else if (result.MessageType == WebSocketMessageType.Close)
171+
else if (result.MessageType == WebSocketMessageType.Binary)
174172
{
175-
OnClose("WebSocket closed");
176-
return null;
173+
continue;
177174
}
175+
176+
if (memoryStream is null && !result.EndOfMessage)
177+
{
178+
memoryStream = new MemoryStream(buffer.Length);
179+
}
180+
181+
memoryStream?.Write(buffer, 0, result.Count);
178182
}
183+
while (!result.EndOfMessage);
179184

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()));
181186
}
182-
183-
return null;
184187
}
185188

186189
private void OnClose(string closeReason)

0 commit comments

Comments
 (0)