Пример #1
0
 public function testExceptionGet()
 {
     $httpCore = null;
     $exception = false;
     try {
         $httpCore = new RequestCore("http://www.notexistsitexx.com");
         $httpCore->set_body("");
         $httpCore->set_method("GET");
         $httpCore->connect_timeout = 10;
         $httpCore->timeout = 10;
         $res = $httpCore->send_request();
     } catch (RequestCore_Exception $e) {
         $exception = true;
     }
     $this->assertTrue($exception);
 }
Пример #2
0
 public function testGetSignedUrlForPuttingObjectFromFile()
 {
     $file = __FILE__;
     $object = "a.file";
     $timeout = 3600;
     $options = array('Content-Type' => 'txt');
     try {
         $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
         $request = new RequestCore($signedUrl);
         $request->set_method('PUT');
         $request->add_header('Content-Type', 'txt');
         $request->set_read_file($file);
         $request->set_read_stream_size(filesize($file));
         $request->send_request();
         $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
         $this->assertTrue($res->isOK());
     } catch (OssException $e) {
         $this->assertFalse(true);
     }
 }
Пример #3
0
 /**
  * 验证并且执行请求,按照OSS Api协议,执行操作
  *
  * @param array $options
  * @return ResponseCore
  * @throws OssException
  * @throws RequestCore_Exception
  */
 private function auth($options)
 {
     OssUtil::validateOptions($options);
     //验证bucket,list_bucket时不需要验证
     $this->authPrecheckBucket($options);
     //验证object
     $this->authPrecheckObject($options);
     //Object名称的编码必须是utf8
     $this->authPrecheckObjectEncoding($options);
     //验证ACL
     $this->authPrecheckAcl($options);
     // 获得当次请求使用的协议头,是https还是http
     $scheme = $this->useSSL ? 'https://' : 'http://';
     // 获得当次请求使用的hostname,如果是公共域名或者专有域名,bucket拼在前面构成三级域名
     $hostname = $this->generateHostname($options[self::OSS_BUCKET]);
     $string_to_sign = '';
     $headers = $this->generateHeaders($options, $hostname);
     $signable_query_string_params = $this->generateSignableQueryStringParam($options);
     $signable_query_string = OssUtil::toQueryString($signable_query_string_params);
     $resource_uri = $this->generateResourceUri($options);
     //生成请求URL
     $conjunction = '?';
     $non_signable_resource = '';
     if (isset($options[self::OSS_SUB_RESOURCE])) {
         $conjunction = '&';
     }
     if ($signable_query_string !== '') {
         $signable_query_string = $conjunction . $signable_query_string;
         $conjunction = '&';
     }
     $query_string = $this->generateQueryString($options);
     if ($query_string !== '') {
         $non_signable_resource .= $conjunction . $query_string;
         $conjunction = '&';
     }
     $this->requestUrl = $scheme . $hostname . $resource_uri . $signable_query_string . $non_signable_resource;
     //创建请求
     $request = new RequestCore($this->requestUrl);
     $request->set_useragent($this->generateUserAgent());
     // Streaming uploads
     if (isset($options[self::OSS_FILE_UPLOAD])) {
         if (is_resource($options[self::OSS_FILE_UPLOAD])) {
             $length = null;
             if (isset($options[self::OSS_CONTENT_LENGTH])) {
                 $length = $options[self::OSS_CONTENT_LENGTH];
             } elseif (isset($options[self::OSS_SEEK_TO])) {
                 $stats = fstat($options[self::OSS_FILE_UPLOAD]);
                 if ($stats && $stats[self::OSS_SIZE] >= 0) {
                     $length = $stats[self::OSS_SIZE] - (int) $options[self::OSS_SEEK_TO];
                 }
             }
             $request->set_read_stream($options[self::OSS_FILE_UPLOAD], $length);
         } else {
             $request->set_read_file($options[self::OSS_FILE_UPLOAD]);
             $length = $request->read_stream_size;
             if (isset($options[self::OSS_CONTENT_LENGTH])) {
                 $length = $options[self::OSS_CONTENT_LENGTH];
             } elseif (isset($options[self::OSS_SEEK_TO]) && isset($length)) {
                 $length -= (int) $options[self::OSS_SEEK_TO];
             }
             $request->set_read_stream_size($length);
         }
     }
     if (isset($options[self::OSS_SEEK_TO])) {
         $request->set_seek_position((int) $options[self::OSS_SEEK_TO]);
     }
     if (isset($options[self::OSS_FILE_DOWNLOAD])) {
         if (is_resource($options[self::OSS_FILE_DOWNLOAD])) {
             $request->set_write_stream($options[self::OSS_FILE_DOWNLOAD]);
         } else {
             $request->set_write_file($options[self::OSS_FILE_DOWNLOAD]);
         }
     }
     if (isset($options[self::OSS_METHOD])) {
         $request->set_method($options[self::OSS_METHOD]);
         $string_to_sign .= $options[self::OSS_METHOD] . "\n";
     }
     if (isset($options[self::OSS_CONTENT])) {
         $request->set_body($options[self::OSS_CONTENT]);
         if ($headers[self::OSS_CONTENT_TYPE] === 'application/x-www-form-urlencoded') {
             $headers[self::OSS_CONTENT_TYPE] = 'application/octet-stream';
         }
         $headers[self::OSS_CONTENT_LENGTH] = strlen($options[self::OSS_CONTENT]);
         $headers[self::OSS_CONTENT_MD5] = base64_encode(md5($options[self::OSS_CONTENT], true));
     }
     if (isset($options[self::OSS_CALLBACK])) {
         $headers[self::OSS_CALLBACK] = base64_encode($options[self::OSS_CALLBACK]);
     }
     if (isset($options[self::OSS_CALLBACK_VAR])) {
         $headers[self::OSS_CALLBACK_VAR] = base64_encode($options[self::OSS_CALLBACK_VAR]);
     }
     if (!isset($headers[self::OSS_ACCEPT_ENCODING])) {
         $headers[self::OSS_ACCEPT_ENCODING] = '';
     }
     uksort($headers, 'strnatcasecmp');
     foreach ($headers as $header_key => $header_value) {
         $header_value = str_replace(array("\r", "\n"), '', $header_value);
         if ($header_value !== '' || $header_key === self::OSS_ACCEPT_ENCODING) {
             $request->add_header($header_key, $header_value);
         }
         if (strtolower($header_key) === 'content-md5' || strtolower($header_key) === 'content-type' || strtolower($header_key) === 'date' || isset($options['self::OSS_PREAUTH']) && (int) $options['self::OSS_PREAUTH'] > 0) {
             $string_to_sign .= $header_value . "\n";
         } elseif (substr(strtolower($header_key), 0, 6) === self::OSS_DEFAULT_PREFIX) {
             $string_to_sign .= strtolower($header_key) . ':' . $header_value . "\n";
         }
     }
     // 生成 signable_resource
     $signable_resource = $this->generateSignableResource($options);
     $string_to_sign .= rawurldecode($signable_resource) . urldecode($signable_query_string);
     //对?后面的要签名的string字母序排序
     $string_to_sign_ordered = $this->stringToSignSorted($string_to_sign);
     $signature = base64_encode(hash_hmac('sha1', $string_to_sign_ordered, $this->accessKeySecret, true));
     $request->add_header('Authorization', 'OSS ' . $this->accessKeyId . ':' . $signature);
     if (isset($options[self::OSS_PREAUTH]) && (int) $options[self::OSS_PREAUTH] > 0) {
         $signed_url = $this->requestUrl . $conjunction . self::OSS_URL_ACCESS_KEY_ID . '=' . rawurlencode($this->accessKeyId) . '&' . self::OSS_URL_EXPIRES . '=' . $options[self::OSS_PREAUTH] . '&' . self::OSS_URL_SIGNATURE . '=' . rawurlencode($signature);
         return $signed_url;
     } elseif (isset($options[self::OSS_PREAUTH])) {
         return $this->requestUrl;
     }
     if ($this->timeout !== 0) {
         $request->timeout = $this->timeout;
     }
     if ($this->connectTimeout !== 0) {
         $request->connect_timeout = $this->connectTimeout;
     }
     try {
         $request->send_request();
     } catch (RequestCore_Exception $e) {
         throw new OssException('RequestCoreException: ' . $e->getMessage());
     }
     $response_header = $request->get_response_header();
     $response_header['oss-request-url'] = $this->requestUrl;
     $response_header['oss-redirects'] = $this->redirects;
     $response_header['oss-stringtosign'] = $string_to_sign;
     $response_header['oss-requestheaders'] = $request->request_headers;
     $data = new ResponseCore($response_header, $request->get_response_body(), $request->get_response_code());
     //retry if OSS Internal Error
     if ((int) $request->get_response_code() === 500) {
         if ($this->redirects <= $this->maxRetries) {
             //设置休眠
             $delay = (int) (pow(4, $this->redirects) * 100000);
             usleep($delay);
             $this->redirects++;
             $data = $this->auth($options);
         }
     }
     $this->redirects = 0;
     return $data;
 }
Пример #4
0
/**
 * 生成PutObject的签名url,主要用于私有权限下的写访问控制, 用户可以利用生成的signedUrl
 * 从文件上传文件
 *
 * @param OssClient $ossClient OssClient实例
 * @param string $bucket 存储空间名称
 * @throws OssException
 */
function getSignedUrlForPuttingObjectFromFile($ossClient, $bucket)
{
    $file = __FILE__;
    $object = "test/test-signature-test-upload-and-download.txt";
    $timeout = 3600;
    $options = array('Content-Type' => 'txt');
    try {
        $signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
    } catch (OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
        return;
    }
    print __FUNCTION__ . ": signedUrl: " . $signedUrl . "\n";
    $request = new RequestCore($signedUrl);
    $request->set_method('PUT');
    $request->add_header('Content-Type', 'txt');
    $request->set_read_file($file);
    $request->set_read_stream_size(filesize($file));
    $request->send_request();
    $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
    if ($res->isOK()) {
        print __FUNCTION__ . ": OK" . "\n";
    } else {
        print __FUNCTION__ . ": FAILED" . "\n";
    }
}