Ejemplo n.º 1
0
        private async Task <bool> HttpServer_BeginRequest(HttpContext context, CancellationToken cancellationToken)
        {
            var request  = context.Request;
            var response = context.Response;

            Core.Log.LibVerbose("Request received from {0}:{1} to {2} {3}", request.RemoteAddress, request.RemotePort, request.Method, request.RawUrl);

            var clientId = Guid.NewGuid();
            var ccEvent  = ClientConnectEventArgs.Retrieve(clientId);

            OnClientConnect?.Invoke(this, ccEvent);
            ClientConnectEventArgs.Store(ccEvent);

            context.Response.ContentType = Serializer.MimeTypes[0];
            var responseBuffer = default(MultiArray <byte>);

            if (context.Request.Method == HttpMethod.GET && EnableGetDescriptors && OnGetDescriptorsRequest != null)
            {
                var eArgs = ServerDescriptorsEventArgs.Retrieve();
                OnGetDescriptorsRequest(this, eArgs);
                responseBuffer = Serializer.Serialize(eArgs.Descriptors);
                ServerDescriptorsEventArgs.Store(eArgs);
            }
            if (context.Request.Method == HttpMethod.POST && !(OnMethodCallAsync is null))
            {
                Counters.IncrementBytesReceived(context.Request.PostData.Length);
                var messageRq = Serializer.Deserialize <RPCRequestMessage>(context.Request.PostData);
                var eArgs     = MethodEventArgs.Retrieve(clientId, messageRq, cancellationToken);
                await OnMethodCallAsync.InvokeAsync(this, eArgs).ConfigureAwait(false);

                if (eArgs.Response != null)
                {
                    responseBuffer = Serializer.Serialize(eArgs.Response);
                    OnResponseSent?.Invoke(this, eArgs.Response);
                }
                MethodEventArgs.Store(eArgs);
            }
            await responseBuffer.CopyToAsync(response.OutputStream).ConfigureAwait(false);

            Counters.IncrementBytesSent(responseBuffer.Count);
            return(true);
        }