refactor(wrapper): changes to allow both controller and app to connect via wss://
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user