Czytałem http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 i próbowałem dowiedzieć się, jak kontynuować pobieranie pliku.
Na przykład załóżmy, że plik ma długość 100 bajtów, a ja mam wszystkie 100 bajtów. Jednak nie wiem, jaki powinien być oczekiwany rozmiar pliku, więc pytam o plik i określam nagłówek Range, który wygląda następująco:
Range: bytes=100-
Czy to prawidłowe żądanie dotyczące zakresu?
http
http-headers
header
dhruvbird
źródło
źródło
Odpowiedzi:
Jest to żądanie poprawne składniowo, ale nie spełniające wymagań. Jeśli spojrzysz dalej w tej sekcji, zobaczysz:
Więc myślę, że w twoim przykładzie serwer powinien zwrócić 416, ponieważ nie jest to prawidłowy zakres bajtów dla tego pliku.
źródło
Jak zasugerował Wrikken , jest to poprawne żądanie. Jest to również dość powszechne, gdy klient żąda nośnika lub wznawia pobieranie.
Klient często sprawdza, czy serwer obsługuje żądania z zakresu innych niż tylko szukanie
Accept-Ranges
odpowiedzi. Chrome zawsze wysyłaRange: bytes=0-
z pierwszym żądaniem GET filmu, więc nie można tego odrzucić.Za każdym razem, gdy klient dołącza
Range:
do swojego żądania, nawet jeśli jest źle sformułowany, oczekuje odpowiedzi częściowej zawartości (206). Kiedy szukasz do przodu podczas odtwarzania wideo HTML5, przeglądarka żąda tylko punktu początkowego. Na przykład:Tak więc, aby klient mógł prawidłowo odtwarzać wideo, Twój serwer musi być w stanie obsłużyć te niekompletne żądania zakresu.
Typ „zakresu” określony w pytaniu możesz obsłużyć na dwa sposoby:
Najpierw możesz odpowiedzieć z żądanym punktem początkowym podanym w odpowiedzi, a następnie całkowitą długością pliku minus jeden (żądany zakres bajtów jest indeksowany przez zero). Na przykład:
Żądanie:
Odpowiedź:
Po drugie, możesz odpowiedzieć, podając punkt początkowy podany w żądaniu i otwartą długość (rozmiar) pliku. Dotyczy to transmisji internetowych lub innych mediów, w przypadku których całkowita długość nie jest znana. Na przykład:
Żądanie:
Odpowiedź:
Porady:
Musisz zawsze odpowiadać, podając długość treści zawartą w zakresie. Jeśli zakres jest kompletny, od początku do końca, długość treści jest po prostu różnicą:
Żądanie: zakres: bajty = 500-1000
Odpowiedź: Zakres zawartości: bajty 500-1000 / 123456
Pamiętaj, że zakres jest indeksowany przez zero, więc w
Range: bytes=0-999
rzeczywistości żąda 1000 bajtów, a nie 999, więc odpowiedz na przykład:Lub:
Ale jeśli to możliwe, unikaj tej drugiej metody, ponieważ niektóre odtwarzacze multimedialne próbują obliczyć czas trwania na podstawie rozmiaru pliku. Jeśli Twoje żądanie dotyczy treści multimedialnych, co jest moim przeczuciem, w odpowiedzi podaj czas jego trwania. Odbywa się to w następującym formacie:
To musi być zmiennoprzecinkowa. W przeciwieństwie do
Content-Length
tego ta wartość nie musi być dokładna. Służy do pomocy graczowi w wyszukiwaniu filmów. Jeśli transmitujesz transmisję internetową i masz tylko ogólne pojęcie o tym, jak długo to potrwa, lepiej jest uwzględnić szacowany czas trwania, a nie całkowicie go zignorować. Tak więc w przypadku dwugodzinnej transmisji internetowej możesz dołączyć coś takiego:W przypadku niektórych typów multimediów, takich jak webm, musisz również uwzględnić typ zawartości, na przykład:
Wszystko to jest niezbędne do prawidłowego odtwarzania multimediów, zwłaszcza w HTML5. Jeśli nie podasz czasu trwania, gracz może spróbować obliczyć czas trwania (aby umożliwić wyszukiwanie) na podstawie rozmiaru pliku, ale nie będzie to dokładne. Jest to w porządku i konieczne do transmisji internetowych lub transmisji na żywo, ale nie jest idealne do odtwarzania plików wideo. Możesz wyodrębnić czas trwania za pomocą oprogramowania takiego jak FFMPEG i zapisać go w bazie danych lub nawet w nazwie pliku.
X-Content-Duration
jest wycofywany na korzyśćContent-Duration
, więc to też bym uwzględnił. Podstawowa odpowiedź na żądanie „0-” zawierałaby co najmniej następujące elementy:Jeszcze jedna kwestia: Chrome zawsze rozpoczyna pierwsze żądanie wideo od następujących:
Niektóre serwery wyślą zwykłą odpowiedź 200 jako odpowiedź, którą zaakceptuje (ale z ograniczonymi opcjami odtwarzania), ale zamiast tego spróbuj wysłać 206, aby pokazać, że twój serwer obsługuje zakresy. RFC 2616 mówi, że ignorowanie nagłówków zakresów jest dopuszczalne.
źródło
W przeciwieństwie do odpowiedzi Marka Novakowskiego, która z jakiegoś powodu spotkała się z poparciem wielu, tak, jest to uzasadniona i satysfakcjonująca prośba.
W rzeczywistości standard, jak wskazał Wrikken, jest właśnie takim przykładem. W praktyce Firefox odpowiada na takie żądania zgodnie z oczekiwaniami (kodem 206) i właśnie tego używam do implementacji pobierania progresywnego, to znaczy otrzymuję tylko koniec długiego pliku dziennika, który rośnie w czasie rzeczywistym wraz z odpytywaniem.
źródło
Dla osób, które natkną się na powyższą odpowiedź Victora Stoddarda w 2019 r. I nabierają nadziei i łzawych oczu, zauważ, że:
a) Wsparcie dla X-Content-Duration zostało usunięte w Firefoksie 41: https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/41#HTTP
b) Myślę, że był obsługiwany tylko w Firefoksie dla audio i wideo .ogg, a nie dla innych typów.
c) Nie widzę, żeby kiedykolwiek było obsługiwane w Chrome, ale może to być po prostu brak badań z mojej strony. Jednak jego obecność lub brak wydaje się nie mieć żadnego wpływu w taki czy inny sposób na filmy webm lub ogv od dzisiaj w Chrome 71.
d) Nie mogę znaleźć miejsca, w którym „Content-Duration” zastąpiło „X-Content-Duration”, nie sądzę, że „X-Content-Duration” istniało wystarczająco długo, aby następna nazwa nagłówka była.
Myślę, że oznacza to, że od dzisiaj, jeśli chcesz udostępniać kontenery webm lub ogv, które zawierają strumienie, które nie znają czasu ich trwania (np. Wyjście potoku ffpeg), do Chrome lub FF i chcesz, aby można je było czyścić w element wideo HTML 5, prawdopodobnie nie masz szczęścia. Firefox 64.0 podejmuje połowiczną próbę uczynienia tych rzeczy łatwymi do szorowania, niezależnie od tego, czy obsługujesz żądania dotyczące zakresu, ale jest zdezorientowany i rzuca kołowrotkiem, dopóki strumień nie zostanie całkowicie pobrany, jeśli szukasz kilka razy więcej, niż uważa za stosowne. Chrome nawet nie próbuje, to po prostu nopes się i nie pozwoli Ci szorować wcale aż cały strumień jest gotowy do gry .
źródło