refactor(wrapper): changes to allow both controller and app to connect via wss://
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -24,6 +24,6 @@
|
||||
arguments=".\lstWrapper.dll"
|
||||
stdoutLogEnabled="true"
|
||||
stdoutLogFile=".\logs\stdout"
|
||||
hostingModel="inprocess" />
|
||||
hostingModel="outofprocess" />
|
||||
</system.webServer>
|
||||
</configuration>
|
||||
Reference in New Issue
Block a user