123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- <?php
- namespace App\Module;
- use Exception;
- @error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
- class Ihttp
- {
- public static function ihttp_request($url, $post = [], $extra = [], $timeout = 60, $retRaw = false, $isGb2312 = false) {
- $urlset = parse_url($url);
- if(empty($urlset['path'])) {
- $urlset['path'] = '/';
- }
- if(!empty($urlset['query'])) {
- $urlset['query'] = "?{$urlset['query']}";
- }
- if(empty($urlset['port'])) {
- $urlset['port'] = $urlset['scheme'] == 'https' ? '443' : '80';
- }
- if (Base::strExists($url, 'https://') && !extension_loaded('openssl')) {
- if (!extension_loaded("openssl")) {
- return Base::retError('请开启您PHP环境的openssl');
- }
- }
- if(function_exists('curl_init') && function_exists('curl_exec')) {
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $urlset['scheme']. '://' .$urlset['host'].($urlset['port'] == '80' ? '' : ':'.$urlset['port']).$urlset['path'].$urlset['query']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- if($post) {
- if (is_array($post)) {
- $filepost = false;
- foreach ($post as $name => $value) {
- if (is_string($value) && substr($value, 0, 1) == '@') {
- $filepost = true;
- break;
- }
- }
- if (!$filepost) {
- $post = http_build_query($post);
- }
- }
- curl_setopt($ch, CURLOPT_POST, 1);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
- }
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
- curl_setopt($ch, CURLOPT_SSLVERSION, 1);
- if (defined('CURL_SSLVERSION_TLSv1')) {
- curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
- }
- curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1');
- if (!empty($extra) && is_array($extra)) {
- $headers = array();
- foreach ($extra as $opt => $value) {
- if (Base::strExists($opt, 'CURLOPT_')) {
- curl_setopt($ch, constant($opt), $value);
- } elseif (is_numeric($opt)) {
- curl_setopt($ch, $opt, $value);
- } else {
- $headers[] = "{$opt}: {$value}";
- }
- }
- if(!empty($headers)) {
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
- }
- }
- $data = curl_exec($ch);
- //$status = curl_getinfo($ch);
- $errno = curl_errno($ch);
- $error = curl_error($ch);
- curl_close($ch);
- if($errno || empty($data)) {
- return Base::retError($error);
- } else {
- if ($isGb2312) {
- try { $data = iconv('GB2312', 'UTF-8', $data); }catch (Exception $e) { }
- }
- $response = self::ihttp_response_parse($data);
- if ($retRaw === true) {
- return Base::retSuccess($response['code'], $response);
- }
- return Base::retSuccess($response['code'], $response['content']);
- }
- }
- $method = empty($post) ? 'GET' : 'POST';
- $fdata = "{$method} {$urlset['path']}{$urlset['query']} HTTP/1.1\r\n";
- $fdata .= "Host: {$urlset['host']}\r\n";
- if(function_exists('gzdecode')) {
- $fdata .= "Accept-Encoding: gzip, deflate\r\n";
- }
- $fdata .= "Connection: close\r\n";
- if (!empty($extra) && is_array($extra)) {
- foreach ($extra as $opt => $value) {
- if (!Base::strExists($opt, 'CURLOPT_')) {
- $fdata .= "{$opt}: {$value}\r\n";
- }
- }
- }
- //$body = '';
- if ($post) {
- if (is_array($post)) {
- $body = http_build_query($post);
- } else {
- $body = urlencode((string)$post);
- }
- $fdata .= 'Content-Length: ' . strlen($body) . "\r\n\r\n{$body}";
- } else {
- $fdata .= "\r\n";
- }
- if($urlset['scheme'] == 'https') {
- $fp = fsockopen('ssl://' . $urlset['host'], $urlset['port'], $errno, $error);
- } else {
- $fp = fsockopen($urlset['host'], $urlset['port'], $errno, $error);
- }
- stream_set_blocking($fp, true);
- stream_set_timeout($fp, $timeout);
- if (!$fp) {
- return Base::retError( $error);
- } else {
- fwrite($fp, $fdata);
- $content = '';
- while (!feof($fp))
- $content .= fgets($fp, 512);
- fclose($fp);
- if ($isGb2312) {
- try { $content = iconv('GB2312', 'UTF-8', $content); }catch (Exception $e) { }
- }
- $response = self::ihttp_response_parse($content, true);
- if ($retRaw === true) {
- return Base::retSuccess($response['code'], $response);
- }
- return Base::retSuccess($response['code'], $response['content']);
- }
- }
- public static function ihttp_get($url) {
- return self::ihttp_request($url);
- }
- public static function ihttp_post($url, $data, $timeout = 60) {
- $headers = array('Content-Type' => 'application/x-www-form-urlencoded');
- return self::ihttp_request($url, $data, $headers, $timeout);
- }
- public static function ihttp_proxy($url, $post = [], $timeout = 20, $extra = []) {
- return self::ihttp_request($url, $post, $extra, $timeout);
- }
- private static function ihttp_response_parse($data, $chunked = false) {
- $rlt = array();
- $pos = strpos($data, "\r\n\r\n");
- if (Base::strExists(substr($data, 0, $pos), "Proxy-agent:")) {
- $data = substr($data, $pos + 4, strlen($data));
- $pos = strpos($data, "\r\n\r\n");
- }
- $split1[0] = substr($data, 0, $pos);
- $split1[1] = substr($data, $pos + 4, strlen($data));
- $split2 = explode("\r\n", $split1[0], 2);
- preg_match('/^(\S+) (\S+) (\S+)$/', $split2[0], $matches);
- $rlt['code'] = $matches[2];
- $rlt['status'] = $matches[3];
- $rlt['responseline'] = $split2[0];
- $header = explode("\r\n", $split2[1]);
- $isgzip = false;
- $ischunk = false;
- foreach ($header as $v) {
- $row = explode(':', $v);
- $key = trim($row[0]);
- $value = trim(substr($v, strlen($row[0]) + 1));
- if (is_array($rlt['headers'][$key])) {
- $rlt['headers'][$key][] = $value;
- } elseif (!empty($rlt['headers'][$key])) {
- $temp = $rlt['headers'][$key];
- unset($rlt['headers'][$key]);
- $rlt['headers'][$key][] = $temp;
- $rlt['headers'][$key][] = $value;
- } else {
- $rlt['headers'][$key] = $value;
- }
- if(!$isgzip && strtolower($key) == 'content-encoding' && strtolower($value) == 'gzip') {
- $isgzip = true;
- }
- if(!$ischunk && strtolower($key) == 'transfer-encoding' && strtolower($value) == 'chunked') {
- $ischunk = true;
- }
- }
- if($chunked && $ischunk) {
- $rlt['content'] = self::ihttp_response_parse_unchunk($split1[1]);
- } else {
- $rlt['content'] = $split1[1];
- }
- if($isgzip && function_exists('gzdecode')) {
- $rlt['content'] = gzdecode($rlt['content']);
- }
- $rlt['meta'] = $data;
- if($rlt['code'] == '100') {
- return self::ihttp_response_parse($rlt['content']);
- }
- return $rlt;
- }
- private static function ihttp_response_parse_unchunk($str = null) {
- if(!is_string($str) or strlen($str) < 1) {
- return false;
- }
- $eol = "\r\n";
- $add = strlen($eol);
- $tmp = $str;
- $str = '';
- do {
- $tmp = ltrim($tmp);
- $pos = strpos($tmp, $eol);
- if($pos === false) {
- return false;
- }
- $len = hexdec(substr($tmp, 0, $pos));
- if(!is_numeric($len) or $len < 0) {
- return false;
- }
- $str .= substr($tmp, ($pos + $add), $len);
- $tmp = substr($tmp, ($len + $pos + $add));
- $check = trim($tmp);
- } while(!empty($check));
- unset($tmp);
- return $str;
- }
- }
|