diff --git a/samples/MagicOnionSampleApp.Shared/MagicOnionSampleApp.Shared.csproj b/samples/MagicOnionSampleApp.Shared/MagicOnionSampleApp.Shared.csproj
index c7753f0..db305b2 100644
--- a/samples/MagicOnionSampleApp.Shared/MagicOnionSampleApp.Shared.csproj
+++ b/samples/MagicOnionSampleApp.Shared/MagicOnionSampleApp.Shared.csproj
@@ -2,6 +2,7 @@
netstandard2.1
+ enable
diff --git a/src/GrpcWebSocketBridge.AspNetCore/GrpcWebSocketBridgeMiddleware.cs b/src/GrpcWebSocketBridge.AspNetCore/GrpcWebSocketBridgeMiddleware.cs
index eec3158..596a222 100644
--- a/src/GrpcWebSocketBridge.AspNetCore/GrpcWebSocketBridgeMiddleware.cs
+++ b/src/GrpcWebSocketBridge.AspNetCore/GrpcWebSocketBridgeMiddleware.cs
@@ -93,7 +93,6 @@ private async Task RunReadFromClientLoopAsync(PipeWriter websocketPipeWriter, We
await readyToRunTask;
var bufferArray = new byte[ReaderWriterBufferSize];
- var isRequestCompleted = false;
var isPipeCompleted = false;
var reader = new GrpcWebSocketBufferReader();
@@ -101,14 +100,15 @@ private async Task RunReadFromClientLoopAsync(PipeWriter websocketPipeWriter, We
var consumed = 0;
try
{
- while (webSocket.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested && !isRequestCompleted)
+ while (webSocket.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested)
{
var result = await webSocket.ReceiveAsync(bufferArray, cancellationToken);
- if (result.MessageType != WebSocketMessageType.Binary) continue;
+ if (result.MessageType != WebSocketMessageType.Binary)
+ continue;
bufferWriter.Write(bufferArray.AsSpan(0, result.Count));
- while (reader.TryRead(bufferWriter.WrittenMemory.Slice(consumed), out var readResult))
+ while (!isPipeCompleted && reader.TryRead(bufferWriter.WrittenMemory.Slice(consumed), out var readResult))
{
switch (readResult.Type)
{
@@ -125,7 +125,8 @@ private async Task RunReadFromClientLoopAsync(PipeWriter websocketPipeWriter, We
await websocketPipeWriter.FlushAsync(cancellationToken);
break;
case GrpcWebSocketBufferReader.BufferReadResultType.Trailer:
- isRequestCompleted = true;
+ await websocketPipeWriter.CompleteAsync();
+ isPipeCompleted = true;
break;
}
@@ -147,7 +148,7 @@ private async Task RunReadFromClientLoopAsync(PipeWriter websocketPipeWriter, We
catch (Exception e) when (e is ConnectionAbortedException || e is WebSocketException)
{
// When the WebSocket connection has been closed, Ignore ConnectionAbortedException and WebSocketException.
- if (!isRequestCompleted)
+ if (!isPipeCompleted)
{
await websocketPipeWriter.CompleteAsync(new IOException("The request was aborted.", e));
isPipeCompleted = true;
@@ -169,7 +170,7 @@ private async Task RunWriteToClientLoopAsync(Pipe writerPipe, WebSocket webSocke
// Wait until the features are ready to run.
await readyToRunTask;
- using var stream = writerPipe.Reader.AsStream();
+ await using var stream = writerPipe.Reader.AsStream();
var bufferArray = new byte[ReaderWriterBufferSize];
var readLen = 0;
while ((readLen = await stream.ReadAsync(bufferArray, cancellationToken)) > 0)
diff --git a/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Net.cs b/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Net.cs
index 3eb5285..1d660e6 100644
--- a/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Net.cs
+++ b/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Net.cs
@@ -9,7 +9,7 @@ public partial class GrpcWebSocketBridgeHandler
{
private static PipeOptions PipeOptions { get; } = new PipeOptions();
- private static IClientWebSocket CreateClientWebSocket() => new SystemNetWebSocketsClientWebSocket();
+ private IClientWebSocket CreateClientWebSocket() => new SystemNetWebSocketsClientWebSocket(CookieContainer);
public GrpcWebSocketBridgeHandler(bool forceWebSocketMode = false)
diff --git a/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Unity.cs b/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Unity.cs
index fb56415..a259a8c 100644
--- a/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Unity.cs
+++ b/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.Unity.cs
@@ -13,11 +13,11 @@ public partial class GrpcWebSocketBridgeHandler
{
private static PipeOptions PipeOptions { get; } = new PipeOptions(readerScheduler: PipeScheduler.Inline, writerScheduler: PipeScheduler.Inline, useSynchronizationContext: false);
- private static IClientWebSocket CreateClientWebSocket() =>
+ private IClientWebSocket CreateClientWebSocket() =>
#if UNITY_WEBGL && !UNITY_EDITOR
new JsWebSocketsClientWebSocket();
#else
- new SystemNetWebSocketsClientWebSocket();
+ new SystemNetWebSocketsClientWebSocket(CookieContainer);
#endif
public GrpcWebSocketBridgeHandler(bool forceWebSocketMode = false)
diff --git a/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.cs b/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.cs
index 55eb739..ed4b9ea 100644
--- a/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.cs
+++ b/src/GrpcWebSocketBridge.Client/GrpcWebSocketBridgeHandler.cs
@@ -30,6 +30,8 @@ namespace GrpcWebSocketBridge.Client
{
public partial class GrpcWebSocketBridgeHandler : DelegatingHandler
{
+ public CookieContainer? CookieContainer { get; set; }
+
private readonly HashSet _ongoingWebSockets = new HashSet();
private readonly bool _forceWebSocketMode = false;
diff --git a/src/GrpcWebSocketBridge.Client/Unity/JsWebSocket.jslib b/src/GrpcWebSocketBridge.Client/Unity/JsWebSocket.jslib
index d2fe1c8..3949575 100644
--- a/src/GrpcWebSocketBridge.Client/Unity/JsWebSocket.jslib
+++ b/src/GrpcWebSocketBridge.Client/Unity/JsWebSocket.jslib
@@ -23,18 +23,18 @@
var connection = connections[handle];
connection.socket = new WebSocket(connections[handle].url, connections[handle].subProtocol);
-
+
connection.socket.binaryType = 'arraybuffer';
connection.socket.onopen = function (e) {
- dynCall('vi', connection.onConnected, [connection.id]);
+ getWasmTableEntry(connection.onConnected)(connection.id);
};
connection.socket.onclose = function (e) {
- dynCall('viii', connection.onClose, [connection.id, e.code, e.wasClean ? 1 : 0]);
+ getWasmTableEntry(connection.onClose)(connection.id, e.code, e.wasClean ? 1 : 0);
};
connection.socket.onmessage = function (e) {
var buffer = _malloc(e.data.byteLength);
HEAPU8.set(new Uint8Array(e.data), buffer);
- dynCall('viii', connection.onReceive, [connection.id, buffer, e.data.byteLength]);
+ getWasmTableEntry(connection.onReceive)(connection.id, buffer, e.data.byteLength);
_free(buffer);
};
},
@@ -72,4 +72,4 @@
autoAddDeps(JsWebSocketLibrary, '$connections');
autoAddDeps(JsWebSocketLibrary, '$connectionsSequence');
-mergeInto(LibraryManager.library, JsWebSocketLibrary);
\ No newline at end of file
+mergeInto(LibraryManager.library, JsWebSocketLibrary);
diff --git a/src/GrpcWebSocketBridge.Client/Unity/JsWebSocketClient.cs b/src/GrpcWebSocketBridge.Client/Unity/JsWebSocketClient.cs
index 9522fcc..90c5df1 100644
--- a/src/GrpcWebSocketBridge.Client/Unity/JsWebSocketClient.cs
+++ b/src/GrpcWebSocketBridge.Client/Unity/JsWebSocketClient.cs
@@ -128,6 +128,7 @@ private void ThrowIfStateIsNotOpen()
public void Dispose()
{
+ CloseAsync(WebSocketCloseStatus.NormalClosure, "Disposed", CancellationToken.None);
_ws.Dispose();
}
@@ -159,7 +160,7 @@ public ValueWebSocketReceiveResult(int count, WebSocketMessageType messageType,
public class JsWebSocket
{
private static Dictionary _instanceByHandle = new Dictionary();
-
+
private Queue _queue = new Queue();
private TaskCompletionSource _receiveTcs;
private int _handle;
diff --git a/src/GrpcWebSocketBridge.Client/Unity/UnityWebRequestHttpHandler.cs b/src/GrpcWebSocketBridge.Client/Unity/UnityWebRequestHttpHandler.cs
index d8a6297..35d62e6 100644
--- a/src/GrpcWebSocketBridge.Client/Unity/UnityWebRequestHttpHandler.cs
+++ b/src/GrpcWebSocketBridge.Client/Unity/UnityWebRequestHttpHandler.cs
@@ -57,9 +57,11 @@ protected override async Task SendAsync(HttpRequestMessage
};
var responseHeader = response.Headers;
+ var contentHeader = response.Content.Headers;
foreach (var header in webRequest.GetResponseHeaders())
{
responseHeader.TryAddWithoutValidation(header.Key, header.Value);
+ contentHeader.TryAddWithoutValidation(header.Key, header.Value);
}
return response;
diff --git a/src/GrpcWebSocketBridge.Client/WebSockets/SystemNetWebSocketsClientWebSocket.cs b/src/GrpcWebSocketBridge.Client/WebSockets/SystemNetWebSocketsClientWebSocket.cs
index 3a65ab3..2819b8c 100644
--- a/src/GrpcWebSocketBridge.Client/WebSockets/SystemNetWebSocketsClientWebSocket.cs
+++ b/src/GrpcWebSocketBridge.Client/WebSockets/SystemNetWebSocketsClientWebSocket.cs
@@ -1,4 +1,5 @@
using System;
+using System.Net;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
@@ -9,9 +10,9 @@ internal class SystemNetWebSocketsClientWebSocket : IClientWebSocket
{
private readonly System.Net.WebSockets.ClientWebSocket _clientWebSocket;
- public SystemNetWebSocketsClientWebSocket()
+ public SystemNetWebSocketsClientWebSocket(CookieContainer? cookieContainer = null)
{
- _clientWebSocket = new ClientWebSocket();
+ _clientWebSocket = new ClientWebSocket { Options = { Cookies = cookieContainer } };
}
public WebSocketState State => _clientWebSocket.State;
diff --git a/src/GrpcWebSocketBridge.Client/package.json b/src/GrpcWebSocketBridge.Client/package.json
index 6645858..8b73282 100644
--- a/src/GrpcWebSocketBridge.Client/package.json
+++ b/src/GrpcWebSocketBridge.Client/package.json
@@ -2,8 +2,8 @@
"name": "com.cysharp.grpcwebsocketbridge",
"displayName": "GrpcWebSocketBridge",
"author": { "name": "Cysharp, Inc.", "url": "https://cysharp.co.jp/en/" },
- "version": "1.4.1",
- "unity": "2022.3",
+ "version": "1.4.2",
+ "unity": "6000.0",
"description": "",
"keywords": ["WebSocket", "gRPC"],
"license": "MIT",