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

View File

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