public static async Task <TResponsePayload> PostProtoPayload <TRequest, TResponsePayload>(this System.Net.Http.HttpClient client, string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy) where TRequest : IMessage <TRequest> where TResponsePayload : IMessage <TResponsePayload>, new() { Debug.WriteLine($"Requesting {typeof(TResponsePayload).Name}"); var response = await PostProto <TRequest>(client, url, requestEnvelope); while (response.Returns.Count == 0) { var operation = await strategy.HandleApiFailure(requestEnvelope, response); if (operation == ApiOperation.Abort) { break; } response = await PostProto <TRequest>(client, url, requestEnvelope); } if (response.Returns.Count == 0) { throw new InvalidResponseException(); } strategy.HandleApiSuccess(requestEnvelope, response); //Decode payload //todo: multi-payload support var payload = response.Returns[0]; var parsedPayload = new TResponsePayload(); parsedPayload.MergeFrom(payload); return(parsedPayload); }
public static async Task <IMessage[]> PostProtoPayload <TRequest>(this System.Net.Http.HttpClient client, string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy, params Type[] responseTypes) where TRequest : IMessage <TRequest> { var result = new IMessage[responseTypes.Length]; for (var i = 0; i < responseTypes.Length; i++) { result[i] = Activator.CreateInstance(responseTypes[i]) as IMessage; if (result[i] == null) { throw new ArgumentException($"ResponseType {i} is not an IMessage"); } } //check if the last request was sent less than 350ms ago if (_delayTime.HasValue && _delayTime.Value > DateTime.Now) { //delay as needed await Task.Delay(_delayTime.Value.Subtract(DateTime.Now)); } ResponseEnvelope response; while ((response = await PostProto <TRequest>(client, url, requestEnvelope)).Returns.Count != responseTypes.Length) { var operation = await strategy.HandleApiFailure(requestEnvelope, response); if (operation == ApiOperation.Abort) { throw new InvalidResponseException($"Expected {responseTypes.Length} responses, but got {response.Returns.Count} responses"); } } //set _delay time ahed 350ms _delayTime = DateTime.Now.AddMilliseconds(450); strategy.HandleApiSuccess(requestEnvelope, response); for (var i = 0; i < responseTypes.Length; i++) { var payload = response.Returns[i]; result[i].MergeFrom(payload); } return(result); }
public static async Task <IMessage[]> PostProtoPayload <TRequest>(this System.Net.Http.HttpClient client, string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy, params Type[] responseTypes) where TRequest : IMessage <TRequest> { var result = new IMessage[responseTypes.Length]; for (var i = 0; i < responseTypes.Length; i++) { result[i] = Activator.CreateInstance(responseTypes[i]) as IMessage; if (result[i] == null) { throw new ArgumentException($"ResponseType {i} is not an IMessage"); } } ResponseEnvelope response; while ((response = await PostProto <TRequest>(client, url, requestEnvelope)).Returns.Count != responseTypes.Length) { var operation = await strategy.HandleApiFailure(requestEnvelope, response); if (operation == ApiOperation.Abort) { throw new InvalidResponseException($"Expected {responseTypes.Length} responses, but got {response.Returns.Count} responses"); } } strategy.HandleApiSuccess(requestEnvelope, response); for (var i = 0; i < responseTypes.Length; i++) { var payload = response.Returns[i]; result[i].MergeFrom(payload); } //Logger.Error(result.ToString()); return(result); }
public async Task <TResponsePayload> PostProtoPayload <TRequest, TResponsePayload>(string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy) where TRequest : IMessage <TRequest> where TResponsePayload : IMessage <TResponsePayload>, new() { Debug.WriteLine($"Requesting {typeof(TResponsePayload).Name}"); var urlArray = new[] { url }; var response = await PostProto <TRequest>(url, requestEnvelope); while (response.Returns.Count == 0) { var operation = await strategy.HandleApiFailure(urlArray, requestEnvelope, response); if (operation == ApiOperation.Abort) { break; } response = await PostProto <TRequest>(urlArray[0], requestEnvelope); } // TODO: statuscode = 3 probably means ban! if (response.Returns.Count == 0) { throw new InvalidResponseException(); } strategy.HandleApiSuccess(requestEnvelope, response); //Decode payload //todo: multi-payload support var payload = response.Returns[0]; var parsedPayload = new TResponsePayload(); parsedPayload.MergeFrom(payload); return(parsedPayload); }
public static TResponsePayload PostProtoPayload <TRequest, TResponsePayload>( this System.Net.Http.HttpClient httpClient, string url, RequestEnvelope requestEnvelope, IApiFailureStrategy strategy) where TRequest : IMessage <TRequest> where TResponsePayload : IMessage <TResponsePayload>, new() { var response = PerformThrottledRemoteProcedureCall <TRequest>(httpClient, url, requestEnvelope).Result; while (response.Returns.Count == 0) { Logger.Debug("Handling Failure"); var operation = strategy.HandleApiFailure(requestEnvelope, response); if (operation == ApiOperation.Abort) { break; } response = PerformThrottledRemoteProcedureCall <TRequest>(httpClient, url, requestEnvelope).Result; } if (response.Returns.Count == 0) { throw new InvalidResponseException(); } strategy.HandleApiSuccess(requestEnvelope, response); //Decode payload //TODO: multi-payload support var payload = response.Returns[0]; var parsedPayload = new TResponsePayload(); parsedPayload.MergeFrom(payload); return(parsedPayload); }