OssClientSignatureTest.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <?php
  2. namespace OSS\Tests;
  3. use http\Client;
  4. use OSS\Core\OssException;
  5. use OSS\Http\RequestCore;
  6. use OSS\Http\ResponseCore;
  7. use OSS\OssClient;
  8. require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestOssClientBase.php';
  9. class OssClientSignatureTest extends TestOssClientBase
  10. {
  11. public function testGetSignedUrlForGettingObject()
  12. {
  13. $object = "a.file";
  14. $this->ossClient->putObject($this->bucket, $object, file_get_contents(__FILE__));
  15. $timeout = 3600;
  16. try {
  17. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout);
  18. } catch (OssException $e) {
  19. $this->assertFalse(true);
  20. }
  21. $request = new RequestCore($signedUrl);
  22. $request->set_method('GET');
  23. $request->add_header('Content-Type', '');
  24. $request->send_request();
  25. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  26. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  27. }
  28. public function testGetSignedUrlForPuttingObject()
  29. {
  30. $object = "a.file";
  31. $timeout = 3600;
  32. try {
  33. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "PUT");
  34. $content = file_get_contents(__FILE__);
  35. $request = new RequestCore($signedUrl);
  36. $request->set_method('PUT');
  37. $request->add_header('Content-Type', '');
  38. $request->add_header('Content-Length', strlen($content));
  39. $request->set_body($content);
  40. $request->send_request();
  41. $res = new ResponseCore($request->get_response_header(),
  42. $request->get_response_body(), $request->get_response_code());
  43. $this->assertTrue($res->isOK());
  44. } catch (OssException $e) {
  45. $this->assertFalse(true);
  46. }
  47. }
  48. public function testGetSignedUrlForPuttingObjectFromFile()
  49. {
  50. $file = __FILE__;
  51. $object = "a.file";
  52. $timeout = 3600;
  53. $options = array('Content-Type' => 'txt');
  54. try {
  55. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  56. $request = new RequestCore($signedUrl);
  57. $request->set_method('PUT');
  58. $request->add_header('Content-Type', 'txt');
  59. $request->set_read_file($file);
  60. $request->set_read_stream_size(sprintf('%u',filesize($file)));
  61. $request->send_request();
  62. $res = new ResponseCore($request->get_response_header(),
  63. $request->get_response_body(), $request->get_response_code());
  64. $this->assertTrue($res->isOK());
  65. } catch (OssException $e) {
  66. $this->assertFalse(true);
  67. }
  68. }
  69. public function testSignedUrlWithException()
  70. {
  71. $file = __FILE__;
  72. $object = "a.file";
  73. $timeout = 3600;
  74. $options = array('Content-Type' => 'txt');
  75. try {
  76. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "POST", $options);
  77. $this->assertTrue(false);
  78. } catch (OssException $e) {
  79. $this->assertTrue(true);
  80. if (strpos($e, "method is invalid") == false)
  81. {
  82. $this->assertTrue(false);
  83. }
  84. }
  85. $object = "?a.file";
  86. $timeout = 3600;
  87. $options = array('Content-Type' => 'txt');
  88. try {
  89. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  90. $this->assertTrue(false);
  91. } catch (OssException $e) {
  92. $this->assertTrue(true);
  93. if (strpos($e, "object name cannot start with `?`") == false)
  94. {
  95. $this->assertTrue(false);
  96. }
  97. }
  98. // Set StrictObjectName false
  99. $object = "?a.file";
  100. $timeout = 3600;
  101. $options = array('Content-Type' => 'txt');
  102. $config = array(
  103. 'strictObjectName' => false
  104. );
  105. $ossClient = Common::getOssClient($config);
  106. try {
  107. $signedUrl = $ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  108. $this->assertTrue(true);
  109. } catch (OssException $e) {
  110. print_r($e->getMessage());
  111. $this->assertFalse(true);
  112. }
  113. // V4
  114. $object = "?a.file";
  115. $timeout = 3600;
  116. $options = array('Content-Type' => 'txt');
  117. $config = array(
  118. 'signatureVersion' => OssClient::OSS_SIGNATURE_VERSION_V4
  119. );
  120. $ossClient = Common::getOssClient($config);
  121. try {
  122. $signedUrl = $ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  123. $this->assertTrue(true);
  124. } catch (OssException $e) {
  125. print_r($e->getMessage());
  126. $this->assertFalse(true);
  127. }
  128. }
  129. function testGetgenPreSignedUrlForGettingObject()
  130. {
  131. $object = "a.file";
  132. $this->ossClient->putObject($this->bucket, $object, file_get_contents(__FILE__));
  133. $expires = time() + 3600;
  134. try {
  135. $signedUrl = $this->ossClient->generatePresignedUrl($this->bucket, $object, $expires);
  136. } catch (OssException $e) {
  137. $this->assertFalse(true);
  138. }
  139. $request = new RequestCore($signedUrl);
  140. $request->set_method('GET');
  141. $request->add_header('Content-Type', '');
  142. $request->send_request();
  143. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  144. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  145. }
  146. function testGetgenPreSignedUrlVsSignedUrl()
  147. {
  148. $object = "object-vs.file";
  149. $signedUrl1 = '245';
  150. $signedUrl2 = '123';
  151. $expiration = 0;
  152. do {
  153. usleep(500000);
  154. $begin = time();
  155. $expiration = time() + 3600;
  156. $signedUrl1 = $this->ossClient->generatePresignedUrl($this->bucket, $object, $expiration);
  157. $signedUrl2 = $this->ossClient->signUrl($this->bucket, $object, 3600);
  158. $end = time();
  159. } while ($begin != $end);
  160. $this->assertEquals($signedUrl1, $signedUrl2);
  161. $this->assertTrue(strpos($signedUrl1, 'Expires='.$expiration) !== false);
  162. }
  163. public function testPutObjectWithQueryCallback()
  164. {
  165. $object = "a.file";
  166. $timeout = 3600;
  167. $url = '{"callbackUrl":"http://aliyun.com", "callbackBody":"bucket=${bucket}&object=${object}"}';
  168. $var =
  169. '{
  170. "x:var1":"value1",
  171. "x:var2":"value2"
  172. }';
  173. try {
  174. $options[OssClient::OSS_QUERY_STRING] = array(
  175. 'callback'=>base64_encode($url),
  176. 'callback-var'=>base64_encode($var)
  177. );
  178. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  179. $content = file_get_contents(__FILE__);
  180. $request = new RequestCore($signedUrl);
  181. $request->set_method('PUT');
  182. $request->add_header('Content-Type', '');
  183. $request->add_header('Content-Length', strlen($content));
  184. $request->set_body($content);
  185. $request->send_request();
  186. $res = new ResponseCore($request->get_response_header(),
  187. $request->get_response_body(), $request->get_response_code());
  188. $this->assertEquals($res->status, 203);
  189. } catch (OssException $e) {
  190. $this->assertFalse(true);
  191. }
  192. try {
  193. $options = array(OssClient::OSS_CALLBACK => $url,
  194. OssClient::OSS_CALLBACK_VAR => $var
  195. );
  196. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  197. $content = file_get_contents(__FILE__);
  198. $request = new RequestCore($signedUrl);
  199. $request->set_method('PUT');
  200. $request->add_header('Content-Type', '');
  201. $request->add_header(OssClient::OSS_CALLBACK, base64_encode($url));
  202. $request->add_header(OssClient::OSS_CALLBACK_VAR , base64_encode($var));
  203. $request->add_header('Content-Length', strlen($content));
  204. $request->set_body($content);
  205. $request->send_request();
  206. $res = new ResponseCore($request->get_response_header(),
  207. $request->get_response_body(), $request->get_response_code());
  208. $this->assertEquals($res->status, 203);
  209. } catch (OssException $e) {
  210. $this->assertFalse(true);
  211. }
  212. }
  213. protected function tearDown(): void
  214. {
  215. $this->ossClient->deleteObject($this->bucket, "a.file");
  216. parent::tearDown();
  217. }
  218. protected function setUp(): void
  219. {
  220. parent::setUp();
  221. /**
  222. * 上传本地变量到bucket
  223. */
  224. $object = "a.file";
  225. $content = file_get_contents(__FILE__);
  226. $options = array(
  227. OssClient::OSS_LENGTH => strlen($content),
  228. OssClient::OSS_HEADERS => array(
  229. 'Expires' => 'Fri, 28 Feb 2020 05:38:42 GMT',
  230. 'Cache-Control' => 'no-cache',
  231. 'Content-Disposition' => 'attachment;filename=oss_download.log',
  232. 'Content-Encoding' => 'utf-8',
  233. 'Content-Language' => 'zh-CN',
  234. 'x-oss-server-side-encryption' => 'AES256',
  235. 'x-oss-meta-self-define-title' => 'user define meta info',
  236. ),
  237. );
  238. try {
  239. $this->ossClient->putObject($this->bucket, $object, $content, $options);
  240. } catch (OssException $e) {
  241. $this->assertFalse(true);
  242. }
  243. }
  244. }