Contoh sesi permintaan rentang http

91

Apakah mungkin untuk menunjukkan kepada saya contoh sesi http dengan permintaan jangkauan. Maksud saya, apa yang akan menjadi header permintaan dan tanggapan?

chamal
sumber
2
Beberapa bulan yang lalu versi baru dari standar HTTP / 1.1 diterbitkan. Ini memiliki RFC khusus untuk permintaan rentang, ini jauh lebih mudah dibaca daripada spesifikasi lama, termasuk contoh untuk banyak item: tools.ietf.org/html/rfc7233
Thirler

Jawaban:

136

Pertukaran berikut adalah antara Chrome dan server web statis, mengambil video MP4.

Permintaan awal - untuk video tersebut. Perhatikan Accept-Rangesheader respons untuk menunjukkan bahwa server memiliki dukungan header rentang:

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

Header rentang dalam respons sebelumnya terdeteksi - permintaan berikutnya dengan rentang terbuka untuk mengonfirmasi dukungan. Respons mengembalikan status 206 dan Content-Rangeheader untuk menunjukkan byte yang ada dalam isi respons:

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

Permintaan rentang selanjutnya untuk merekam akhir file (mungkin untuk menangkap metadata tambahan):

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

Pengguna mengklik di bilah kemajuan video di luar rentang yang diunduh - permintaan rentang dikeluarkan untuk mulai memutar dari posisi yang dipilih:

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
sumber
7
Apakah header Transfer-Encoding kosong merupakan artefak dari cara komunikasi HTTP ditangkap atau adakah server HTTP nyata di luar sana yang menghasilkan nilai kosong untuk header ini?
swl10
7
Dalam kasus pertama, sepertinya server mengembalikan 64657027 byte konten. Jadi apa yang terjadi - apakah klien hanya membuang konten itu, dan kemudian mengeluarkan permintaan rentang untuk bagian yang benar-benar diinginkan? Atau server tidak mengembalikan konten apa pun karena sesuatu dalam pesan klien mengatakan jangan lakukan itu. Jika ya, apakah itu?
Morrie
3
@Morrie - sepertinya server, mengetahui bahwa dirinya mendukung permintaan jangkauan, memberi tahu klien "Saya menerima permintaan rentang" melalui Accept-Ranges: bytesheader, tetapi juga mengirimkan panjang konten untuk sumber daya sehingga klien dapat membuat permintaan rentang dengan bagian atas terikat. Tidak ada dalam pesan klien yang mengatakan melakukan ini sejauh yang saya tahu - server dapat memilih untuk menanggapi dengan "di sini adalah seluruh sumber daya" atau "Saya menerima permintaan rentang" - yang sekali lagi adalah keberadaan Accept-Rangesheader. Itu adalah pemahaman saya tentang itu.
Simon Whitehead
4
Tetapi bukankah Panjang Konten 64657027 dalam respons pertama berarti bahwa sebenarnya ada banyak byte muatan setelah tajuk, yang harus dikonsumsi klien karena koneksinya adalah Keep-Alive? Saya bertanya-tanya dalam pesan tanggapan itu apa yang mengatakan bahwa sebenarnya tidak ada muatan apa pun.
Morrie
1
@Morrie Keep-hidup adalah permintaan dari klien dan klien tidak memiliki kewajiban untuk tetap menggunakan koneksi tersebut. Saya baru saja menyimpulkan dalam pekerjaan saya sendiri bahwa, setidaknya untuk chrome, permintaan GET pertama dengan rentang "0-" segera dibatalkan segera setelah header diterima, alih-alih menggunakan permintaan HEAD. Saya percaya bahwa ini adalah cara untuk menghindari masalah dengan server mana pun yang mungkin tidak menerapkan kata kerja HEAD dengan benar.
Zoomulator