WC_Download_Handler::get_download_range
Parse the HTTP_RANGE request from iOS devices. Does not support multi-range requests.
Method of the class: WC_Download_Handler{}
No Hooks.
Returns
Array. Information about range download request: beginning and length of file chunk, whether the range is valid/supported and whether the request is a range request.
Usage
$result = WC_Download_Handler::get_download_range( $file_size );
- $file_size(int) (required)
- Size of file in bytes.
WC_Download_Handler::get_download_range() WC Download Handler::get download range code WC 10.5.0
protected static function get_download_range( $file_size ) {
$start = 0;
$download_range = array(
'start' => $start,
'is_range_valid' => false,
'is_range_request' => false,
);
if ( ! $file_size ) {
return $download_range;
}
$end = $file_size - 1;
$download_range['length'] = $file_size;
if ( isset( $_SERVER['HTTP_RANGE'] ) ) { // @codingStandardsIgnoreLine.
$http_range = sanitize_text_field( wp_unslash( $_SERVER['HTTP_RANGE'] ) ); // WPCS: input var ok.
$download_range['is_range_request'] = true;
$c_start = $start;
$c_end = $end;
// Extract the range string.
list( , $range ) = explode( '=', $http_range, 2 );
// Make sure the client hasn't sent us a multibyte range.
if ( strpos( $range, ',' ) !== false ) {
return $download_range;
}
/*
* If the range starts with an '-' we start from the beginning.
* If not, we forward the file pointer
* and make sure to get the end byte if specified.
*/
if ( '-' === $range[0] ) {
// The n-number of the last bytes is requested.
$c_start = $file_size - substr( $range, 1 );
} else {
$range = explode( '-', $range );
$c_start = ( isset( $range[0] ) && is_numeric( $range[0] ) ) ? (int) $range[0] : 0;
$c_end = ( isset( $range[1] ) && is_numeric( $range[1] ) ) ? (int) $range[1] : $file_size;
}
/*
* Check the range and make sure it's treated according to the specs: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html.
* End bytes can not be larger than $end.
*/
$c_end = ( $c_end > $end ) ? $end : $c_end;
// Validate the requested range and return an error if it's not correct.
if ( $c_start > $c_end || $c_start > $file_size - 1 || $c_end >= $file_size ) {
return $download_range;
}
$start = $c_start;
$end = $c_end;
$length = $end - $start + 1;
$download_range['start'] = $start;
$download_range['length'] = $length;
$download_range['is_range_valid'] = true;
}
return $download_range;
}