OssClientPresignV4Test.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <?php
  2. namespace OSS\Tests;
  3. use OSS\Core\OssException;
  4. use OSS\Credentials\StaticCredentialsProvider;
  5. use OSS\Http\RequestCore;
  6. use OSS\Http\ResponseCore;
  7. use OSS\OssClient;
  8. require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestOssClientBase.php';
  9. class OssClientPresignV4Test extends TestOssClientBase
  10. {
  11. protected $stsOssClient;
  12. public function testObjectWithSignV4()
  13. {
  14. $object = "a.file";
  15. $this->ossClient->putObject($this->bucket, $object, file_get_contents(__FILE__));
  16. $timeout = 3600;
  17. try {
  18. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout);
  19. } catch (OssException $e) {
  20. $this->assertFalse(true);
  21. }
  22. $request = new RequestCore($signedUrl);
  23. $request->set_method('GET');
  24. $request->add_header('Content-Type', '');
  25. $request->send_request();
  26. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  27. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  28. sleep(1);
  29. //testGetSignedUrlForPuttingObject
  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. sleep(1);
  48. // test Get SignedUrl For Putting Object From File
  49. $file = __FILE__;
  50. $object = "a.file";
  51. $timeout = 3600;
  52. $options = array('Content-Type' => 'txt');
  53. try {
  54. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  55. $request = new RequestCore($signedUrl);
  56. $request->set_method('PUT');
  57. $request->add_header('Content-Type', 'txt');
  58. $request->set_read_file($file);
  59. $request->set_read_stream_size(sprintf('%u', filesize($file)));
  60. $request->send_request();
  61. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  62. $this->assertTrue($res->isOK());
  63. } catch (OssException $e) {
  64. $this->assertFalse(true);
  65. }
  66. sleep(1);
  67. // test SignedUrl With Exception
  68. $object = "a.file";
  69. $timeout = 3600;
  70. $options = array('Content-Type' => 'txt');
  71. try {
  72. $signedUrl = $this->ossClient->signUrl($this->bucket, $object, $timeout, "POST", $options);
  73. $this->assertTrue(false);
  74. } catch (OssException $e) {
  75. $this->assertTrue(true);
  76. if (strpos($e, "method is invalid") == false) {
  77. $this->assertTrue(false);
  78. }
  79. }
  80. // test GetgenPreSignedUrl For GettingObject
  81. $object = "a.file";
  82. $this->ossClient->putObject($this->bucket, $object, file_get_contents(__FILE__));
  83. $expires = time() + 3600;
  84. try {
  85. $signedUrl = $this->ossClient->generatePresignedUrl($this->bucket, $object, $expires);
  86. } catch (OssException $e) {
  87. $this->assertFalse(true);
  88. }
  89. $request = new RequestCore($signedUrl);
  90. $request->set_method('GET');
  91. $request->add_header('Content-Type', '');
  92. $request->send_request();
  93. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  94. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  95. sleep(1);
  96. // test Get genPreSignedUrl Vs SignedUrl
  97. $object = "object-vs.file";
  98. $signedUrl1 = '245';
  99. $signedUrl2 = '123';
  100. $expiration = 0;
  101. do {
  102. usleep(500000);
  103. $begin = time();
  104. $expiration = time() + 3600;
  105. $signedUrl1 = $this->ossClient->generatePresignedUrl($this->bucket, $object, $expiration);
  106. $signedUrl2 = $this->ossClient->signUrl($this->bucket, $object, 3600);
  107. $end = time();
  108. } while ($begin != $end);
  109. $this->assertEquals($signedUrl1, $signedUrl2);
  110. $this->assertTrue(strpos($signedUrl1, 'x-oss-expires=') !== false);
  111. $object = "a.file";
  112. $options = array(
  113. OssClient::OSS_HEADERS => array(
  114. 'name' => 'aliyun',
  115. 'email' => 'aliyun@aliyun.com',
  116. 'book' => 'english',
  117. ),
  118. OssClient::OSS_ADDITIONAL_HEADERS => array("name", "email")
  119. );
  120. $this->ossClient->putObject($this->bucket, $object, file_get_contents(__FILE__), $options);
  121. $expires = time() + 3600;
  122. try {
  123. $signedUrl = $this->ossClient->generatePresignedUrl($this->bucket, $object, $expires, "GET", $options);
  124. $request = new RequestCore($signedUrl);
  125. $request->set_method('GET');
  126. $request->add_header('Content-Type', '');
  127. $request->add_header('name', 'aliyun');
  128. $request->add_header('email', 'aliyun@aliyun.com');
  129. $request->send_request();
  130. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  131. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  132. sleep(1);
  133. } catch (OssException $e) {
  134. print_r($e->getMessage());
  135. $this->assertFalse(true);
  136. }
  137. try {
  138. $signedUrl = $this->ossClient->generatePresignedUrl($this->bucket, $object, $expires);
  139. } catch (OssException $e) {
  140. $this->assertFalse(true);
  141. }
  142. $request = new RequestCore($signedUrl);
  143. $request->set_method('GET');
  144. $request->add_header('Content-Type', '');
  145. $request->send_request();
  146. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  147. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  148. sleep(1);
  149. }
  150. public function testObjectWithStsClientSignV4()
  151. {
  152. $object = "a.file";
  153. $this->stsOssClient->putObject($this->bucket, $object, file_get_contents(__FILE__));
  154. $timeout = 3600;
  155. try {
  156. $signedUrl = $this->stsOssClient->signUrl($this->bucket, $object, $timeout);
  157. } catch (OssException $e) {
  158. $this->assertFalse(true);
  159. }
  160. $request = new RequestCore($signedUrl);
  161. $request->set_method('GET');
  162. $request->add_header('Content-Type', '');
  163. $request->send_request();
  164. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  165. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  166. sleep(1);
  167. //testGetSignedUrlForPuttingObject
  168. $object = "a.file";
  169. $timeout = 3600;
  170. try {
  171. $signedUrl = $this->stsOssClient->signUrl($this->bucket, $object, $timeout, "PUT");
  172. $content = file_get_contents(__FILE__);
  173. $request = new RequestCore($signedUrl);
  174. $request->set_method('PUT');
  175. $request->add_header('Content-Type', '');
  176. $request->add_header('Content-Length', strlen($content));
  177. $request->set_body($content);
  178. $request->send_request();
  179. $res = new ResponseCore($request->get_response_header(),
  180. $request->get_response_body(), $request->get_response_code());
  181. $this->assertTrue($res->isOK());
  182. } catch (OssException $e) {
  183. $this->assertFalse(true);
  184. }
  185. sleep(1);
  186. // test Get SignedUrl For Putting Object From File
  187. $file = __FILE__;
  188. $object = "a.file";
  189. $timeout = 3600;
  190. $options = array('Content-Type' => 'txt');
  191. try {
  192. $signedUrl = $this->stsOssClient->signUrl($this->bucket, $object, $timeout, "PUT", $options);
  193. $request = new RequestCore($signedUrl);
  194. $request->set_method('PUT');
  195. $request->add_header('Content-Type', 'txt');
  196. $request->set_read_file($file);
  197. $request->set_read_stream_size(sprintf('%u', filesize($file)));
  198. $request->send_request();
  199. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  200. $this->assertTrue($res->isOK());
  201. } catch (OssException $e) {
  202. $this->assertFalse(true);
  203. }
  204. sleep(1);
  205. // test SignedUrl With Exception
  206. $file = __FILE__;
  207. $object = "a.file";
  208. $timeout = 3600;
  209. $options = array('Content-Type' => 'txt');
  210. try {
  211. $signedUrl = $this->stsOssClient->signUrl($this->bucket, $object, $timeout, "POST", $options);
  212. $this->assertTrue(false);
  213. } catch (OssException $e) {
  214. $this->assertTrue(true);
  215. if (strpos($e, "method is invalid") == false) {
  216. $this->assertTrue(false);
  217. }
  218. }
  219. // test GetgenPreSignedUrl For GettingObject
  220. $object = "a.file";
  221. $this->stsOssClient->putObject($this->bucket, $object, file_get_contents(__FILE__));
  222. $expires = time() + 3600;
  223. try {
  224. $signedUrl = $this->stsOssClient->generatePresignedUrl($this->bucket, $object, $expires);
  225. } catch (OssException $e) {
  226. $this->assertFalse(true);
  227. }
  228. try {
  229. $request = new RequestCore($signedUrl);
  230. $request->set_method('GET');
  231. $request->add_header('Content-Type', '');
  232. $request->send_request();
  233. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  234. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  235. sleep(1);
  236. } catch (OssException $e) {
  237. $this->assertFalse(true);
  238. }
  239. // test Get genPreSignedUrl Vs SignedUrl
  240. $object = "object-vs.file";
  241. do {
  242. usleep(500000);
  243. $begin = time();
  244. $expiration = time() + 3600;
  245. $signedUrl1 = $this->stsOssClient->generatePresignedUrl($this->bucket, $object, $expiration);
  246. $signedUrl2 = $this->stsOssClient->signUrl($this->bucket, $object, 3600);
  247. $end = time();
  248. } while ($begin != $end);
  249. $this->assertEquals($signedUrl1, $signedUrl2);
  250. $this->assertTrue(strpos($signedUrl1, 'x-oss-expires=') !== false);
  251. $object = "a.file";
  252. $options = array(
  253. OssClient::OSS_HEADERS => array(
  254. 'name' => 'aliyun',
  255. 'email' => 'aliyun@aliyun.com',
  256. 'book' => 'english',
  257. ),
  258. OssClient::OSS_ADDITIONAL_HEADERS => array("name", "email")
  259. );
  260. $this->stsOssClient->putObject($this->bucket, $object, file_get_contents(__FILE__), $options);
  261. $expires = time() + 3600;
  262. try {
  263. $signedUrl = $this->stsOssClient->generatePresignedUrl($this->bucket, $object, $expires, "GET", $options);
  264. $request = new RequestCore($signedUrl);
  265. $request->set_method('GET');
  266. $request->add_header('Content-Type', '');
  267. $request->add_header('name', 'aliyun');
  268. $request->add_header('email', 'aliyun@aliyun.com');
  269. $request->send_request();
  270. $res = new ResponseCore($request->get_response_header(), $request->get_response_body(), $request->get_response_code());
  271. $this->assertEquals(file_get_contents(__FILE__), $res->body);
  272. sleep(1);
  273. } catch (OssException $e) {
  274. print_r($e->getMessage());
  275. $this->assertFalse(true);
  276. }
  277. }
  278. protected function tearDown(): void
  279. {
  280. $this->ossClient->deleteObject($this->bucket, "a.file");
  281. parent::tearDown();
  282. }
  283. protected function setUp(): void
  284. {
  285. $config = array(
  286. 'signatureVersion' => OssClient::OSS_SIGNATURE_VERSION_V4
  287. );
  288. $this->bucket = Common::getBucketName() . '-' . time();
  289. $this->ossClient = Common::getOssClient($config);
  290. $this->ossClient->createBucket($this->bucket);
  291. Common::waitMetaSync();
  292. $this->stsOssClient = Common::getStsOssClient($config);
  293. Common::waitMetaSync();
  294. }
  295. }