У меня есть 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, которую я пропустил? (Я сомневаюсь, что это связано с автоматической настройкой Spring Boot, но я должен упомянуть здесь, что большая часть этого отключена на данный момент, поскольку я переношу приложение без загрузки в Boot.)
Я понимаю, что, возможно, смогу обойти эту проблему, обработав этот запрос ресурсов «вручную» (и при необходимости используя пользовательскую реализацию Resource
), но, похоже, мне не нужно этого делать. Это похоже на то, что должно работать из коробки.