Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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();
            }
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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));
            }
Ejemplo n.º 6
0
        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);
        }