Node.js中實現HTTP 206內容分區(1)
介紹
在本文中,我會闡述HTTP狀態206 分部分內容 的基礎概念,並使用Node.js一步步地實現它. 我們還將用一個基於它用法最常見情境的樣本來測試代碼:一個能夠在任何時間點開始播放視頻檔案的HTML5頁面.
Partial Content 的簡要介紹
HTTP 的 206 Partial Content 狀態代碼和其相關的訊息頭提供了讓瀏覽器以及其他使用者代理程式從伺服器接收部分內容而不是全部內容,這樣一種機制. 這一機制被廣泛使用在一個被大多數瀏覽器和諸如Windows Media Player和VLC Player這樣的播放器所可使用視訊檔案的傳輸上.
基礎的流程可以用下面這幾步描述:
讓我們來看看這幾個步驟中的每一個關鍵訊息頭.
Accept-Ranges: 位元組bytes)
這是會有伺服器發送的位元組頭,展示可以被分部分發送給瀏覽器的內容. 這個值聲明了可被接受的每一個範圍請求, 大多數情況下是位元組數 bytes.
Range: 位元組數bytes)=(開始)-(結束)
這是瀏覽器告知伺服器所需分部分內容約制的訊息頭. 注意開始和結束位置是都包括在內的,而且是從0開始的. 這個訊息頭也可以不發送兩個位置,其含義如下:
Content-Range:位元組數bytes)=(開始)-(結束)/(總數)
這個訊息頭將會跟隨 HTTP 狀態代碼 206 一起出現. 開始和結束的值展示了當前內容的範圍. 跟 Range 訊息頭一樣, 兩個值都是包含在內的,並且也是從零開始的. 總數這個值聲明了可用位元組的總數.
Content-Range: */(總數)
這個頭資訊和上面一個是一樣的,不過是用另一種格式,並且僅在返回HTTP狀態代碼416時被發送。其中總數代表了本文總共可用的位元組數。
這裡有一對有2048個位元組檔案的例子。注意省略起點和重點的區別。
請求開始的1024個位元組
瀏覽器發送:
- GET /dota2/techies.mp4 HTTP/1.1
- Host: localhost:8000
- Range: bytes=0-1023
伺服器返回:
- HTTP/1.1 216 Partial Content
- Date: Mon, 15 Sep 2014 22:19:34 GMT
- Content-Type: video/mp4
- Content-Range: bytes 0-1023/2048
- Content-Length: 1024
-
- (Content...)
沒有終點位置的請求
瀏覽器發送:
- GET /dota2/techies.mp4 HTTP/1.1
- Host: localhost:8000
- Range: bytes=1024-
伺服器返回:
- HTTP/1.1 216 Partial Content
- Date: Mon, 15 Sep 2014 22:19:34 GMT
- Content-Type: video/mp4
- Content-Range: bytes 1024-2047/2048
- Content-Length: 1024
-
- (Content...)
注意:伺服器並不需要在單個響應中返回所有剩下的位元組,特別是當本文太長或者有其他效能的考慮。所以下面的兩個例子在這種情況下也是可接受的:
- Content-Range: bytes 1024-1535/2048
- Content-Length: 512
伺服器僅返回剩餘本文的一半。下一次請求的範圍將從第1536個位元組開始。
- Content-Range: bytes 1024-1279/2048
- Content-Length: 256
伺服器僅返回剩餘本文的256個位元組。下一次請求的範圍將從第1280個位元組開始。
伺服器返回:
- HTTP/1.1 216 Partial Content
- Date: Mon, 15 Sep 2014 22:19:34 GMT
- Content-Type: video/mp4
- Content-Range: bytes 1536-2047/2048
- Content-Length: 512
-
- (Content...)
請求停用範圍:
瀏覽器發送:
- GET /dota2/techies.mp4 HTTP/1.1
- Host: localhost:8000
- Range: bytes=1024-4096
伺服器返回:
- HTTP/1.1 416 Requested Range Not Satisfiable
- Date: Mon, 15 Sep 2014 22:19:34 GMT
- Content-Range: bytes */2048
理解了工作流程和頭部資訊後,現在我們可以用Node.js去實現這個機制。