| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 | <?phpnamespace Qiniu\Http;use Qiniu\Config;use Qiniu\Http\Request;use Qiniu\Http\Response;final class Client{    public static function get($url, array $headers = array())    {        $request = new Request('GET', $url, $headers);        return self::sendRequest($request);    }    public static function delete($url, array $headers = array())    {        $request = new Request('DELETE', $url, $headers);        return self::sendRequest($request);    }    public static function post($url, $body, array $headers = array())    {        $request = new Request('POST', $url, $headers, $body);        return self::sendRequest($request);    }    public static function PUT($url, $body, array $headers = array())    {        $request = new Request('PUT', $url, $headers, $body);        return self::sendRequest($request);    }    public static function multipartPost(        $url,        $fields,        $name,        $fileName,        $fileBody,        $mimeType = null,        array $headers = array()    ) {        $data = array();        $mimeBoundary = md5(microtime());        foreach ($fields as $key => $val) {            array_push($data, '--' . $mimeBoundary);            array_push($data, "Content-Disposition: form-data; name=\"$key\"");            array_push($data, '');            array_push($data, $val);        }        array_push($data, '--' . $mimeBoundary);        $finalMimeType = empty($mimeType) ? 'application/octet-stream' : $mimeType;        $finalFileName = self::escapeQuotes($fileName);        array_push($data, "Content-Disposition: form-data; name=\"$name\"; filename=\"$finalFileName\"");        array_push($data, "Content-Type: $finalMimeType");        array_push($data, '');        array_push($data, $fileBody);        array_push($data, '--' . $mimeBoundary . '--');        array_push($data, '');        $body = implode("\r\n", $data);        // var_dump($data);exit;        $contentType = 'multipart/form-data; boundary=' . $mimeBoundary;        $headers['Content-Type'] = $contentType;        $request = new Request('POST', $url, $headers, $body);        return self::sendRequest($request);    }    private static function userAgent()    {        $sdkInfo = "QiniuPHP/" . Config::SDK_VER;        $systemInfo = php_uname("s");        $machineInfo = php_uname("m");        $envInfo = "($systemInfo/$machineInfo)";        $phpVer = phpversion();        $ua = "$sdkInfo $envInfo PHP/$phpVer";        return $ua;    }    public static function sendRequest($request)    {        $t1 = microtime(true);        $ch = curl_init();        $options = array(            CURLOPT_USERAGENT => self::userAgent(),            CURLOPT_RETURNTRANSFER => true,            CURLOPT_SSL_VERIFYPEER => false,            CURLOPT_SSL_VERIFYHOST => false,            CURLOPT_HEADER => true,            CURLOPT_NOBODY => false,            CURLOPT_CUSTOMREQUEST => $request->method,            CURLOPT_URL => $request->url,        );        // Handle open_basedir & safe mode        if (!ini_get('safe_mode') && !ini_get('open_basedir')) {            $options[CURLOPT_FOLLOWLOCATION] = true;        }        if (!empty($request->headers)) {            $headers = array();            foreach ($request->headers as $key => $val) {                array_push($headers, "$key: $val");            }            $options[CURLOPT_HTTPHEADER] = $headers;        }        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));        if (!empty($request->body)) {            $options[CURLOPT_POSTFIELDS] = $request->body;        }        curl_setopt_array($ch, $options);        $result = curl_exec($ch);        $t2 = microtime(true);        $duration = round($t2 - $t1, 3);        $ret = curl_errno($ch);        if ($ret !== 0) {            $r = new Response(-1, $duration, array(), null, curl_error($ch));            curl_close($ch);            return $r;        }        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);        $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);        $headers = self::parseHeaders(substr($result, 0, $header_size));        $body = substr($result, $header_size);        curl_close($ch);        return new Response($code, $duration, $headers, $body, null);    }    private static function parseHeaders($raw)    {        $headers = array();        $headerLines = explode("\r\n", $raw);        foreach ($headerLines as $line) {            $headerLine = trim($line);            $kv = explode(':', $headerLine);            if (count($kv) > 1) {                $kv[0] =self::ucwordsHyphen($kv[0]);                $headers[$kv[0]] = trim($kv[1]);            }        }        return $headers;    }    private static function escapeQuotes($str)    {        $find = array("\\", "\"");        $replace = array("\\\\", "\\\"");        return str_replace($find, $replace, $str);    }        private static function ucwordsHyphen($str)    {        return str_replace('- ', '-', ucwords(str_replace('-', '- ', $str)));    }}
 |