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); }
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; } }