$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); $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] = ucwords($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); } }