ECSHOP curl 代理服務器設置(用於本地調試)

// 代理服務器 調試時使用代理,上線時註釋掉
            curl_setopt($ci, CURLOPT_PROXY, '127.0.0.1');
            curl_setopt($ci, CURLOPT_PROXYPORT, '8087');
<?php 

// HTTP 操作
/*============================================================================
**/

if (!defined('WEBSITE'))
{

    if(!function_exists('curl_init')) // 檢測是否支持 curl_init
    {
        define('CURL'  , false);
        if(function_exists('fsockopen')) // 檢測是否支持 fsockopen
        {
            define('FSOCK'  , true);
        }
        else
        {
            define('FSOCK'  , false);
        }
    }
    else
    {
        define('CURL'  , true);
    }


    class cls_http
    {
        public $error_msg = array();
        public $http_code;
        public $url;
        public $timeout = 60;
        public $connecttimeout = 30;
        public $ssl_verifypeer = FALSE;
        public $http_info;
        public static $boundary = '';



        function http($url, $method = 'GET', $parameters = array(), $multi = false) 
        {
            switch ($method) {
            case 'GET':
                if(!empty($parameters))
                {
                    $url = $url . '?' . http_build_query($parameters);
                }
                return $this->httpRequest($url, 'GET');
                break;
            case 'POST':
                if(is_array($parameters))
                {
                    $body = $this->get_params($parameters);

                    echo $body ;
                }
                else
                {
                    $body = $parameters;
                }
                return $this->httpRequest($url, $method, $body);
                break;
            default:
                $headers = array();
                if (!$multi && (is_array($parameters) || is_object($parameters)) ) {
                    $body = http_build_query($parameters);
                } else {
                    $body = self::build_http_query_multi($parameters);
                    $headers[] = "Content-Type: multipart/form-data; boundary=" . self::$boundary;
                }
                return $this->httpRequest($url, $method, $body, $headers);
                break;
            }
        }
        function httpRequest($url, $method, $postfields = NULL, $headers = array()) {

            if(!CURL)
            {
                if(FSOCK)
                {
                    $responseText = $this->fsockRequest($url , $method , $postfields , $headers);
                    return $responseText;
                }
                return false;
            }

            $this->http_info = array();
            $ci = curl_init();
            /* Curl settings */
            curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
            curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
            curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
            curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
            curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ci, CURLOPT_ENCODING, "");
            curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
            curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
            curl_setopt($ci, CURLOPT_HEADER, FALSE);


            switch ($method) {
                case 'POST':
                     curl_setopt ( $ci, CURLOPT_POST, TRUE );
                    if (!empty($postfields)) {
                            curl_setopt  ($ci, CURLOPT_POSTFIELDS, $postfields);
                            $this->postdata = $postfields;
                    }
                    break;
            }

            $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR'];
            curl_setopt($ci, CURLOPT_URL, $url );
            curl_setopt($ci, CURLOPT_HTTPHEADER, $headers );
            curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );

            // 代理服務器 調試時使用代理,上線時註釋掉
            curl_setopt($ci, CURLOPT_PROXY, '127.0.0.1');
            curl_setopt($ci, CURLOPT_PROXYPORT, '8087');

            $response = curl_exec($ci);

            $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
            $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
            $this->url = $url;
            curl_close ($ci);

            return $response;
        }

        /**
         * Get the header info to store.
         *
         * @return int
         * @ignore
         */
        function getHeader($ch, $header) {
            $i = strpos($header, ':');
            if (!empty($i)) {
                $key = str_replace('-', '_', strtolower(substr($header, 0, $i)));
                $value = trim(substr($header, $i + 2));
                $this->http_header[$key] = $value;
            }
            return strlen($header);
        }

        /**
         * @ignore
         */
        public static function build_http_query_multi($params) {
            if (!$params) return '';
            uksort($params, 'strcmp');
            $pairs = array();

            self::$boundary = $boundary = uniqid('------------------');
            $MPboundary = '--'.$boundary;
            $endMPboundary = $MPboundary. '--';
            $multipartbody = '';

            foreach ($params as $parameter => $value) {

                if( in_array($parameter, array('pic', 'image')) && $value{0} == '@' ) {
                    $url = ltrim( $value, '@' );
                    $content = file_get_contents( $url );
                    $array = explode( '?', basename( $url ) );
                    $filename = $array[0];

                    $multipartbody .= $MPboundary . "\r\n";
                    $multipartbody .= 'Content-Disposition: form-data; name="' . $parameter . '"; filename="' . $filename . '"'. "\r\n";
                    $multipartbody .= "Content-Type: image/unknown\r\n\r\n";
                    $multipartbody .= $content. "\r\n";
                } else {
                    $multipartbody .= $MPboundary . "\r\n";
                    $multipartbody .= 'content-disposition: form-data; name="' . $parameter . "\"\r\n\r\n";
                    $multipartbody .= $value."\r\n";
                }
            }
            $multipartbody .= $endMPboundary;
            return $multipartbody;
        }

        function get_params($p)
        {
            $str = '';
            foreach($p as $key => $val)
            {
                if(isset($str{1}))
                {
                    $str .= '&';
                }
                $str .= $key .'='.$val;
            }
            return $str;
        }


        //   NUM code
        //   String message
        //   String  附加錯誤
        function add_error($code , $message , $string ='') 
        {
            $this->error_msg['code'] = $code;
            $this->error_msg['message'] = $message;
            $this->error_msg['string'] = $string;
        }
        function echo_error( $str = '' )
        {
            echo $str ."\r\n";
            print_r( $this->error_msg );
            exit();
        }
        function get_error()
        {
            $string = '';
            $string .= '-code:'.$this->error_msg['code']."<br />\r\n<br />\r\n";
            $string .= '-message:'.$this->error_msg['message']."<br />\r\n<br />\r\n";
            $string .= '-Message2:'.$this->error_msg['string']."<br />\r\n<br />\r\n";
            return $string;
        }
        /*    模擬HTTP 提交數據
         *    @param public
         *    @param string $url 連接地址 
         *    @param string $method  模式 只有 GET POST
         *    @param string $postfields 提交的數據
         *    @param array  @headers 頭數據
         */

        function fsockRequest( $url, $method, $postfields = NULL, $headers = array() )
        {
            $urlarr     = parse_url($url);

            $errno      = '';
            $errstr     = '';
            $transports = '';
            $responseText = '';
            if($urlarr['scheme'] == 'https') {
                $transports = 'ssl://';
                $urlarr['port'] = '443';
            } else {
                $transports = 'tcp://';
                $urlarr['port'] = '80';
            }



            $fp = @fsockopen($transports . $urlarr['host'] , $urlarr['port'] , $errno , $errstr , $this->timeout);

            if(!$fp) {
                die("ERROR: $errno - ".ecs_iconv('GBK' , 'UTF8', $errstr)."<br />\r\n");
                return false;
            } else {
                if(!empty($urlarr['query']))
                {
                    $urlarr['path'] .= '?'.$urlarr['query'];
                }
                $urlarr['method'] = $method;
                //print_r($urlarr);

                $header = $method.' '. $urlarr['path'] ." HTTP/1.1\r\n";

                //fputs($fp, $method.' '. $urlarr['path'] ." HTTP/1.1\r\n");
                //fputs($fp, "Referer: " . $url ."\r\n");

                if($method == 'POST')
                {
                    $header .=  "Content-type: application/x-www-form-urlencoded\r\n";
                    $header .=  "Content-length: ".strlen($postfields)."\r\n";
                }

                $header .= "Host: ".$urlarr['host']."\r\n";
                $header .= "Connection: close\r\n\r\n";

                fputs($fp , $header);
                if($method == 'POST')  // 發送數據
                {
                    fputs($fp, $postfields . "\r\n\r\n");
                }

                while(!feof($fp)) {
                    $responseText .= @fgets($fp, 1024);
                }

                fclose($fp);
                $len = 0;

                $pos = strpos($responseText , 'Content-Length:');
                if($pos > 0)
                {
                    $pos += 15;
                    $len = intval(substr($responseText , $pos , stripos($responseText , "\r\n" , $pos) - $pos));
                }

                $responseText = trim(stristr($responseText,"\r\n\r\n"),"\r\n");

                if($len > 0)
                {
                    if(strlen($responseText) != $len)
                    {
                        $nowH = substr($responseText , 0 , strpos($responseText , "\r\n"));
                        if(strlen($responseText) - strlen($nowH) + 2 == $len)
                        {
                            $responseText = substr($responseText , strpos($responseText , "\r\n") + 2);
                        }
                    }
                }
                else
                {
                    $responseText = trim(substr($responseText , strpos($responseText , "\r\n") + 2) , "\r\n");
                    $responseText = substr($responseText , 0 ,  strrpos($responseText  ,"\r\n"));
                }
                return $responseText;
            }
        }
    }
}
?>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章