@@ -25,7 +25,7 @@ open FSharp.Data.GraphQL.Shared.WebSockets
2525
2626type GraphQLWebSocketMiddleware < 'Root >
2727 (
28- next : RequestDelegate,
28+ next : RequestDelegate, // must be kept for middleware signature compatibility
2929 applicationLifetime : IHostApplicationLifetime,
3030 serviceProvider : IServiceProvider,
3131 logger : ILogger< GraphQLWebSocketMiddleware< 'Root>>,
@@ -35,7 +35,6 @@ type GraphQLWebSocketMiddleware<'Root>
3535 let options = options.Value
3636 let serializerOptions = options.SerializerOptions
3737 let pingHandler = options.WebsocketOptions.CustomPingHandler
38- let endpointUrl = PathString options.WebsocketOptions.EndpointUrl
3938 let connectionInitTimeout = options.WebsocketOptions.ConnectionInitTimeout
4039
4140 let serializeServerMessage ( jsonSerializerOptions : JsonSerializerOptions ) ( serverMessage : ServerMessage ) = task {
@@ -346,25 +345,29 @@ type GraphQLWebSocketMiddleware<'Root>
346345 return Result.Error <| " {nameof ConnectionInit} timeout"
347346 }
348347
349- member _.InvokeAsync ( ctx : HttpContext ) = task {
350- if not ( ctx.Request.Path = endpointUrl ) then
351- do ! next.Invoke ( ctx )
352- else if ctx.WebSockets.IsWebSocketRequest then
353- use! socket = ctx.WebSockets.AcceptWebSocketAsync ( " graphql-transport-ws " )
354- let! connectionInitResult = socket |> waitForConnectionInitAndRespondToClient
355- match connectionInitResult with
356- | Result.Error errMsg -> logger.LogWarning errMsg
357- | Ok _ ->
358- let longRunningCancellationToken =
359- ( CancellationTokenSource
360- .CreateLinkedTokenSource ( ctx.RequestAborted , applicationLifetime.ApplicationStopping )
361- .Token )
362- longRunningCancellationToken.Register ( fun _ -> ( socket |> tryToGracefullyCloseSocketWithDefaultBehavior ). Wait ())
363- |> ignore
364- try
365- do ! socket |> handleMessages longRunningCancellationToken ctx
366- with ex ->
367- logger.LogError ( ex , " Cannot handle WebSocket message. " )
348+ member _.InvokeAsync ( ctx : HttpContext ) : Task =
349+ if ctx.WebSockets.IsWebSocketRequest then
350+ task {
351+ use! socket = ctx.WebSockets.AcceptWebSocketAsync ( " graphql-transport-ws " )
352+ let! connectionInitResult = socket |> waitForConnectionInitAndRespondToClient
353+ match connectionInitResult with
354+ | Result.Error errMsg -> logger.LogWarning errMsg
355+ | Ok _ ->
356+ let longRunningCancellationToken =
357+ ( CancellationTokenSource
358+ .CreateLinkedTokenSource ( ctx.RequestAborted , applicationLifetime.ApplicationStopping )
359+ .Token )
360+ longRunningCancellationToken.Register ( fun _ -> ( socket |> tryToGracefullyCloseSocketWithDefaultBehavior ). Wait () )
361+ |> ignore
362+ try
363+ do ! socket |> handleMessages longRunningCancellationToken ctx
364+ with ex ->
365+ logger.LogError ( ex , " Cannot handle WebSocket message. " )
366+ }
368367 else
369- do ! next.Invoke ( ctx)
370- }
368+ TypedResults.Problem (
369+ title = " WebSocket connection expected." ,
370+ detail = $" '{options.WebsocketOptions.EndpointUrl}' endpoint only accepts WebSocket connections." ,
371+ statusCode = StatusCodes.Status400BadRequest
372+ ) :> IResult
373+ |> _. ExecuteAsync( ctx)
0 commit comments