示例#1
0
        private static async Task <ZResponse> _RegisterRequestAndWaitResponseAsync(ZRequest request)
        {
            // create request metadata
            var requestMetadata = new ZRequestMetadata(request);

            // register request to help route the response back
            _requestsPool.Add(requestMetadata);

            if (_internalConnectionState)
            {
                // we are know that we connected to host, so just send it
                // and even if this is not the case, then the request will be rejected further down the pipeline
                _SendRequest(request);

                await _WaitResponseAsync(request, requestMetadata);
            }
            else
            {
                requestMetadata.Response.StatusCode = ZResponseStatusCode.Declined;
            }

            _requestsPool.Remove(requestMetadata);

            return(requestMetadata.Response);
        }
示例#2
0
        private static async Task _WaitResponseAsync(ZRequest request, ZRequestMetadata metadata)
        {
            if (request.Method == ZRequestMethod.Get)
            {
                // create request timeout task
                var timeoutTask = Task.Delay(RQ_TIMEOUT);

                // wait response or timeout
                var task = await Task.WhenAny(metadata.TaskCompletionSource.Task, timeoutTask);

                // check if it's rejected, or not
                // while waiting for a response, a disconnection may occur, which will close the request with the Rejected status
                if (task == timeoutTask || metadata.Response.StatusCode == RQ_DEFAULT_STATUS)
                {
                    // set result status code
                    metadata.Response.StatusCode = task == timeoutTask ? ZResponseStatusCode.Timeout : ZResponseStatusCode.Ok;
                }
            }
            else
            {
                metadata.Response.StatusCode = ZResponseStatusCode.Ok;
            }
        }