📄 http.php
字号:
$secure=(strtolower($this->protocol)=="https"); while(($name=trim(UrlDecode($this->Tokenize("="))))!="") { $value=UrlDecode($this->Tokenize(";")); switch($name) { case "domain": $domain=$value; break; case "path": $path=$value; break; case "expires": if(ereg("^((Mon|Monday|Tue|Tuesday|Wed|Wednesday|Thu|Thursday|Fri|Friday|Sat|Saturday|Sun|Sunday), )?([0-9]{2})\\-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\-([0-9]{2,4}) ([0-9]{2})\\:([0-9]{2})\\:([0-9]{2}) GMT$",$value,$matches)) { $year=intval($matches[5]); if($year<1900) $year+=($year<70 ? 2000 : 1900); $expires="$year-".$this->months[$matches[4]]."-".$matches[3]." ".$matches[6].":".$matches[7].":".$matches[8]; } break; case "secure": $secure=1; break; } } if(strlen($this->SetCookie($cookie_name, $cookie_value, $expires, $path , $domain, $secure))) $this->error=""; } } } } //store cookie in session $_SESSION['cookies']=$this->cookies; $this->chunked=$chunked; return(""); } Function Authenticate(&$headers, $proxy, &$proxy_authorization, &$user, &$password, &$realm, &$workstation) { //require 'sasl.php'; if($proxy) { $authenticate_header="proxy-authenticate"; $authorization_header="Proxy-Authorization"; $authenticate_status="407"; $authentication_mechanism=$this->proxy_authentication_mechanism; } else { $authenticate_header="www-authenticate"; $authorization_header="Authorization"; $authenticate_status="401"; $authentication_mechanism=$this->authentication_mechanism; } if(IsSet($headers[$authenticate_header])) { if(function_exists("class_exists") && !class_exists("sasl_client_class")) return($this->SetError("the SASL client class needs to be loaded to be able to authenticate".($proxy ? " with the proxy server" : "")." and access this site")); if(GetType($headers[$authenticate_header])=="array") $authenticate=$headers[$authenticate_header]; else $authenticate=array($headers[$authenticate_header]); for($mechanisms=array(),$m=0;$m<count($authenticate);$m++) { $mechanism=$this->Tokenize($authenticate[$m]," "); if(strlen($authentication_mechanism)) { if(!strcmp($authentication_mechanism,$mechanism)) { $mechanisms[]=$mechanism; break; } } else $mechanisms[]=$mechanism; } $sasl=new sasl_client_class; if(IsSet($user)) $sasl->SetCredential("user",$user); if(IsSet($password)) $sasl->SetCredential("password",$password); if(IsSet($realm)) $sasl->SetCredential("realm",$realm); if(IsSet($workstation)) $sasl->SetCredential("workstation",$workstation); do { $status=$sasl->Start($mechanisms,$message,$interactions); } while($status==SASL_INTERACT); switch($status) { case SASL_CONTINUE: break; case SASL_NOMECH: return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".(strlen($authentication_mechanism) ? "authentication mechanism ".$authentication_mechanism." may not be used: " : "").$sasl->error)); default: return($this->SetError("Could not start the SASL ".($proxy ? "proxy " : "")."authentication client: ".$sasl->error)); } for(;;) { if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length))) return($error); if(strlen($body)==0) break; } $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".base64_encode($message) : ""); $arguments=array( "Headers"=>array( 'Host' => $this->host_name, 'User-Agent' => $this->request_headers['User-Agent'], $authorization_header=>$authorization_value, "Keep-Alive"=>"300" ) ); $arguments["RequestMethod"]='GET'; if(!$proxy && strlen($proxy_authorization)) $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization; if(strlen($error=$this->Close()) || strlen($error=$this->Open($arguments))) return($this->SetError($error)); $authenticated=0; $response=""; if(IsSet($message)) { if(strlen($error=$this->SendRequest($arguments)) || strlen($error=$this->ReadReplyHeadersResponse($headers))) return($this->SetError($error)); if(!IsSet($headers[$authenticate_header])) $authenticate=array(); elseif(GetType($headers[$authenticate_header])=="array") $authenticate=$headers[$authenticate_header]; else $authenticate=array($headers[$authenticate_header]); for($mechanism=0;$mechanism<count($authenticate);$mechanism++) { if(!strcmp($this->Tokenize($authenticate[$mechanism]," "),$sasl->mechanism)) { $response=$this->Tokenize(""); break; } } switch($this->response_status) { case "200": if($proxy) $proxy_authorization=$authorization_value; $authenticated=1; break; case "401": return '401'; break; case $authenticate_status: break; default: //if 30x,redirect or 40x,auth again if(is_numeric($this->response_status)) { $this->ReadReplyHeaders($headers); return ""; } if($proxy && !strcmp($this->response_status,"401")) { $proxy_authorization=$authorization_value; $authenticated=1; break; } return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message)); } } for(;!$authenticated;) { do { $status=$sasl->Step($response,$message,$interactions); } while($status==SASL_INTERACT); switch($status) { case SASL_CONTINUE: $authorization_value=$sasl->mechanism.(IsSet($message) ? " ".base64_encode($message) : ""); $arguments=array( "Headers"=>array( $authorization_header=>$authorization_value, "Keep-Alive"=>"300" ) ); if(!$proxy && strlen($proxy_authorization)) $arguments["Headers"]["Proxy-Authorization"]=$proxy_authorization; if(strlen($error=$this->SendRequest($arguments)) || strlen($error=$this->ReadReplyHeadersResponse($headers))) return($this->SetError($error)); switch($this->response_status) { case "200": if($proxy) $proxy_authorization=$authorization_value; $authenticated=1; break; case $authenticate_status: if(GetType($headers[$authenticate_header])=="array") $authenticate=$headers[$authenticate_header]; else $authenticate=array($headers[$authenticate_header]); for($response="",$mechanism=0;$mechanism<count($authenticate);$mechanism++) { if(!strcmp($this->Tokenize($authenticate[$mechanism]," "),$sasl->mechanism)) { $response=$this->Tokenize(""); break; } } for(;;) { if(strlen($error=$this->ReadReplyBody($body,$this->file_buffer_length))) return($error); if(strlen($body)==0) break; } $this->state="Connected"; break; default: if($proxy && !strcmp($this->response_status,"401")) { $proxy_authorization=$authorization_value; $authenticated=1; break; } return($this->SetError(($proxy ? "proxy " : "")."authentication error: ".$this->response_status." ".$this->response_message)); } break; default: return($this->SetError("Could not process the SASL ".($proxy ? "proxy " : "")."authentication step: ".$sasl->error)); } } } return(""); } Function ReadReplyHeaders(&$headers) { if($this->state!='GotReplyHeaders') if(strlen($error=$this->ReadReplyHeadersResponse($headers))) return($error); $proxy_authorization=""; switch($this->response_status) { case "100": $this->state="RequestSent"; return($this->ReadReplyHeaders($headers)); case "301": case "302": case "303": case "307": if($this->follow_redirect) { if(!IsSet($headers["location"]) || strlen($headers["location"])==0) return($this->SetError("3 it was received a redirect without location URL")); $location=$headers["location"]; if(strcmp($location[0],"/")) { $location_arguments=parse_url($location); if(!IsSet($location_arguments["scheme"])) $location=dirname($this->request_uri)."/".$location; } if(!strcmp($location[0],"/")) $location=$this->protocol."://".$this->host_name.($this->host_port ? ":".$this->host_port : "").$location; $error=$this->GetRequestArguments($location,$arguments); if(strlen($error)) return($this->SetError("could not process redirect url: ".$error)); $arguments["RequestMethod"]="GET"; if(strlen($error=$this->Close())==0 && strlen($error=$this->Open($arguments))==0 && strlen($error=$this->SendRequest($arguments))==0) { $this->redirection_level++; if($this->redirection_level>$this->redirection_limit) $error="it was exceeded the limit of request redirections"; else $error=$this->ReadReplyHeaders($headers); $this->redirection_level--; } $_SESSION['cookies']=$this->cookies; if(strlen($error)) return($this->SetError($error)); } break; case "407": if(strlen($error=$this->Authenticate($headers, 1, $proxy_authorization, $this->proxy_request_user, $this->proxy_request_password, $this->proxy_request_realm, $this->proxy_request_workstation))) return($error); if(strcmp($this->response_status,"401")) return(""); case "401": preg_match_all("'([a-z0-9]+)\s*realm=([\"\'])?(?(1) (.*?)\\2 | ([^\s]+) )'isx",$headers["www-authenticate"],$result); $auth=$result[1][0]; if(isset($_SESSION[$this->host_name.':'.$auth])) { list($this->request_user,$this->request_password)=split(':',$_SESSION[$this->host_name.':'.$auth]); } else { #show_auth_form($headers["www-authenticate"]); return ""; } $error=$this->Authenticate($headers, 0, $proxy_authorization, $this->request_user, $this->request_password, $this->request_realm, $this->request_workstation); if(is_numeric($error)) { return ""; } else return($error); } return(""); } Function ReadReplyBody(&$body,$length) { $body=""; if(strlen($this->error)) return($this->error); switch($this->state) { case "Disconnected": return($this->SetError("1 connection was not yet established")); case "Connected": return($this->SetError("2 request was not sent")); case "RequestSent": if(($error=$this->ReadReplyHeaders($headers))!="") return($error); break; case "GotReplyHeaders": break; default: return($this->SetError("3 can not get request headers in the current connection state")); } if($this->content_length_set) $length=min($this->content_length-$this->read_length,$length); if($length>0 && !$this->EndOfInput() && ($body=$this->ReadBytes($length))=="") { $version=explode(".",function_exists("phpversion") ? phpversion() : "3.0.7"); $php_version=intval($version[0])*1000000+intval($version[1])*1000+intval($version[2]); if($php_version<4003002 || ($php_version>4003004 && $php_version!=4003007) || !$this->EndOfInput()) return($this->SetError("4 could not get the request reply body: ".$this->error)); } $this->read_length+=strlen($body); return(""); } Function GetPersistentCookies(&$cookies) { $now=gmdate("Y-m-d H-i-s"); $cookies=array(); for($secure_cookies=0,Reset($this->cookies);$secure_cookies<count($this->cookies);Next($this->cookies),$secure_cookies++) { $secure=Key($this->cookies); for($domain=0,Reset($this->cookies[$secure]);$domain<count($this->cookies[$secure]);Next($this->cookies[$secure]),$domain++) { $domain_pattern=Key($this->cookies[$secure]); for(Reset($this->cookies[$secure][$domain_pattern]),$path_part=0;$path_part<count($this->cookies[$secure][$domain_pattern]);Next($this->cookies[$secure][$domain_pattern]),$path_part++) { $path=Key($this->cookies[$secure][$domain_pattern]); for(Reset($this->cookies[$secure][$domain_pattern][$path]),$cookie=0;$cookie<count($this->cookies[$secure][$domain_pattern][$path]);Next($this->cookies[$secure][$domain_pattern][$path]),$cookie++) { $cookie_name=Key($this->cookies[$secure][$domain_pattern][$path]); $expires=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]["expires"]; if($expires!="" && strcmp($now,$expires)<0) $cookies[$secure][$domain_pattern][$path][$cookie_name]=$this->cookies[$secure][$domain_pattern][$path][$cookie_name]; } } } } }};?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -