| 
<?php// Function needed to parse Digest params
 // can be replaced by a php extension (http://php.net/manual/fa/function.http-parse-params.php)
 function __http_parse_nextParam($param, $offset = 0){
 ;$next_pos = array(
 strpos($param, ",", $offset)
 ,    strpos($param, ";", $offset)
 )
 ;if ($next_pos[0] === $next_pos[1]) return $next_pos[0]
 ;else if ($next_pos[0] === false) return $next_pos[1]
 ;else if ($next_pos[1] === false) return $next_pos[0]
 ;else return min($next_pos[0], $next_pos[1])
 ;
 }
 function http_parse_params($param){
 ;$res = array()
 ;$offset = 0
 ;while (true) {
 ;$next_pos = __http_parse_nextParam($param, $offset)
 ;if (trim($frag = $next_pos !== false ? substr($param, $offset, $next_pos - $offset)
 : substr($param, $offset))) {
 // No quote
 ;if (!preg_match("#^\s*([^=\s]+)\s*=\s*\"([^\"]*)#", $frag, $match)) {
 ;if (preg_match("#^\s*([^=\s]+)\s*=\s*([^\s]+)\s*$#", $frag, $match))
 $res[$match[1]] = $match[2]
 ;else array_push($res, trim($frag))
 ;if ($next_pos === false) break
 ;$offset = $next_pos + 1
 ;
 // With quote
 } else {
 ;$cut = $offset + strlen($match[0])
 ;$offset = $cut
 ;if (substr($param, $offset, 1) === "\"") {
 ;$res[$match[1]] = str_replace("\\\"", "\"", $match[2])
 ;if ($next_pos === false) break
 ;$offset = __http_parse_nextParam($param, $offset + 1)
 ;
 } else {
 ;while (($eof = strpos($param, "\"", $offset)) !== false) {
 ;$frag = substr($param, $offset, $eof - $offset)
 ;if (preg_match("#\\\\+$#", $frag, $match_escape)) {
 ;if (!(strlen($match_escape[0]) % 2))
 break
 ;
 } else break
 ;$offset = $eof+1
 ;
 }
 ;$res[$match[1]] = str_replace("\\\"", "\"", $match[2].($eof === false
 ? substr($param, $cut) : substr($param, $cut, $eof - $cut)))
 ;if ($eof === false
 || ($offset = __http_parse_nextParam($param, $eof)) === false)
 break
 ;
 }
 ;$offset++
 ;
 }
 } else if ($next_pos === false) break
 ;else $offset = $next_pos + 1
 ;
 }
 ;return (object)array('params' => $res)
 ;
 }
 
 |