diff --git a/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java b/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java index 714cb9a..bc6ad70 100644 --- a/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java +++ b/src/main/java/cz/kamma/xtreamplayer/XtreamPlayerApplication.java @@ -248,37 +248,47 @@ public final class XtreamPlayerApplication { List attempts = candidateUris(target); HttpResponse response = null; URI usedTarget = target; + List attemptErrors = new ArrayList<>(); for (URI candidate : attempts) { - HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(candidate) - .GET() - .timeout(Duration.ofSeconds(60)) - .header("User-Agent", firstNonBlank( - exchange.getRequestHeaders().getFirst("User-Agent"), - DEFAULT_BROWSER_UA - )) - .header("Accept", firstNonBlank( - exchange.getRequestHeaders().getFirst("Accept"), - "*/*" - )); - copyRequestHeaderIfPresent(exchange, requestBuilder, "Range"); - copyRequestHeaderIfPresent(exchange, requestBuilder, "If-Range"); - if (!sourceUrl.isBlank()) { - requestBuilder.header("Referer", sourceUrl); - String origin = originFromUrl(sourceUrl); - if (!origin.isBlank()) { - requestBuilder.header("Origin", origin); + try { + HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(candidate) + .GET() + .timeout(Duration.ofSeconds(60)) + .header("User-Agent", firstNonBlank( + exchange.getRequestHeaders().getFirst("User-Agent"), + DEFAULT_BROWSER_UA + )) + .header("Accept", firstNonBlank( + exchange.getRequestHeaders().getFirst("Accept"), + "*/*" + )); + copyRequestHeaderIfPresent(exchange, requestBuilder, "Range"); + copyRequestHeaderIfPresent(exchange, requestBuilder, "If-Range"); + if (!sourceUrl.isBlank()) { + requestBuilder.header("Referer", sourceUrl); + String origin = originFromUrl(sourceUrl); + if (!origin.isBlank()) { + requestBuilder.header("Origin", origin); + } } - } - HttpRequest request = requestBuilder.build(); - HttpResponse candidateResponse = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray()); - response = candidateResponse; - usedTarget = candidate; - if (candidateResponse.statusCode() < 400) { - break; + HttpRequest request = requestBuilder.build(); + HttpResponse candidateResponse = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofByteArray()); + if (response == null || response.statusCode() >= 400) { + response = candidateResponse; + usedTarget = candidate; + } + if (candidateResponse.statusCode() < 400) { + response = candidateResponse; + usedTarget = candidate; + break; + } + } catch (Exception candidateException) { + attemptErrors.add(maskUri(candidate) + " -> " + compactError(candidateException)); + LOGGER.warn("Stream proxy candidate failed uri={}", maskUri(candidate), candidateException); } } if (response == null) { - writeJson(exchange, 502, errorJson("Unable to proxy stream: empty upstream response.")); + writeJson(exchange, 502, errorJson("Unable to proxy stream. Attempts: " + String.join(" | ", attemptErrors))); return; } String contentType = response.headers().firstValue("Content-Type").orElse("application/octet-stream");