This commit is contained in:
Stef Heyenrath
2026-02-11 18:26:15 +01:00
parent ecb3e249cc
commit 547b5673c0
8 changed files with 28 additions and 31 deletions

View File

@@ -0,0 +1,17 @@
// Copyright © WireMock.Net
using System.Net;
namespace WireMock.ResponseProviders;
/// <summary>
/// Special response marker to indicate WebSocket has been handled
/// </summary>
internal class WebSocketHandledResponse : ResponseMessage
{
public WebSocketHandledResponse()
{
// 101 Switching Protocols
StatusCode = (int)HttpStatusCode.SwitchingProtocols;
}
}

View File

@@ -12,14 +12,9 @@ using WireMock.WebSockets;
namespace WireMock.ResponseProviders; namespace WireMock.ResponseProviders;
internal class WebSocketResponseProvider : IResponseProvider internal class WebSocketResponseProvider(WebSocketBuilder builder) : IResponseProvider
{ {
private readonly WebSocketBuilder _builder; private readonly WebSocketBuilder _builder = Guard.NotNull(builder);
public WebSocketResponseProvider(WebSocketBuilder builder)
{
_builder = Guard.NotNull(builder);
}
public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync( public async Task<(IResponseMessage Message, IMapping? Mapping)> ProvideResponseAsync(
IMapping mapping, IMapping mapping,
@@ -127,7 +122,7 @@ internal class WebSocketResponseProvider : IResponseProvider
} }
} }
private async Task HandleEchoAsync(WireMockWebSocketContext context) private static async Task HandleEchoAsync(WireMockWebSocketContext context)
{ {
var bufferSize = context.Builder.MaxMessageSize ?? WebSocketConstants.DefaultReceiveBufferSize; var bufferSize = context.Builder.MaxMessageSize ?? WebSocketConstants.DefaultReceiveBufferSize;
var buffer = new byte[bufferSize]; var buffer = new byte[bufferSize];
@@ -170,7 +165,7 @@ internal class WebSocketResponseProvider : IResponseProvider
} }
} }
private async Task HandleCustomAsync( private static async Task HandleCustomAsync(
WireMockWebSocketContext context, WireMockWebSocketContext context,
Func<WebSocketMessage, IWebSocketContext, Task> handler) Func<WebSocketMessage, IWebSocketContext, Task> handler)
{ {
@@ -212,7 +207,7 @@ internal class WebSocketResponseProvider : IResponseProvider
} }
} }
private async Task HandleProxyAsync(WireMockWebSocketContext context, ProxyAndRecordSettings settings) private static async Task HandleProxyAsync(WireMockWebSocketContext context, ProxyAndRecordSettings settings)
{ {
using var clientWebSocket = new ClientWebSocket(); using var clientWebSocket = new ClientWebSocket();
@@ -236,7 +231,7 @@ internal class WebSocketResponseProvider : IResponseProvider
} }
} }
private async Task ForwardMessagesAsync(WebSocket source, WebSocket destination) private static async Task ForwardMessagesAsync(WebSocket source, WebSocket destination)
{ {
var buffer = new byte[WebSocketConstants.ProxyForwardBufferSize]; var buffer = new byte[WebSocketConstants.ProxyForwardBufferSize];
@@ -263,7 +258,7 @@ internal class WebSocketResponseProvider : IResponseProvider
} }
} }
private async Task WaitForCloseAsync(WireMockWebSocketContext context) private static async Task WaitForCloseAsync(WireMockWebSocketContext context)
{ {
var buffer = new byte[WebSocketConstants.MinimumBufferSize]; var buffer = new byte[WebSocketConstants.MinimumBufferSize];
var timeout = context.Builder.CloseTimeout ?? TimeSpan.FromMinutes(WebSocketConstants.DefaultCloseTimeoutMinutes); var timeout = context.Builder.CloseTimeout ?? TimeSpan.FromMinutes(WebSocketConstants.DefaultCloseTimeoutMinutes);
@@ -315,16 +310,4 @@ internal class WebSocketResponseProvider : IResponseProvider
return message; return message;
} }
}
/// <summary>
/// Special response marker to indicate WebSocket has been handled
/// </summary>
internal class WebSocketHandledResponse : ResponseMessage
{
public WebSocketHandledResponse()
{
// 101 Switching Protocols
StatusCode = (int)HttpStatusCode.SwitchingProtocols;
}
} }

View File

@@ -1,9 +1,6 @@
// Copyright © WireMock.Net // Copyright © WireMock.Net
using System;
using System.Net.WebSockets; using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
namespace WireMock.WebSockets; namespace WireMock.WebSockets;

View File

@@ -49,4 +49,4 @@ public interface IWebSocketMessageBuilder
/// </summary> /// </summary>
[PublicAPI] [PublicAPI]
IWebSocketMessageBuilder AndClose(); IWebSocketMessageBuilder AndClose();
} }

View File

@@ -22,4 +22,4 @@ public interface IWebSocketMessageConditionBuilder
/// <param name="configure">Action to configure the messages</param> /// <param name="configure">Action to configure the messages</param>
[PublicAPI] [PublicAPI]
IWebSocketBuilder SendMessages(Action<IWebSocketMessagesBuilder> configure); IWebSocketBuilder SendMessages(Action<IWebSocketMessagesBuilder> configure);
} }

View File

@@ -15,4 +15,4 @@ public interface IWebSocketMessagesBuilder
/// <param name="configure">Action to configure the message</param> /// <param name="configure">Action to configure the message</param>
[PublicAPI] [PublicAPI]
IWebSocketMessagesBuilder AddMessage(Action<IWebSocketMessageBuilder> configure); IWebSocketMessagesBuilder AddMessage(Action<IWebSocketMessageBuilder> configure);
} }

View File

@@ -1,6 +1,5 @@
// Copyright © WireMock.Net // Copyright © WireMock.Net
using System;
using System.Net.WebSockets; using System.Net.WebSockets;
namespace WireMock.WebSockets; namespace WireMock.WebSockets;

View File

@@ -570,6 +570,7 @@ public class WebSocketIntegrationTests(ITestOutputHelper output)
) )
.RespondWith(Response.Create() .RespondWith(Response.Create()
.WithWebSocket(ws => ws .WithWebSocket(ws => ws
.WithCloseTimeout(TimeSpan.FromSeconds(3))
.WhenMessage("/help").SendMessage(m => m.WithText("Available commands: /help, /time, /echo <text>")) .WhenMessage("/help").SendMessage(m => m.WithText("Available commands: /help, /time, /echo <text>"))
.WhenMessage("/time").SendMessage(m => m.WithText($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC")) .WhenMessage("/time").SendMessage(m => m.WithText($"Server time: {DateTime.UtcNow:yyyy-MM-dd HH:mm:ss} UTC"))
.WhenMessage("/echo ").SendMessage(m => m.WithText("echo response")) .WhenMessage("/echo ").SendMessage(m => m.WithText("echo response"))