Skip to content

Commit 476c88c

Browse files
author
Juri
committed
Fixed error FS3511: This state machine is not statically compilable. A resumable code invocation at
See dotnet/fsharp#12839
1 parent 4e3c237 commit 476c88c

File tree

2 files changed

+45
-44
lines changed

2 files changed

+45
-44
lines changed

tests/FSharp.Data.GraphQL.IntegrationTests.Server/HttpHandlers.fs

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -103,25 +103,27 @@ module HttpHandlers =
103103
ms
104104
match getMultipartRequestBoundary ctx.Request with
105105
| Some boundary ->
106-
use ms = copyBodyToMemory(ctx.Request)
107-
let reader = MultipartReader(boundary, ms)
108-
let request = reader |> MultipartRequest.read |> Async.AwaitTask |> Async.RunSynchronously
109-
let results =
110-
request.Operations
111-
|> List.map (fun op ->
112-
let result =
113-
match op.Variables with
114-
| Some variables ->
115-
let variables = parseVariables Schema.schema (parseVariableDefinitions op.Query) variables
116-
Schema.executor.AsyncExecute(op.Query, variables = variables, data = root)
117-
| None -> Schema.executor.AsyncExecute(op.Query, data = root)
118-
result |> Async.RunSynchronously |> addRequestType "Multipart")
119-
match results with
120-
| [ result ] ->
121-
return! okWithStr (json result) next ctx
122-
| results ->
123-
let result = JArray.FromObject(List.map json results).ToString()
124-
return! okWithStr result next ctx
106+
return! task {
107+
use ms = copyBodyToMemory(ctx.Request)
108+
let reader = MultipartReader(boundary, ms)
109+
let! request = reader |> MultipartRequest.read ctx.RequestAborted
110+
let results =
111+
request.Operations
112+
|> List.map (fun op ->
113+
let result =
114+
match op.Variables with
115+
| Some variables ->
116+
let variables = parseVariables Schema.schema (parseVariableDefinitions op.Query) variables
117+
Schema.executor.AsyncExecute(op.Query, variables = variables, data = root)
118+
| None -> Schema.executor.AsyncExecute(op.Query, data = root)
119+
result |> Async.RunSynchronously |> addRequestType "Multipart")
120+
match results with
121+
| [ result ] ->
122+
return! okWithStr (json result) next ctx
123+
| results ->
124+
let result = JArray.FromObject(List.map json results).ToString()
125+
return! okWithStr result next ctx
126+
}
125127
| None ->
126128
return! badRequest (text "Invalid multipart request header: missing boundary value.") next ctx
127129
else
@@ -138,24 +140,23 @@ module HttpHandlers =
138140
| :? string as query -> Some (query, getVariables (parseVariableDefinitions query) data)
139141
| _ -> failwith "Failure deserializing repsonse. Could not read query - it is not stringified in request."
140142
else None)
141-
match request with
142-
| Some (query, Some variables) ->
143-
printfn "Received query: %s" query
144-
printfn "Received variables: %A" variables
145-
let query = removeWhitespacesAndLineBreaks query
146-
let result = Schema.executor.AsyncExecute(query, root, variables) |> Async.RunSynchronously |> addRequestType "Classic"
147-
printfn "Result metadata: %A" result.Metadata
148-
return! okWithStr (json result) next ctx
149-
| Some (query, None) ->
150-
printfn "Received query: %s" query
151-
let query = removeWhitespacesAndLineBreaks query
152-
let result = Schema.executor.AsyncExecute(query) |> Async.RunSynchronously |> addRequestType "Classic"
153-
printfn "Result metadata: %A" result.Metadata
154-
return! okWithStr (json result) next ctx
155-
| None ->
156-
let result = Schema.executor.AsyncExecute(Introspection.IntrospectionQuery) |> Async.RunSynchronously |> addRequestType "Classic"
157-
printfn "Result metadata: %A" result.Metadata
158-
return! okWithStr (json result) next ctx
143+
let! result = task {
144+
match request with
145+
| Some (query, Some variables) ->
146+
printfn "Received query: %s" query
147+
printfn "Received variables: %A" variables
148+
let query = removeWhitespacesAndLineBreaks query
149+
return! Schema.executor.AsyncExecute(query, root, variables)
150+
| Some (query, None) ->
151+
printfn "Received query: %s" query
152+
let query = removeWhitespacesAndLineBreaks query
153+
return! Schema.executor.AsyncExecute(query)
154+
| None ->
155+
return! Schema.executor.AsyncExecute(Introspection.IntrospectionQuery)
156+
}
157+
let result = result |> addRequestType "Classic"
158+
printfn "Result metadata: %A" result.Metadata
159+
return! okWithStr (json result) next ctx
159160
}
160161

161162
let webApp : HttpHandler =

tests/FSharp.Data.GraphQL.IntegrationTests.Server/MultipartRequest.fs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,12 @@ module MultipartRequest =
119119
| operations -> operations |> List.mapi (fun ix operation -> mapOperation (Some ix) operation)
120120

121121
/// Reads a GraphQL multipart request from a MultipartReader.
122-
let read (reader : MultipartReader) =
123-
async {
122+
let read cancellationToken (reader : MultipartReader) =
123+
task {
124124
let mutable section : GraphQLMultipartSection option = None
125125
let readNextSection () =
126-
async {
127-
let! next = reader.ReadNextSectionAsync() |> Async.AwaitTask
126+
task {
127+
let! next = reader.ReadNextSectionAsync cancellationToken
128128
section <- GraphQLMultipartSection.FromSection(next)
129129
}
130130
let mutable operations : string = null
@@ -134,7 +134,7 @@ module MultipartRequest =
134134
while not section.IsNone do
135135
match section.Value with
136136
| Form section ->
137-
let! value = section.GetValueAsync() |> Async.AwaitTask
137+
let! value = section.GetValueAsync()
138138
match section.Name with
139139
| "operations" ->
140140
operations <- value
@@ -145,7 +145,7 @@ module MultipartRequest =
145145
| _ -> failwithf "Error reading multipart request. Unexpected section name \"%s\"." section.Name
146146
| File section ->
147147
let stream = new System.IO.MemoryStream(4096)
148-
do! section.FileStream.CopyToAsync(stream) |> Async.AwaitTask
148+
do! section.FileStream.CopyToAsync(stream, cancellationToken) |> Async.AwaitTask
149149
stream.Position <- 0L
150150
let value = { Name = section.FileName; ContentType = section.Section.ContentType; Content = stream }
151151
files.Add(section.Name, value)
@@ -156,4 +156,4 @@ module MultipartRequest =
156156
| :? JObject as op -> [ op.ToObject<Operation>(jsonSerializer) ]
157157
| _ -> failwith "Unexpected operations value."
158158
return { Operations = parseOperations operations map files }
159-
} |> Async.StartAsTask
159+
}

0 commit comments

Comments
 (0)