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 async Task <IMessage[]> PostProtoPayload <TRequest>(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"); } } var urlArray = new[] { url }; ResponseEnvelope response; while ((response = await PostProto <TRequest>(urlArray[0], requestEnvelope)).Returns.Count != responseTypes.Length) { var operation = await strategy.HandleApiFailure(urlArray, 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); } return(result); }
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 PerformThrottledRemoteProcedureCall <TRequest>(client, url, requestEnvelope); while (response.Returns.Count == 0) { var operation = await strategy.HandleApiFailure(requestEnvelope, response); if (operation == ApiOperation.Abort) { break; } response = await PerformThrottledRemoteProcedureCall <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 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); }