public async Task HandleGraphQLHttpRequestAsync(HttpContext httpContext) { if (httpContext.Request.Path.Value.EndsWith("/schema")) { await HandleSchemaDocRequestAsync(httpContext); return; } var start = AppTime.GetTimestamp(); var gqlHttpReq = await BuildGraphQLHttpRequestAsync(httpContext); var reqCtx = gqlHttpReq.RequestContext; //internal request context try { await Server.ExecuteRequestAsync(gqlHttpReq.RequestContext); } catch (Exception exc) { gqlHttpReq.RequestContext.AddError(exc); } // success, serialize response try { var httpResp = httpContext.Response; httpResp.ContentType = ContentTypeJson; var respJson = SerializeResponse(reqCtx.Response); await httpResp.WriteAsync(respJson, httpContext.RequestAborted); reqCtx.Metrics.HttpRequestDuration = AppTime.GetDuration(start); } catch (Exception ex) { // this ex is at attempt to write response as json; we try to write it as plain text and return something await WriteExceptionsAsTextAsync(httpContext, new[] { ex }); } }
public RequestContext(GraphQLServer server, GraphQLRequest rawRequest, CancellationToken cancellationToken = default, ClaimsPrincipal user = null, RequestQuota quota = null, object httpContext = null) { Server = server; RawRequest = rawRequest; _externalCancellationToken = cancellationToken; User = user; HttpContext = httpContext; StartTimestamp = AppTime.GetTimestamp(); Quota = quota ?? Server.DefaultRequestQuota ?? new RequestQuota(); // cancellation tokens, initial implementation of limiting request time by quota _cancellationTokenSource = new CancellationTokenSource(Quota.MaxRequestTime); _cancellationTokenSource.Token.Register(OnCancelled); if (_externalCancellationToken != default) { _externalCancellationToken.Register(OnExternalTokenCancelled); } }