У меня WAR WAR Spring Boot 2.0 с использованием WebMVC со встроенным Tomcat 8.5, и я размещаю свои статические ресурсы из WAR.
Запрос на статический ресурс, включающий Range: bytes=0-
, завершается неудачно с HTTP 416 (Range Not Satisfiable), тогда как тот же запрос без заголовка Range
работает нормально.
Только для контекста, рассматриваемый статический файл - это видео .mp4
, которое браузер запрашивает с заголовком Range
, поскольку на файл ссылается элемент video
.
Проходя через отладчик, я вижу причину в том, что HttpRange.toResourceRegion()
не может определить длину ресурса. (Вернее, возвращаемая длина -1
.) Причина в том, что, поскольку URL ресурса не является URL файла, он пытается открыть соединение с URL и вызвать getContentLength()
в соединении, а WarURLConnection
этого не делает. переопределить реализацию URLConnection
по умолчанию, возвращающую -1
.
Я хочу назвать это ошибкой в Spring и / или встроенным Tomcat, но если бы это было так, я чувствую, что кто-то другой уже сообщил бы об этом (и я не могу найти никаких доказательств этого). Я делаю что-то необычное здесь?
Или, может быть, это действительно работает для всех остальных? Может, есть какой-то волшебный весенний конфиг, который я пропустил? (Я сомневаюсь, что это связано с автоконфигурацией Spring Boot, но я должен упомянуть здесь, что у меня большая часть этого пока отключена, так как я переношу не-Boot приложение в Boot.)
Я понимаю, что, возможно, смогу обойти эту проблему, обработав этот запрос ресурса «вручную» (и, при необходимости, используя пользовательскую реализацию Resource
), но, похоже, мне не нужно было это делать. Это похоже на то, что должно работать из коробки.