@@ -25,7 +25,6 @@ open FSharp.Data.GraphQL.Shared.WebSockets
2525
2626type GraphQLWebSocketMiddleware < 'Root >
2727 (
28- next : RequestDelegate,
2928 applicationLifetime : IHostApplicationLifetime,
3029 serviceProvider : IServiceProvider,
3130 logger : ILogger< GraphQLWebSocketMiddleware< 'Root>>,
@@ -35,7 +34,6 @@ type GraphQLWebSocketMiddleware<'Root>
3534 let options = options.Value
3635 let serializerOptions = options.SerializerOptions
3736 let pingHandler = options.WebsocketOptions.CustomPingHandler
38- let endpointUrl = PathString options.WebsocketOptions.EndpointUrl
3937 let connectionInitTimeout = options.WebsocketOptions.ConnectionInitTimeout
4038
4139 let serializeServerMessage ( jsonSerializerOptions : JsonSerializerOptions ) ( serverMessage : ServerMessage ) = task {
@@ -346,25 +344,29 @@ type GraphQLWebSocketMiddleware<'Root>
346344 return Result.Error <| " {nameof ConnectionInit} timeout"
347345 }
348346
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. " )
347+ member _.InvokeAsync ( ctx : HttpContext ) : Task =
348+ if ctx.WebSockets.IsWebSocketRequest then
349+ task {
350+ use! socket = ctx.WebSockets.AcceptWebSocketAsync ( " graphql-transport-ws " )
351+ let! connectionInitResult = socket |> waitForConnectionInitAndRespondToClient
352+ match connectionInitResult with
353+ | Result.Error errMsg -> logger.LogWarning errMsg
354+ | Ok _ ->
355+ let longRunningCancellationToken =
356+ ( CancellationTokenSource
357+ .CreateLinkedTokenSource ( ctx.RequestAborted , applicationLifetime.ApplicationStopping )
358+ .Token )
359+ longRunningCancellationToken.Register ( fun _ -> ( socket |> tryToGracefullyCloseSocketWithDefaultBehavior ). Wait () )
360+ |> ignore
361+ try
362+ do ! socket |> handleMessages longRunningCancellationToken ctx
363+ with ex ->
364+ logger.LogError ( ex , " Cannot handle WebSocket message. " )
365+ }
368366 else
369- do ! next.Invoke ( ctx)
370- }
367+ TypedResults.Problem (
368+ title = " WebSocket connection expected." ,
369+ detail = $" '{options.WebsocketOptions.EndpointUrl}' endpoint only accepts WebSocket connections." ,
370+ statusCode = StatusCodes.Status400BadRequest
371+ ) :> IResult
372+ |> _. ExecuteAsync( ctx)
0 commit comments