Parse HTTP рд░реЗрдВрдЬ рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛

рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ, рдореБрдЭреЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП HTTP рд░реЗрдВрдЬ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ RFC 2616 рдХрд╛ рдПрдХ рднреА рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред рдПрдХ рдХреЛрдб рдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдХрдИ рд░реЗрдВрдЬ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рджреВрд╕рд░рд╛ рдЬреЛ рдорд╛рдирдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдмрдбрд╝реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреАрд╕рд░рд╛ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣реА рдФрд░ рдЕрдЧрдореНрдп рдЕрдиреБрд░реЛрдз рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдорд╛рдирдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рднреА рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рд╡рд┐рд╡рд░рдг рдФрд░ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ PHP рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рдорд╛рдирдХ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рд╢реНрд░реЗрдгреА рдХреНрд╡реЗрд░реА рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рд░реЗрдВрдЬ рдХрд╛ рдЖрдпрд╛рдо рдФрд░ рдЪрдпрди рдирд┐рдпрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред RFC 2616 рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХрдорд╛рддреНрд░ рд░реЗрдВрдЬ рдЖрдпрд╛рдо рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрдИ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ HTTP рд░реЗрдВрдЬ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

рдкрд╣рд▓рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИред рдкрд╣рд▓реА рд╕реНрдерд┐рддрд┐ рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИ рдпрд╛ рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдЙрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдЖрдХрд╛рд░ рд╣реИред 1 рд╕реЗ рдХрдоред рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдмрд┐рдирд╛ рдЗрд╕рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдХрд╛рд░ рдореЗрдВ 10 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП, bytes=1-9 9 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд┐рдХрд╛рдп рдХреЗ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рджреВрд╕рд░рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд┐рдХрд╛рдп рдХреЗ рдЕрдВрддрд┐рдо рдПрди рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЪрдпрди рд╣реИред рдпрджрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рд╕реЗ рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рдкреВрд░реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, bytes=-2 рдЕрдВрддрд┐рдо 2 рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

рд╕рднреА рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реАрдорд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреИрд░-рд╢реВрдиреНрдп рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╕рд░реНрд╡рд░ SHOULD рдХреНрд▓рд╛рдЗрдВрдЯ 416 (рдЕрдиреБрд░реЛрдзрд┐рдд рд╕реАрдорд╛ рд╕рдВрддреЛрд╖рдЬрдирдХ рдирд╣реАрдВ) рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ 206 (рдЖрдВрд╢рд┐рдХ рд╕рд╛рдордЧреНрд░реА)ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ "рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рд╕рдВрдЧрдд" рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдорд╛рдирдХ рдХреА рд╕рднреА рд╢рд░реНрддреЗрдВ рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рд░реЗрдВрдЬ рдЕрдиреБрд░реЛрдз рдХрд╛ рдкреВрд░реНрдг рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

PHP рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг:

 <?php namespace HTTP; /* * Copyright (c) 2012, aignospam@gmail.com * http://www.opensource.org/licenses/bsd-license.php */ /** * Parse HTTP Range header * http://tools.ietf.org/html/rfc2616#section-14.35 * return array of Range on success * false on syntactically invalid byte-range-spec * empty array on unsatisfiable bytes-range-set * @param int $entity_body_length * @param string range_header * @return array|bool */ function parse_range_request($entity_body_length, $range_header) { $range_list = array(); if ($entity_body_length == 0) { return $range_list; // mark unsatisfiable } // The only range unit defined by HTTP/1.1 is "bytes". HTTP/1.1 // implementations MAY ignore ranges specified using other units. // Range unit "bytes" is case-insensitive if (preg_match('/^bytes=([^;]+)/i', $range_header, $match)) { $range_set = $match[1]; } else { return false; } // Wherever this construct is used, null elements are allowed, but do // not contribute to the count of elements present. That is, // "(element), , (element) " is permitted, but counts as only two elements. $range_spec_list = preg_split('/,/', $range_set, null, PREG_SPLIT_NO_EMPTY); foreach ($range_spec_list as $range_spec) { $range_spec = trim($range_spec); if (preg_match('/^(\d+)\-$/', $range_spec, $match)) { $first_byte_pos = $match[1]; if ($first_byte_pos > $entity_body_length) { continue; } $first_pos = $first_byte_pos; $last_pos = $entity_body_length - 1; } elseif (preg_match('/^(\d+)\-(\d+)$/', $range_spec, $match)) { $first_byte_pos = $match[1]; $last_byte_pos = $match[2]; // If the last-byte-pos value is present, it MUST be greater than or // equal to the first-byte-pos in that byte-range-spec if ($last_byte_pos < $first_byte_pos) { return false; } $first_pos = $first_byte_pos; $last_pos = min($entity_body_length - 1, $last_byte_pos); } elseif (preg_match('/^\-(\d+)$/', $range_spec, $match)) { $suffix_length = $match[1]; if ($suffix_length == 0) { continue; } $first_pos = $entity_body_length - min($entity_body_length, $suffix_length); $last_pos = $entity_body_length - 1; } else { return false; } $range_list[] = new Range($first_pos, $last_pos); } return $range_list; } class Range { private $_first_pos; private $_last_pos; public function __construct($first_pos, $last_pos) { $this->_first_pos = $first_pos; $this->_last_pos = $last_pos; } public function get_first_pos() { return $this->_first_pos; } public function get_last_pos() { return $this->_last_pos; } } ?> 

Source: https://habr.com/ru/post/In138504/


All Articles