2010-02-05 47 views
8

Có cách nào để phân tích cú pháp tiêu đề HTTP_RANGE chính xác trong PHP không? Nghĩ rằng tôi sẽ hỏi ở đây trước khi tái phát minh ra bánh xe.Phân tích cú pháp tiêu đề HTTP_RANGE trong PHP

Tôi hiện đang sử dụng

preg_match('/bytes=(\d+)-(\d+)/', $_SERVER['HTTP_RANGE'], $matches); 

để phân tích các tiêu đề nhưng điều đó không bao gồm tất cả các giá trị có thể có của các tiêu đề để tôi tự hỏi nếu có một chức năng hoặc thư viện mà có thể làm được điều này chưa?

Xin cảm ơn trước.

+0

Tôi không biết cách nào để làm điều này, nhưng tôi sẽ có một vết nứt với biểu thức thông thường. Hãy xem các đặc điểm kỹ thuật http://tools.ietf.org/html/draft-ietf-http-range-retrieval-00 –

Trả lời

10

Thay sử dụng regex để kiểm tra nó trước khi gửi một 416. Sau đó, chỉ cần phân tích cú pháp bằng cách phát trên dấu phẩy , và dấu gạch nối -. Tôi cũng thấy rằng bạn đã sử dụng \d+ trong regex của mình, nhưng thực tế là số không phải là. Khi một trong các chỉ mục phạm vi bị bỏ qua, thì nó chỉ có nghĩa là "byte đầu tiên" hoặc "byte cuối cùng". Bạn nên bao gồm điều đó trong regex của bạn là tốt. Xem thêm Range header in the HTTP spec cách bạn phải xử lý.

Kickoff dụ:

if (isset($_SERVER['HTTP_RANGE'])) { 
    if (!preg_match('^bytes=\d*-\d*(,\d*-\d*)*$', $_SERVER['HTTP_RANGE'])) { 
     header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
     header('Content-Range: bytes */' . filelength); // Required in 416. 
     exit; 
    } 

    $ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6)); 
    foreach ($ranges as $range) { 
     $parts = explode('-', $range); 
     $start = $parts[0]; // If this is empty, this should be 0. 
     $end = $parts[1]; // If this is empty or greater than than filelength - 1, this should be filelength - 1. 

     if ($start > $end) { 
      header('HTTP/1.1 416 Requested Range Not Satisfiable'); 
      header('Content-Range: bytes */' . filelength); // Required in 416. 
      exit; 
     } 

     // ... 
    } 
} 

Edit: $ bắt đầu phải luôn luôn ít hơn $ cuối

+0

Cảm ơn, điều này đã làm việc hoàn hảo! –

+1

Bạn được chào đón. Tuyên bố từ chối trách nhiệm: chưa được kiểm tra. Điều này ít được dịch hơn trong phần đầu từ ví dụ Java Servlet của tôi tại đây: http://balusc.blogspot.com/2009/02/fileservlet-supporting-resume-and.html – BalusC

+0

Bạn đã tiết kiệm cho tôi số giờ làm việc bằng cách chia sẻ Java Servlet của bạn thực hiện! Cám ơn rất nhiều. – shadit

2

Taken từ PEAR Package HTTP_Download:

function getRanges() 
{ 
    return preg_match('/^bytes=((\d*-\d*,? ?)+)$/', @$_SERVER['HTTP_RANGE'], $matches) ? $matches[1] : array(); 
} 

Nó cũng là một ý tưởng tốt để sử dụng thispackages cho các nội dung như thế này!

Các vấn đề liên quan