php中的local-proxy,用php实现proxy功能的示范_PHP

/***************************************/

/* */

/* Php Http Proxy */

/* version: 0.0.2 */

/* last modify: 2005.1.12 */

/* author: q3boy*/

/* */

/***************************************/set_time_limit(180);define('PP_ERROR_CODE',1);define('PP_ERROR_MESSAGE',2);define('PP_ERROR_ALL',3);define('PP_RETURN_STRING',1);define('PP_RETURN_ARRAY',2);define('PP_RETURN_ALL',3);

classCPhpProxy{

var$_strUrl;

var$_arrArgv;

var$_strRef;

var$_arrUrl;

var$_resSocket;

var$_intError;

var$_strError;

var$_arrDefaultArrayUrl;

var$_arrDefaultPort;

functionCPhpProxy($strUrl=null,$arrArgv= array()) {$this->init();is_null($strUrl)?'':$this->setUrl($strUrl);is_null($arrArgv['refer'])?'':$this->setRef($arrArgv['refer']);$this->proxy($strUrl,$arrArgv);

}

functionsetError($intError,$mixArgv=null) {$this->_intError=$intError;

if($intError==1001) {$this->_strError="调用 $mixArgv 方法时参数传递出错, 枚举值不存在";

}elseif($intError==1) {$this->_strError="url 错误, url 格式不正确.\n".$mixArgvs;

}elseif($intError==2) {$this->_strError="url 错误, 目前尚未支持此协议.\n".$mixArgvs;

}elseif($intError==3) {$this->_strError="无法打开 ".$this->_arrUrl['host'].':'.$this->_arrUrl['port']."\n".$mixArgv[0].': '.$mixArgv[1];

}

Returnfalse;

}

functiongetError($enumReturnType=PP_ERROR_CODE) {

if($enumReturnType==PP_ERROR_ALL) {

Return array(str_pad($this->_intError,5,'0',STR_PAD_LEFT),$this->_strError);

}elseif($enumReturnType==PP_ERROR_MESSAGE) {

Return$this->_strError;

}elseif($enumReturnType==PP_ERROR_CODE) {

Return$this->_intError;

}else {

Returnfalse;

}

}

functioninit() {$this->_strUrl=null;$this->_arrArgv= array();$this->_strRef=null;$this->_arrUrl= array();$this->_resSocket=null;$this->_intError=0;$this->_strError='there is no error';//arrurl 默认值$this->_arrDefaultArrayUrl= array('protocol'=>'http','file'=>'index.htm');//默认端口$this->_arrDefaultPort=array('http'=>'80');

Returntrue;

}

functionsetUrl($strUrl) {$strUrl=trim($strUrl);//正则$reg="/^(([\w]+):\/\/)?([^:|\/|@]*:)?([^:|\/|@]*@)?([\w|\-|\.]+)(:\d+)?(\/[^\?|#]*)?(\?[^#]*)?(#.*)?$/is";

if(!preg_match($reg,$strUrl,$arrUrl)) {

Return$this->setError(1,$strUrl);

}else {//拆解匹配数组list($tmp,$tmp,$arr['protocol'],$arr['user'],$arr['pass'],$arr['host'],$arr['port'],$arr['path'],$arr['query'],$arr['anchor']) =$arrUrl;//默认协议if(!$arr['protocol']) {$arrUrl[1] =$this->_arrDefaultArrayUrl['protocol'].'://';

}//设 filename$arr['file'] =basename($arr['path']);//默认值foreach($this->_arrDefaultArrayUrlas$key=>$val) {

if($arr[$key] =='') {$arr[$key] =$val;

}

}//默认端口if(is_null($this->_arrDefaultPort[$arr['protocol']])) {

Return$this->setError(2,$arr['protocol']);

}elseif(!$arr['port']) {$arr['port'] =$this->_arrDefaultPort[$arr['protocol']];

}//设 uri$arr['uri'] = ($arr['path']?$arr['path']:'/') . ($arr['query']?'?'.$arr['query']:'') . ($arr['anchor']?'#'.$arr['anchor']:'');//设 urlunset($arrUrl[0]);

