Przykładowa sesja żądania zakresu http

91

Czy mogę pokazać przykładową sesję http z żądaniami zakresu. Mam na myśli, jakie byłyby nagłówki żądań i odpowiedzi?

Chamal
źródło
2
Kilka miesięcy temu została opublikowana nowa wersja standardu HTTP / 1.1. Ma specjalny dokument RFC dla żądań zakresu, jest o wiele bardziej czytelny niż stara specyfikacja, w tym przykłady dla wielu elementów: tools.ietf.org/html/rfc7233
Thirler

Odpowiedzi:

136

Poniższa wymiana dotyczy przeglądarki Chrome i statycznego serwera WWW, pobierając wideo MP4.

Pierwsza prośba - o wideo. Zwróć uwagę na Accept-Rangesnagłówek odpowiedzi, aby wskazać, że serwer obsługuje nagłówek zakresu:

GET /BigBuckBunny_320x180.mp4
        Cache-Control: max-age=0
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range:
        Accept: text/html,application/xhtml+xml,application/xml,*/*
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Accept-Encoding: gzip,deflate,sdch
        Accept-Charset: ISO-8859-1,utf-8,*
200 OK
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 64657027
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:24 GMT

Wykryto nagłówek zakresu w poprzedniej odpowiedzi - kolejne żądanie z otwartym zakresem w celu potwierdzenia wsparcia. Odpowiedź zwraca stan 206 i Content-Rangenagłówek wskazujący bajty obecne w treści odpowiedzi:

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=0-
        Accept: */*
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 64657027
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 0-64657026/64657027

Kolejne żądanie zakresu w celu przechwycenia końca pliku (prawdopodobnie w celu przechwycenia końcowych metadanych):

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=64312833-64657026
        Accept: */*
        If-Range: A023EF02BD589BC472A2D6774EAE3C58
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 344194
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 64312833-64657026/64657027

Użytkownik klika pasek postępu wideo poza pobranym zakresem - wysyłane jest żądanie zakresu, aby rozpocząć grę od wybranej pozycji:

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=1073152-64313343
        Accept: */*
        If-Range: A023EF02BD589BC472A2D6774EAE3C58
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 63240192
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 1073152-64313343/64657027
johnstok
źródło
7
Czy pusty nagłówek Transfer-Encoding jest artefaktem sposobu przechwytywania komunikacji HTTP, czy też istnieje prawdziwy serwer HTTP generujący puste wartości dla tego nagłówka?
swl10
7
W pierwszym przypadku wygląda na to, że serwer zwraca 64657027 bajtów treści. Więc co się dzieje - czy klient po prostu wyrzuca tę zawartość, a następnie wysyła zapytanie o zakres części, których naprawdę potrzebuje? A może serwer nie zwraca żadnej treści, ponieważ coś w wiadomości klienta mówi, że nie rób tego. Jeśli tak, co to jest?
Morrie
3
@Morrie - wygląda na to, że serwer, wiedząc, że sam obsługuje żądania zakresu, mówi klientowi „Akceptuję żądania zakresu” za pośrednictwem Accept-Ranges: bytesnagłówka, ale wysyła również długość treści zasobu, aby klient mógł wysyłać żądania dotyczące zakresu z wyższą uwiązany. Nic w komunikacie klienta nie mówi, że rób to, o ile wiem - serwer może wybrać odpowiedź „tutaj jest cały zasób” lub „Akceptuję żądania dotyczące zakresu” - co znowu oznacza istnienie Accept-Rangesnagłówka. W każdym razie tak to rozumiem.
Simon Whitehead,
4
Ale czy długość zawartości wynosząca 64657027 w pierwszej odpowiedzi nie oznacza, że ​​w rzeczywistości po nagłówku znajduje się tyle bajtów ładunku, które klient musi wykorzystać, ponieważ połączenie jest utrzymywane? Zastanawiam się, co w tym komunikacie odpowiedzi mówi, że w rzeczywistości nie ma żadnego ładunku.
Morrie
1
@Morrie Keep-alive to żądanie od klienta i klient nie ma żadnego obowiązku dalszego korzystania z połączenia. W mojej pracy właśnie doszedłem do wniosku, że przynajmniej w przypadku Chrome, pierwsze żądanie GET z zakresem „0-” jest natychmiast przerywane, gdy tylko zostanie odebrany nagłówek, zamiast używać żądania HEAD. Uważam, że jest to sposób na uniknięcie problemów z każdym serwerem, który może nie implementować poprawnie czasownika HEAD.
Zoomulator,