static async Task AwaitHandleCall(HttpApiServerCallContext serverCallContext, Method <TRequest, TResponse> method, bool isStreaming, JsonSerializerOptions serializerOptions, Task handleCall) { try { await handleCall; await serverCallContext.EndCallAsync(); } catch (Exception ex) { await serverCallContext.ProcessHandlerErrorAsync(ex, method.Name, isStreaming, serializerOptions); } }
public void CancellationToken_Get_MatchHttpContextRequestAborted() { // Arrange var cts = new CancellationTokenSource(); var httpContext = CreateHttpContext(cancellationToken: cts.Token); var serverCallContext = new HttpApiServerCallContext(httpContext, string.Empty); // Act var ct = serverCallContext.CancellationToken; // Assert Assert.AreEqual(cts.Token, ct); }
protected override async Task HandleCallAsyncCore(HttpContext httpContext, HttpApiServerCallContext serverCallContext) { // Decode request var request = await JsonRequestHelpers.ReadMessage <TRequest>(serverCallContext, SerializerOptions); var streamWriter = new HttpContextStreamWriter <TResponse>(serverCallContext, SerializerOptions); try { await _invoker.Invoke(httpContext, serverCallContext, request, streamWriter); } finally { streamWriter.Complete(); } }
protected override async Task HandleCallAsyncCore(HttpContext httpContext, HttpApiServerCallContext serverCallContext) { var request = await JsonRequestHelpers.ReadMessage <TRequest>(serverCallContext, SerializerOptions); var response = await _invoker.Invoke(httpContext, serverCallContext, request); if (serverCallContext.Status.StatusCode != StatusCode.OK) { throw new RpcException(serverCallContext.Status); } if (response == null) { // This is consistent with Grpc.Core when a null value is returned throw new RpcException(new Status(StatusCode.Cancelled, "No message returned from method.")); } httpContext.Response.StatusCode = StatusCodes.Status200OK; httpContext.Response.ContentType = MediaType.ReplaceEncoding("application/json", serverCallContext.RequestEncoding); await JsonRequestHelpers.SendMessage(serverCallContext, SerializerOptions, response); }
public Task HandleCallAsync(HttpContext httpContext) { var serverCallContext = new HttpApiServerCallContext(httpContext, MethodInvoker.Options, MethodInvoker.Method, DescriptorInfo, Logger); httpContext.Features.Set <IServerCallContextFeature>(serverCallContext); try { var handleCallTask = HandleCallAsyncCore(httpContext, serverCallContext); if (handleCallTask.IsCompletedSuccessfully) { return(serverCallContext.EndCallAsync()); } else { return(AwaitHandleCall(serverCallContext, MethodInvoker.Method, IsStreaming, SerializerOptions, handleCallTask)); } } catch (Exception ex) { return(serverCallContext.ProcessHandlerErrorAsync(ex, MethodInvoker.Method.Name, IsStreaming, SerializerOptions)); }
public void RequestHeaders_Get_PopulatedFromHttpContext() { // Arrange var httpContext = CreateHttpContext(); httpContext.Request.Headers.Add("TestName", "TestValue"); httpContext.Request.Headers.Add(":method", "GET"); httpContext.Request.Headers.Add("grpc-encoding", "identity"); httpContext.Request.Headers.Add("grpc-timeout", "1S"); httpContext.Request.Headers.Add("hello-bin", Convert.ToBase64String(new byte[] { 1, 2, 3 })); var serverCallContext = new HttpApiServerCallContext(httpContext, string.Empty); // Act var headers = serverCallContext.RequestHeaders; // Assert Assert.AreEqual(2, headers.Count); Assert.AreEqual("testname", headers[0].Key); Assert.AreEqual("TestValue", headers[0].Value); Assert.AreEqual("hello-bin", headers[1].Key); Assert.AreEqual(true, headers[1].IsBinary); Assert.AreEqual(new byte[] { 1, 2, 3 }, headers[1].ValueBytes); }