Я использую новые классы java.net.http
для обработки асинхронного обмена HTTP-запросами + ответами и пытаюсь найти способ, чтобы BodySubscriber обрабатывал различные типы кодирования, такие как gzip.
Однакоотображение BodySubsriber<InputStream>
таким образом, чтобы нижележащий поток был обернут GZIPInputStream
(когда в заголовке ответа найдено «Content-Encoding: gzip»), приводит к зависанию.Без исключений, только полное прекращение действия.
Код, который отображает BodySubscriber
, выглядит следующим образом:
private HttpResponse.BodySubscriber<InputStream> gzippedBodySubscriber(
HttpResponse.ResponseInfo responseInfo) {
return HttpResponse.BodySubscribers.mapping(
HttpResponse.BodySubscribers.ofInputStream(),
this::decodeGzipStream);
}
private InputStream decodeGzipStream(InputStream gzippedStream) {
System.out.println("Entered decodeGzipStream method.");
try {
InputStream decodedStream = new GZIPInputStream(gzippedStream);
System.out.println(
"Created GZIPInputStream to handle response body stream.");
return decodedStream;
} catch (IOException ex) {
System.out.println("IOException occurred while trying to create GZIPInputStream.");
throw new UncheckedIOException(ex);
}
}
Получение ответа HTTP с кодировкой "gzip" приводит кконсоль, показывающая только это:
Введен метод EncodedBodyHandler.apply.Введен метод decodeGzipStream.
Больше ничего не видно, поэтому строка после вызова конструктора GZIPInputStream
никогда не выполняется.
Кто-нибудь знает, почему эта попытка обернуть InputStream
из BodySubscriber<InputStream>
в GZIPInputStream
висит?
Примечание: эквивалентный метод для тел без ответа (необработанный текст) HTTP-ответов содержит просто вызов BodySubscribers.ofInputStream()
без сопоставления, и это позволяетответ должен быть получен и отображен без проблем.