IEnumerator InternalRequest(UnityWebRequest request, Action <string> onSucceed, Action onError, bool printSucceed = false, bool printError = false) { if (attemptsCounter.ContainsKey(request.url)) { attemptsCounter[request.url]++; } else { attemptsCounter[request.url] = 1; } yield return(request.SendWebRequest()); if (request.isNetworkError || request.isHttpError) { if (attemptsCounter[request.url] < maxAttempts) { print(request.error); print("New attempt " + request.method + " " + attemptsCounter[request.url] + " for " + UnityWebRequest.UnEscapeURL(request.url)); StartCoroutine(InternalRequest(request.Clone(), onSucceed, onError, printSucceed, printError)); } else { onError?.Invoke(); if (printError) { print("Failed code:" + request.responseCode + " after " + maxAttempts + " attempts " + request.error + " (" + UnityWebRequest.UnEscapeURL(request.url) + ")"); } attemptsCounter.Remove(request.url); } } else { onSucceed?.Invoke(request.downloadHandler.text); if (printSucceed) { print("print onSucceed : " + request.url + "\n" + request.downloadHandler.text); } attemptsCounter.Remove(request.url); } }