unset($arrUrl[2]);$this->_strUrl=implode('',$arrUrl);//设 arrurl$this->_arrUrl=$arr;

Returntrue;

}

}

functiongetUrl($enumReturnType=PP_RETURN_ARRAY) {

if($enumReturnType==PP_RETURN_STRING) {

Return$this->_strUrl;

}elseif($enumReturnType==PP_RETURN_ARRAY) {

Return$this->_arrUrl;

}if($enumReturnType==PP_RETURN_ALL) {

Return array($this->_strUrl,$this->_arrUrl);

}else {

Return$this->setError(1001);

}

}

functionsetRefer($strRef) {$this->_strRef=trim($strRef);

Returntrue;

}

functiongetRefer() {

Return$this->_strRef;

}

functiongetProxyUrl() {

global$_SERVER;

list($strProcotol) =explode('/',strtolower(trim($_SERVER['SERVER_PROTOCOL'])));$str=$strProcotol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?u='.urlencode($this->getUrl(PP_RETURN_STRING)).

($this->getRefer()?('&r='.urlencode($this->getRefer())):'');

Return$str;

}

functionopenSocket() {$arr=$this->getUrl();$this->_resSocket= @fsockopen($arr['host'],$arr['port'],$intError,$strError,30);

if(!$this->_resSocket) {$this->_resSocket=null;

Return$this->setError(3,array($intError,$strError));

}else {

Returntrue;

}

}

functiongetRequest() {

Return$this->{'get'.ucfirst($this->_arrUrl['protocol']).'Request'}();

}

functionsendRequest() {

Returnfwrite($this->_resSocket,$this->getRequest());

}

functionflushResponse() {

Return$this->{'flush'.ucfirst($this->_arrUrl['protocol']).'Response'}();

}

functiongetHttpRequest() {$arr=$this->getUrl();$arrRequest=getallheaders();$arrRequest['Host'] =$arr['host'];$strRequest="GET ".$arr['uri']." HTTP/1.1\r\n";

foreach($arrRequestas$key=>$val) {$strRequest.="$key: $val\r\n";

}$strRequest.="\r\n";

Return$strRequest;

}

functionflushHttpResponse() {$bolHeader=true;

while (!feof($this->_resSocket)) {$str=fgets($this->_resSocket,4096);

if($bolHeader) {

@header($str);

}else {

echo($str);

}

if($bolHeader&&$str=="\r\n") {$bolHeader=false;

@header("Content-type: application/gzip");

@header('Content-Disposition: attachment; filename="'.$this->_arrUrl['file'].'"');

}

}

Returntrue;

}

functionclose() {fclose($this->_resSocket);$this->_resSocket=null;

Returntrue;

}

functionproxy($strUrl=null,$arrArgv= array()) {

if(!is_null($this->getUrl(PP_RETURN_STRING)) &&$this->openSocket() &&$this->sendRequest() &&$this->flushResponse()) {

echo(123);$this->close();

}else {

Returnfalse;

}

}

}

if(sizeof($_GET)) {$strGetArrayName='_GET';

}elseif(sizeof($HTTP_GET_VARS)) {$strGetArrayName='HTTP_GET_VARS';

}else {

die('

PhpProxy

.$_SERVER['PHP_SELF'].'">

PhpProxy

URL:

REFERER:

');

}$strUrl=trim(${$strGetArrayName}['u']);

if($strUrl=='') {

die('请输入 url 地址.');

}//get referer$strRefTmp=trim(${$strGetArrayName}['r']);//初始化 proxy 类$objProxy= newCPhpProxy();//设置 url 和 refer$objProxy->setUrl($strUrl);$objProxy->setRefer($strRef);//错误输出if($objProxy->getError()) {

die($objProxy->getError(PP_ERROR_MESSAGE));

}//echo url for downloadif(${$strGetArrayName}['act']=='make') {

die("

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值