10 Stimmen

Das Parsen des HTTP_RANGE-Headers in PHP

Gibt es einen bereits vorhandenen Weg, um den HTTP_RANGE-Header korrekt in PHP zu analysieren? Ich dachte, ich frage hier, bevor ich das Rad neu erfinde.

Ich benutze derzeit

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

um den Header zu analysieren, aber das deckt nicht alle möglichen Werte des Headers ab, daher frage ich mich, ob es bereits eine Funktion oder Bibliothek gibt, die dies tun kann?

Vielen Dank im Voraus.

10voto

BalusC Punkte 1034465

Verwenden Sie lieber Regex, um es zu testen, bevor Sie einen 416 senden. Dann einfach nur durch Aufteilen am Komma , und am Bindestrich - analysieren. Ich sehe auch, dass Sie \d+ in Ihrem Regex verwendet haben, aber diese sind tatsächlich nicht erforderlich. Wenn eines der Bereichsindizes ausgelassen wird, bedeutet das einfach "erstes Byte" oder "letztes Byte". Sie sollten das auch in Ihrem Regex abdecken. Sehen Sie sich auch den Bereichsheader in der HTTP-Spezifikation an, wie Sie damit umgehen sollen.

Startbeispiel:

if (isset($_SERVER['HTTP_RANGE'])) {
    if (!preg_match('^bytes=\d*-\d*(,\d*-\d*)*$', $_SERVER['HTTP_RANGE'])) {
        header('HTTP/1.1 416 Angeforderter Bereich nicht zufriedenstellend');
        header('Content-Range: Bytes */' . filelength); // Erforderlich in 416.
        exit;
    }

    $ranges = explode(',', substr($_SERVER['HTTP_RANGE'], 6));
    foreach ($ranges as $range) {
        $parts = explode('-', $range);
        $start = $parts[0]; // Wenn dies leer ist, sollte dies 0 sein.
        $end = $parts[1]; // Wenn dies leer ist oder größer als filelength - 1 ist, sollte dies filelength - 1 sein.

        if ($start > $end) {
            header('HTTP/1.1 416 Angeforderter Bereich nicht zufriedenstellend');
            header('Content-Range: Bytes */' . filelength); // Erforderlich in 416.
            exit;
        }

        // ...
    }
}

Bearbeitung: $start muss immer kleiner sein als $end

2voto

powtac Punkte 39079

Aus dem PEAR Package HTTP_Download entnommen:

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

Es ist auch eine gute Idee, diese Pakete für solche Dinge zu verwenden!

1voto

Es gibt ein Snippet, das die HTTP-Range-Unterstützung auf der fread()-Seite implementiert:

http://www.php.net/manual/en/function.fread.php#84115

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X