@@ -29,9 +29,47 @@ var serve404 = function (response, path) {
2929var createServeFile = function ( fs , directory , config ) {
3030 var cache = Object . create ( null )
3131
32- return function ( filepath , response , transform , content , doNotCache ) {
32+ return function ( filepath , rangeHeader , response , transform , content , doNotCache ) {
3333 var responseData
3434
35+ var convertForRangeRequest = function ( ) {
36+ // If the header is invalid, ignore
37+ if ( ! rangeHeader . startsWith ( 'bytes=' ) ) {
38+ return 200
39+ }
40+
41+ responseData = new Buffer ( responseData )
42+
43+ var ranges = rangeHeader . substr ( 6 )
44+ if ( ranges . indexOf ( ',' ) >= 0 ) {
45+ // Multiple ranges are not supported.
46+ responseData = new Buffer ( 0 )
47+ return 416 // Requested range not satisfiable
48+ }
49+ var parts = / ^ ( [ 0 - 9 ] * ) - ( [ 0 - 9 ] * ) $ / . exec ( ranges )
50+ if ( ! parts || ( ! parts [ 1 ] && ! parts [ 2 ] ) ) {
51+ return 200
52+ }
53+ var start , end
54+ if ( parts [ 1 ] ) {
55+ start = Number ( parts [ 1 ] )
56+ end = parts [ 2 ] ? Number ( parts [ 2 ] ) : responseData . length
57+ } else {
58+ end = responseData . length
59+ start = responseData . length - Number ( parts [ 2 ] )
60+ }
61+ if ( end <= start ) {
62+ responseData = new Buffer ( 0 )
63+ return 416 // Requested range not satisfiable
64+ }
65+
66+ response . setHeader (
67+ 'Content-Range' ,
68+ 'bytes ' + start + '-' + end + '/' + responseData . length )
69+ responseData = responseData . slice ( start , end + 1 )
70+ return 206
71+ }
72+
3573 if ( directory ) {
3674 filepath = directory + filepath
3775 }
@@ -57,7 +95,12 @@ var createServeFile = function (fs, directory, config) {
5795 // call custom transform fn to transform the data
5896 responseData = transform && transform ( content ) || content
5997
60- response . writeHead ( 200 )
98+ if ( rangeHeader ) {
99+ var code = convertForRangeRequest ( )
100+ response . writeHead ( code )
101+ } else {
102+ response . writeHead ( 200 )
103+ }
61104
62105 log . debug ( 'serving (cached): ' + filepath )
63106 return response . end ( responseData )
@@ -77,7 +120,12 @@ var createServeFile = function (fs, directory, config) {
77120 // call custom transform fn to transform the data
78121 responseData = transform && transform ( data . toString ( ) ) || data
79122
80- response . writeHead ( 200 )
123+ if ( rangeHeader ) {
124+ var code = convertForRangeRequest ( )
125+ response . writeHead ( code )
126+ } else {
127+ response . writeHead ( 200 )
128+ }
81129
82130 log . debug ( 'serving: ' + filepath )
83131 return response . end ( responseData )
0 commit comments