refactor(wrapper): changes to allow both controller and app to connect via wss://

This commit is contained in:
2025-10-10 08:07:34 -05:00
parent 7964cda197
commit da1127057c
2 changed files with 69 additions and 32 deletions

View File

@@ -97,34 +97,71 @@ app.Run(async (HttpContext context) =>
}
// Handle WebSocket requests
// if (context.WebSockets.IsWebSocketRequest)
// {
// try
// {
// var backendUri = new UriBuilder(backendWsBase)
// {
// Path = context.Request.Path,
// Query = context.Request.QueryString.ToString()
// }.Uri;
// using var backendSocket = new ClientWebSocket();
// // Forward incoming headers
// foreach (var header in context.Request.Headers)
// {
// try { backendSocket.Options.SetRequestHeader(header.Key, header.Value); }
// catch { /* ignore headers WS client doesn't like */ }
// }
// await backendSocket.ConnectAsync(backendUri, context.RequestAborted);
// using var frontendSocket = await context.WebSockets.AcceptWebSocketAsync();
// var cts = new CancellationTokenSource();
// var forwardToBackend = ForwardWebSocketAsync(frontendSocket, backendSocket, cts.Token);
// var forwardToFrontend = ForwardWebSocketAsync(backendSocket, frontendSocket, cts.Token);
// await Task.WhenAny(forwardToBackend, forwardToFrontend);
// cts.Cancel();
// }
// catch (Exception ex)
// {
// LogToFile($"WebSocket proxy error: {ex.Message}");
// context.Response.StatusCode = (int)HttpStatusCode.BadGateway;
// await context.Response.WriteAsync($"WebSocket proxy error: {ex.Message}");
// }
// return;
// }
if (context.WebSockets.IsWebSocketRequest)
{
try
{
// Accept the incoming client WebSocket
using var frontendSocket = await context.WebSockets.AcceptWebSocketAsync();
// Build the backend WebSocket URI
var backendUri = new UriBuilder(backendWsBase)
{
Path = context.Request.Path,
Query = context.Request.QueryString.ToString()
}.Uri;
// Connect to the Node.js backend
using var backendSocket = new ClientWebSocket();
// Forward incoming headers
foreach (var header in context.Request.Headers)
{
try { backendSocket.Options.SetRequestHeader(header.Key, header.Value); }
catch { /* ignore headers WS client doesn't like */ }
}
await backendSocket.ConnectAsync(backendUri, context.RequestAborted);
using var frontendSocket = await context.WebSockets.AcceptWebSocketAsync();
// Forward frames both ways until one side closes
var cts = new CancellationTokenSource();
var forwardToBackend = ForwardWebSocketAsync(frontendSocket, backendSocket, cts.Token);
var forwardToFrontend = ForwardWebSocketAsync(backendSocket, frontendSocket, cts.Token);
await Task.WhenAny(forwardToBackend, forwardToFrontend);
// Cancel the other direction once one side closes
cts.Cancel();
}
catch (Exception ex)
@@ -133,9 +170,9 @@ app.Run(async (HttpContext context) =>
context.Response.StatusCode = (int)HttpStatusCode.BadGateway;
await context.Response.WriteAsync($"WebSocket proxy error: {ex.Message}");
}
return;
}
// Otherwise: normal HTTP request
var client = context.RequestServices.GetRequiredService<IHttpClientFactory>().CreateClient();
var targetUri = backendHttpBase + context.Request.Path + context.Request.QueryString;

View File

@@ -24,6 +24,6 @@
arguments=".\lstWrapper.dll"
stdoutLogEnabled="true"
stdoutLogFile=".\logs\stdout"
hostingModel="inprocess" />
hostingModel="outofprocess" />
</system.webServer>
</configuration>