PageRenderTime 66ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/src/MarketplaceWebService/Client.php

https://github.com/softwarevamp/amazon-mws
PHP | 1928 lines | 1492 code | 175 blank | 261 comment | 156 complexity | 60fb9a2adaf6d79f5ed5aada70d49551 MD5 | raw file
Possible License(s): GPL-3.0, Apache-2.0

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. /**
  3. * PHP Version 5
  4. *
  5. * @category Amazon
  6. * @package MarketplaceWebService
  7. * @copyright Copyright 2009 Amazon Technologies, Inc.
  8. * @link http://aws.amazon.com
  9. * @license http://aws.amazon.com/apache2.0 Apache License, Version 2.0
  10. * @version 2009-01-01
  11. */
  12. /*******************************************************************************
  13. *
  14. * Marketplace Web Service PHP5 Library
  15. * Generated: Thu May 07 13:07:36 PDT 2009
  16. *
  17. */
  18. /**
  19. * @see MarketplaceWebService_Interface
  20. */
  21. // require_once ('MarketplaceWebService/Interface.php');
  22. // require_once ('RequestType.php');
  23. define('CONVERTED_PARAMETERS_KEY', 'PARAMETERS');
  24. define('CONVERTED_HEADERS_KEY', 'HEADERS');
  25. /**
  26. * The Amazon Marketplace Web Service contain APIs for inventory and order management.
  27. *
  28. * MarketplaceWebService_Client is an implementation of MarketplaceWebService
  29. *
  30. */
  31. class MarketplaceWebService_Client implements MarketplaceWebService_Interface
  32. {
  33. /** @var string */
  34. private $awsAccessKeyId = null;
  35. /** @var string */
  36. private $awsSecretAccessKey = null;
  37. /** @var array */
  38. private $config = array ('ServiceURL' => null,
  39. 'UserAgent' => 'PHP Client Library/2011-08-01 (Language=PHP5)',
  40. 'SignatureVersion' => 2,
  41. 'SignatureMethod' => 'HmacSHA256',
  42. 'ProxyHost' => null,
  43. 'ProxyPort' => -1,
  44. 'MaxErrorRetry' => 3,
  45. );
  46. const SERVICE_VERSION = '2009-01-01';
  47. const REQUEST_TYPE = "POST";
  48. const MWS_CLIENT_VERSION = '2011-08-01';
  49. private $defaultHeaders = array();
  50. private $responseBodyContents;
  51. // "streaming" responses that are errors will be send to this handle;
  52. private $errorResponseBody;
  53. private $headerContents;
  54. private $curlClient;
  55. /**
  56. * Construct new Client
  57. *
  58. * @param string $awsAccessKeyId AWS Access Key ID
  59. * @param string $awsSecretAccessKey AWS Secret Access Key
  60. * @param array $config configuration options.
  61. * @param string $applicationName application name.
  62. * @param string $applicationVersion application version.
  63. * @param array $attributes user-agent attributes
  64. * @return unknown_type
  65. * Valid configuration options are:
  66. * <ul>
  67. * <li>ServiceURL</li>
  68. * <li>SignatureVersion</li>
  69. * <li>TimesRetryOnError</li>
  70. * <li>ProxyHost</li>
  71. * <li>ProxyPort</li>
  72. * <li>MaxErrorRetry</li>
  73. * </ul>
  74. */
  75. public function __construct(
  76. $awsAccessKeyId, $awsSecretAccessKey, $config, $applicationName, $applicationVersion, $attributes = null) {
  77. iconv_set_encoding('output_encoding', 'UTF-8');
  78. iconv_set_encoding('input_encoding', 'UTF-8');
  79. iconv_set_encoding('internal_encoding', 'UTF-8');
  80. $this->awsAccessKeyId = $awsAccessKeyId;
  81. $this->awsSecretAccessKey = $awsSecretAccessKey;
  82. if (!is_null($config))
  83. $this->config = array_merge($this->config, $config);
  84. $this->setUserAgentHeader($applicationName, $applicationVersion, $attributes);
  85. }
  86. /**
  87. * Sets a MWS compliant HTTP User-Agent Header value.
  88. * $attributeNameValuePairs is an associative array.
  89. *
  90. * @param $applicationName
  91. * @param $applicationVersion
  92. * @param $attributes
  93. * @return unknown_type
  94. */
  95. public function setUserAgentHeader(
  96. $applicationName,
  97. $applicationVersion,
  98. $attributes = null) {
  99. if (is_null($attributes)) {
  100. $attributes = array ();
  101. }
  102. $this->config['UserAgent'] =
  103. $this->constructUserAgentHeader($applicationName, $applicationVersion, $attributes);
  104. }
  105. /**
  106. * Construct a valid MWS compliant HTTP User-Agent Header. From the MWS Developer's Guide, this
  107. * entails:
  108. * "To meet the requirements, begin with the name of your application, followed by a forward
  109. * slash, followed by the version of the application, followed by a space, an opening
  110. * parenthesis, the Language name value pair, and a closing paranthesis. The Language parameter
  111. * is a required attribute, but you can add additional attributes separated by semi-colons."
  112. *
  113. * @param $applicationName
  114. * @param $applicationVersion
  115. * @param $additionalNameValuePairs
  116. * @return unknown_type
  117. */
  118. private function constructUserAgentHeader($applicationName, $applicationVersion, $attributes = null) {
  119. if (is_null($applicationName) || $applicationName === "") {
  120. throw new InvalidArgumentException('$applicationName cannot be null.');
  121. }
  122. if (is_null($applicationVersion) || $applicationVersion === "") {
  123. throw new InvalidArgumentException('$applicationVersion cannot be null.');
  124. }
  125. $userAgent =
  126. $this->quoteApplicationName($applicationName)
  127. . '/'
  128. . $this->quoteApplicationVersion($applicationVersion);
  129. $userAgent .= ' (';
  130. $userAgent .= 'Language=PHP/' . phpversion();
  131. $userAgent .= '; ';
  132. $userAgent .= 'Platform=' . php_uname('s') . '/' . php_uname('m') . '/' . php_uname('r');
  133. $userAgent .= '; ';
  134. $userAgent .= 'MWSClientVersion=' . self::MWS_CLIENT_VERSION;
  135. foreach ($attributes as $key => $value) {
  136. if (is_null($value) || $value === '') {
  137. throw new InvalidArgumentException("Value for $key cannot be null or empty.");
  138. }
  139. $userAgent .= '; '
  140. . $this->quoteAttributeName($key)
  141. . '='
  142. . $this->quoteAttributeValue($value);
  143. }
  144. $userAgent .= ')';
  145. return $userAgent;
  146. }
  147. /**
  148. * Collapse multiple whitespace characters into a single ' ' character.
  149. * @param $s
  150. * @return string
  151. */
  152. private function collapseWhitespace($s) {
  153. return preg_replace('/ {2,}|\s/', ' ', $s);
  154. }
  155. /**
  156. * Collapse multiple whitespace characters into a single ' ' and backslash escape '\',
  157. * and '/' characters from a string.
  158. * @param $s
  159. * @return string
  160. */
  161. private function quoteApplicationName($s) {
  162. $quotedString = $this->collapseWhitespace($s);
  163. $quotedString = preg_replace('/\\\\/', '\\\\\\\\', $quotedString);
  164. $quotedString = preg_replace('/\//', '\\/', $quotedString);
  165. return $quotedString;
  166. }
  167. /**
  168. * Collapse multiple whitespace characters into a single ' ' and backslash escape '\',
  169. * and '(' characters from a string.
  170. *
  171. * @param $s
  172. * @return string
  173. */
  174. private function quoteApplicationVersion($s) {
  175. $quotedString = $this->collapseWhitespace($s);
  176. $quotedString = preg_replace('/\\\\/', '\\\\\\\\', $quotedString);
  177. $quotedString = preg_replace('/\\(/', '\\(', $quotedString);
  178. return $quotedString;
  179. }
  180. /**
  181. * Collapse multiple whitespace characters into a single ' ' and backslash escape '\',
  182. * and '=' characters from a string.
  183. *
  184. * @param $s
  185. * @return unknown_type
  186. */
  187. private function quoteAttributeName($s) {
  188. $quotedString = $this->collapseWhitespace($s);
  189. $quotedString = preg_replace('/\\\\/', '\\\\\\\\', $quotedString);
  190. $quotedString = preg_replace('/\\=/', '\\=', $quotedString);
  191. return $quotedString;
  192. }
  193. /**
  194. * Collapse multiple whitespace characters into a single ' ' and backslash escape ';', '\',
  195. * and ')' characters from a string.
  196. *
  197. * @param $s
  198. * @return unknown_type
  199. */
  200. private function quoteAttributeValue($s) {
  201. $quotedString = $this->collapseWhitespace($s);
  202. $quotedString = preg_replace('/\\\\/', '\\\\\\\\', $quotedString);
  203. $quotedString = preg_replace('/\\;/', '\\;', $quotedString);
  204. $quotedString = preg_replace('/\\)/', '\\)', $quotedString);
  205. return $quotedString;
  206. }
  207. // Public API ------------------------------------------------------------//
  208. /**
  209. * Get Report
  210. * The GetReport operation returns the contents of a report. Reports can potentially be
  211. * very large (>100MB) which is why we only return one report at a time, and in a
  212. * streaming fashion.
  213. *
  214. * @see http://docs.amazonwebservices.com/${docPath}GetReport.html
  215. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportRequest request
  216. * or MarketplaceWebService_Model_GetReportRequest object itself
  217. * @see MarketplaceWebService_Model_GetReport
  218. * @return MarketplaceWebService_Model_GetReportResponse MarketplaceWebService_Model_GetReportResponse
  219. *
  220. * @throws MarketplaceWebService_Exception
  221. */
  222. public function getReport($request)
  223. {
  224. if (!$request instanceof MarketplaceWebService_Model_GetReportRequest) {
  225. // require_once ('MarketplaceWebService/Model/GetReportRequest.php');
  226. $request = new MarketplaceWebService_Model_GetReportRequest($request);
  227. }
  228. // require_once ('MarketplaceWebService/Model/GetReportResponse.php');
  229. $httpResponse = $this->invoke($this->convertGetReport($request), $request->getReport());
  230. $response = MarketplaceWebService_Model_GetReportResponse::fromXML($httpResponse['ResponseBody']);
  231. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  232. return $response;
  233. }
  234. /**
  235. * Get Report Schedule Count
  236. * returns the number of report schedules
  237. *
  238. * @see http://docs.amazonwebservices.com/${docPath}GetReportScheduleCount.html
  239. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportScheduleCountRequest request
  240. * or MarketplaceWebService_Model_GetReportScheduleCountRequest object itself
  241. * @see MarketplaceWebService_Model_GetReportScheduleCount
  242. * @return MarketplaceWebService_Model_GetReportScheduleCountResponse MarketplaceWebService_Model_GetReportScheduleCountResponse
  243. *
  244. * @throws MarketplaceWebService_Exception
  245. */
  246. public function getReportScheduleCount($request)
  247. {
  248. if (!$request instanceof MarketplaceWebService_Model_GetReportScheduleCountRequest) {
  249. // require_once ('MarketplaceWebService/Model/GetReportScheduleCountRequest.php');
  250. $request = new MarketplaceWebService_Model_GetReportScheduleCountRequest($request);
  251. }
  252. // require_once ('MarketplaceWebService/Model/GetReportScheduleCountResponse.php');
  253. $httpResponse = $this->invoke($this->convertGetReportScheduleCount($request));
  254. $response = MarketplaceWebService_Model_GetReportScheduleCountResponse::fromXML($httpResponse['ResponseBody']);
  255. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  256. return $response;
  257. }
  258. /**
  259. * Get Report Request List By Next Token
  260. * retrieve the next batch of list items and if there are more items to retrieve
  261. *
  262. * @see http://docs.amazonwebservices.com/${docPath}GetReportRequestListByNextToken.html
  263. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportRequestListByNextTokenRequest request
  264. * or MarketplaceWebService_Model_GetReportRequestListByNextTokenRequest object itself
  265. * @see MarketplaceWebService_Model_GetReportRequestListByNextToken
  266. * @return MarketplaceWebService_Model_GetReportRequestListByNextTokenResponse MarketplaceWebService_Model_GetReportRequestListByNextTokenResponse
  267. *
  268. * @throws MarketplaceWebService_Exception
  269. */
  270. public function getReportRequestListByNextToken($request)
  271. {
  272. if (!$request instanceof MarketplaceWebService_Model_GetReportRequestListByNextTokenRequest) {
  273. // require_once ('MarketplaceWebService/Model/GetReportRequestListByNextTokenRequest.php');
  274. $request = new MarketplaceWebService_Model_GetReportRequestListByNextTokenRequest($request);
  275. }
  276. // require_once ('MarketplaceWebService/Model/GetReportRequestListByNextTokenResponse.php');
  277. $httpResponse = $this->invoke($this->convertGetReportRequestListByNextToken($request));
  278. $response = MarketplaceWebService_Model_GetReportRequestListByNextTokenResponse::fromXML($httpResponse['ResponseBody']);
  279. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  280. return $response;
  281. }
  282. /**
  283. * Update Report Acknowledgements
  284. * The UpdateReportAcknowledgements operation updates the acknowledged status of one or more reports.
  285. *
  286. * @see http://docs.amazonwebservices.com/${docPath}UpdateReportAcknowledgements.html
  287. * @param mixed $request array of parameters for MarketplaceWebService_Model_UpdateReportAcknowledgementsRequest request
  288. * or MarketplaceWebService_Model_UpdateReportAcknowledgementsRequest object itself
  289. * @see MarketplaceWebService_Model_UpdateReportAcknowledgements
  290. * @return MarketplaceWebService_Model_UpdateReportAcknowledgementsResponse MarketplaceWebService_Model_UpdateReportAcknowledgementsResponse
  291. *
  292. * @throws MarketplaceWebService_Exception
  293. */
  294. public function updateReportAcknowledgements($request)
  295. {
  296. if (!$request instanceof MarketplaceWebService_Model_UpdateReportAcknowledgementsRequest) {
  297. // require_once ('MarketplaceWebService/Model/UpdateReportAcknowledgementsRequest.php');
  298. $request = new MarketplaceWebService_Model_UpdateReportAcknowledgementsRequest($request);
  299. }
  300. // require_once ('MarketplaceWebService/Model/UpdateReportAcknowledgementsResponse.php');
  301. $httpResponse = $this->invoke($this->convertUpdateReportAcknowledgements($request));
  302. $response = MarketplaceWebService_Model_UpdateReportAcknowledgementsResponse::fromXML($httpResponse['ResponseBody']);
  303. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  304. return $response;
  305. }
  306. /**
  307. * Submit Feed
  308. * Uploads a file for processing together with the necessary
  309. * metadata to process the file, such as which type of feed it is.
  310. * PurgeAndReplace if true means that your existing e.g. inventory is
  311. * wiped out and replace with the contents of this feed - use with
  312. * caution (the default is false).
  313. *
  314. * @see http://docs.amazonwebservices.com/${docPath}SubmitFeed.html
  315. * @param mixed $request array of parameters for MarketplaceWebService_Model_SubmitFeedRequest request
  316. * or MarketplaceWebService_Model_SubmitFeedRequest object itself
  317. * @see MarketplaceWebService_Model_SubmitFeed
  318. * @return MarketplaceWebService_Model_SubmitFeedResponse MarketplaceWebService_Model_SubmitFeedResponse
  319. *
  320. * @throws MarketplaceWebService_Exception
  321. */
  322. public function submitFeed($request)
  323. {
  324. if (!$request instanceof MarketplaceWebService_Model_SubmitFeedRequest) {
  325. // require_once ('MarketplaceWebService/Model/SubmitFeedRequest.php');
  326. $request = new MarketplaceWebService_Model_SubmitFeedRequest($request);
  327. }
  328. // require_once ('MarketplaceWebService/Model/SubmitFeedResponse.php');
  329. $httpResponse = $this->invoke($this->convertSubmitFeed($request), $request->getFeedContent(), $request->getContentMd5());
  330. $response = MarketplaceWebService_Model_SubmitFeedResponse::fromXML($httpResponse['ResponseBody']);
  331. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  332. return $response;
  333. }
  334. /**
  335. * Get Report Count
  336. * returns a count of reports matching your criteria;
  337. * by default, the number of reports generated in the last 90 days,
  338. * regardless of acknowledgement status
  339. *
  340. * @see http://docs.amazonwebservices.com/${docPath}GetReportCount.html
  341. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportCountRequest request
  342. * or MarketplaceWebService_Model_GetReportCountRequest object itself
  343. * @see MarketplaceWebService_Model_GetReportCount
  344. * @return MarketplaceWebService_Model_GetReportCountResponse MarketplaceWebService_Model_GetReportCountResponse
  345. *
  346. * @throws MarketplaceWebService_Exception
  347. */
  348. public function getReportCount($request)
  349. {
  350. if (!$request instanceof MarketplaceWebService_Model_GetReportCountRequest) {
  351. // require_once ('MarketplaceWebService/Model/GetReportCountRequest.php');
  352. $request = new MarketplaceWebService_Model_GetReportCountRequest($request);
  353. }
  354. // require_once ('MarketplaceWebService/Model/GetReportCountResponse.php');
  355. $httpResponse = $this->invoke($this->convertGetReportCount($request));
  356. $response = MarketplaceWebService_Model_GetReportCountResponse::fromXML($httpResponse['ResponseBody']);
  357. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  358. return $response;
  359. }
  360. /**
  361. * Get Feed Submission List By Next Token
  362. * retrieve the next batch of list items and if there are more items to retrieve
  363. *
  364. * @see http://docs.amazonwebservices.com/${docPath}GetFeedSubmissionListByNextToken.html
  365. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetFeedSubmissionListByNextTokenRequest request
  366. * or MarketplaceWebService_Model_GetFeedSubmissionListByNextTokenRequest object itself
  367. * @see MarketplaceWebService_Model_GetFeedSubmissionListByNextToken
  368. * @return MarketplaceWebService_Model_GetFeedSubmissionListByNextTokenResponse MarketplaceWebService_Model_GetFeedSubmissionListByNextTokenResponse
  369. *
  370. * @throws MarketplaceWebService_Exception
  371. */
  372. public function getFeedSubmissionListByNextToken($request)
  373. {
  374. if (!$request instanceof MarketplaceWebService_Model_GetFeedSubmissionListByNextTokenRequest) {
  375. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionListByNextTokenRequest.php');
  376. $request = new MarketplaceWebService_Model_GetFeedSubmissionListByNextTokenRequest($request);
  377. }
  378. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionListByNextTokenResponse.php');
  379. $httpResponse = $this->invoke($this->convertGetFeedSubmissionListByNextToken($request));
  380. $response = MarketplaceWebService_Model_GetFeedSubmissionListByNextTokenResponse::fromXML($httpResponse['ResponseBody']);
  381. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  382. return $response;
  383. }
  384. /**
  385. * Cancel Feed Submissions
  386. * cancels feed submissions - by default all of the submissions of the
  387. * last 30 days that have not started processing
  388. *
  389. * @see http://docs.amazonwebservices.com/${docPath}CancelFeedSubmissions.html
  390. * @param mixed $request array of parameters for MarketplaceWebService_Model_CancelFeedSubmissionsRequest request
  391. * or MarketplaceWebService_Model_CancelFeedSubmissionsRequest object itself
  392. * @see MarketplaceWebService_Model_CancelFeedSubmissions
  393. * @return MarketplaceWebService_Model_CancelFeedSubmissionsResponse MarketplaceWebService_Model_CancelFeedSubmissionsResponse
  394. *
  395. * @throws MarketplaceWebService_Exception
  396. */
  397. public function cancelFeedSubmissions($request)
  398. {
  399. if (!$request instanceof MarketplaceWebService_Model_CancelFeedSubmissionsRequest) {
  400. // require_once ('MarketplaceWebService/Model/CancelFeedSubmissionsRequest.php');
  401. $request = new MarketplaceWebService_Model_CancelFeedSubmissionsRequest($request);
  402. }
  403. // require_once ('MarketplaceWebService/Model/CancelFeedSubmissionsResponse.php');
  404. $httpResponse = $this->invoke($this->convertCancelFeedSubmissions($request));
  405. $response = MarketplaceWebService_Model_CancelFeedSubmissionsResponse::fromXML($httpResponse['ResponseBody']);
  406. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  407. return $response;
  408. }
  409. /**
  410. * Request Report
  411. * requests the generation of a report
  412. *
  413. * @see http://docs.amazonwebservices.com/${docPath}RequestReport.html
  414. * @param mixed $request array of parameters for MarketplaceWebService_Model_RequestReportRequest request
  415. * or MarketplaceWebService_Model_RequestReportRequest object itself
  416. * @see MarketplaceWebService_Model_RequestReport
  417. * @return MarketplaceWebService_Model_RequestReportResponse MarketplaceWebService_Model_RequestReportResponse
  418. *
  419. * @throws MarketplaceWebService_Exception
  420. */
  421. public function requestReport($request)
  422. {
  423. if (!$request instanceof MarketplaceWebService_Model_RequestReportRequest) {
  424. // require_once ('MarketplaceWebService/Model/RequestReportRequest.php');
  425. $request = new MarketplaceWebService_Model_RequestReportRequest($request);
  426. }
  427. // require_once ('MarketplaceWebService/Model/RequestReportResponse.php');
  428. $httpResponse = $this->invoke($this->convertRequestReport($request));
  429. $response = MarketplaceWebService_Model_RequestReportResponse::fromXML($httpResponse['ResponseBody']);
  430. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  431. return $response;
  432. }
  433. /**
  434. * Get Feed Submission Count
  435. * returns the number of feeds matching all of the specified criteria
  436. *
  437. * @see http://docs.amazonwebservices.com/${docPath}GetFeedSubmissionCount.html
  438. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetFeedSubmissionCountRequest request
  439. * or MarketplaceWebService_Model_GetFeedSubmissionCountRequest object itself
  440. * @see MarketplaceWebService_Model_GetFeedSubmissionCount
  441. * @return MarketplaceWebService_Model_GetFeedSubmissionCountResponse MarketplaceWebService_Model_GetFeedSubmissionCountResponse
  442. *
  443. * @throws MarketplaceWebService_Exception
  444. */
  445. public function getFeedSubmissionCount($request)
  446. {
  447. if (!$request instanceof MarketplaceWebService_Model_GetFeedSubmissionCountRequest) {
  448. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionCountRequest.php');
  449. $request = new MarketplaceWebService_Model_GetFeedSubmissionCountRequest($request);
  450. }
  451. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionCountResponse.php');
  452. $httpResponse = $this->invoke($this->convertGetFeedSubmissionCount($request));
  453. $response = MarketplaceWebService_Model_GetFeedSubmissionCountResponse::fromXML($httpResponse['ResponseBody']);
  454. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  455. return $response;
  456. }
  457. /**
  458. * Cancel Report Requests
  459. * cancels report requests that have not yet started processing,
  460. * by default all those within the last 90 days
  461. *
  462. * @see http://docs.amazonwebservices.com/${docPath}CancelReportRequests.html
  463. * @param mixed $request array of parameters for MarketplaceWebService_Model_CancelReportRequestsRequest request
  464. * or MarketplaceWebService_Model_CancelReportRequestsRequest object itself
  465. * @see MarketplaceWebService_Model_CancelReportRequests
  466. * @return MarketplaceWebService_Model_CancelReportRequestsResponse MarketplaceWebService_Model_CancelReportRequestsResponse
  467. *
  468. * @throws MarketplaceWebService_Exception
  469. */
  470. public function cancelReportRequests($request)
  471. {
  472. if (!$request instanceof MarketplaceWebService_Model_CancelReportRequestsRequest) {
  473. // require_once ('MarketplaceWebService/Model/CancelReportRequestsRequest.php');
  474. $request = new MarketplaceWebService_Model_CancelReportRequestsRequest($request);
  475. }
  476. // require_once ('MarketplaceWebService/Model/CancelReportRequestsResponse.php');
  477. $httpResponse = $this->invoke($this->convertCancelReportRequests($request));
  478. $response = MarketplaceWebService_Model_CancelReportRequestsResponse::fromXML($httpResponse['ResponseBody']);
  479. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  480. return $response;
  481. }
  482. /**
  483. * Get Report List
  484. * returns a list of reports; by default the most recent ten reports,
  485. * regardless of their acknowledgement status
  486. *
  487. * @see http://docs.amazonwebservices.com/${docPath}GetReportList.html
  488. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportListRequest request
  489. * or MarketplaceWebService_Model_GetReportListRequest object itself
  490. * @see MarketplaceWebService_Model_GetReportList
  491. * @return MarketplaceWebService_Model_GetReportListResponse MarketplaceWebService_Model_GetReportListResponse
  492. *
  493. * @throws MarketplaceWebService_Exception
  494. */
  495. public function getReportList($request)
  496. {
  497. if (!$request instanceof MarketplaceWebService_Model_GetReportListRequest) {
  498. // require_once ('MarketplaceWebService/Model/GetReportListRequest.php');
  499. $request = new MarketplaceWebService_Model_GetReportListRequest($request);
  500. }
  501. // require_once ('MarketplaceWebService/Model/GetReportListResponse.php');
  502. $httpResponse = $this->invoke($this->convertGetReportList($request));
  503. $response = MarketplaceWebService_Model_GetReportListResponse::fromXML($httpResponse['ResponseBody']);
  504. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  505. return $response;
  506. }
  507. /**
  508. * Get Feed Submission Result
  509. * retrieves the feed processing report
  510. *
  511. * @see http://docs.amazonwebservices.com/${docPath}GetFeedSubmissionResult.html
  512. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetFeedSubmissionResultRequest request
  513. * or MarketplaceWebService_Model_GetFeedSubmissionResultRequest object itself
  514. * @see MarketplaceWebService_Model_GetFeedSubmissionResult
  515. * @return MarketplaceWebService_Model_GetFeedSubmissionResultResponse MarketplaceWebService_Model_GetFeedSubmissionResultResponse
  516. *
  517. * @throws MarketplaceWebService_Exception
  518. */
  519. public function getFeedSubmissionResult($request)
  520. {
  521. if (!$request instanceof MarketplaceWebService_Model_GetFeedSubmissionResultRequest) {
  522. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionResultRequest.php');
  523. $request = new MarketplaceWebService_Model_GetFeedSubmissionResultRequest($request);
  524. }
  525. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionResultResponse.php');
  526. $httpResponse = $this->invoke($this->convertGetFeedSubmissionResult($request), $request->getFeedSubmissionResult());
  527. $response = MarketplaceWebService_Model_GetFeedSubmissionResultResponse::fromXML($httpResponse['ResponseBody']);
  528. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  529. return $response;
  530. }
  531. /**
  532. * Get Feed Submission List
  533. * returns a list of feed submission identifiers and their associated metadata
  534. *
  535. * @see http://docs.amazonwebservices.com/${docPath}GetFeedSubmissionList.html
  536. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetFeedSubmissionListRequest request
  537. * or MarketplaceWebService_Model_GetFeedSubmissionListRequest object itself
  538. * @see MarketplaceWebService_Model_GetFeedSubmissionList
  539. * @return MarketplaceWebService_Model_GetFeedSubmissionListResponse MarketplaceWebService_Model_GetFeedSubmissionListResponse
  540. *
  541. * @throws MarketplaceWebService_Exception
  542. */
  543. public function getFeedSubmissionList($request)
  544. {
  545. if (!$request instanceof MarketplaceWebService_Model_GetFeedSubmissionListRequest) {
  546. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionListRequest.php');
  547. $request = new MarketplaceWebService_Model_GetFeedSubmissionListRequest($request);
  548. }
  549. // require_once ('MarketplaceWebService/Model/GetFeedSubmissionListResponse.php');
  550. $httpResponse = $this->invoke($this->convertGetFeedSubmissionList($request));
  551. $response = MarketplaceWebService_Model_GetFeedSubmissionListResponse::fromXML($httpResponse['ResponseBody']);
  552. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  553. return $response;
  554. }
  555. /**
  556. * Get Report Request List
  557. * returns a list of report requests ids and their associated metadata
  558. *
  559. * @see http://docs.amazonwebservices.com/${docPath}GetReportRequestList.html
  560. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportRequestListRequest request
  561. * or MarketplaceWebService_Model_GetReportRequestListRequest object itself
  562. * @see MarketplaceWebService_Model_GetReportRequestList
  563. * @return MarketplaceWebService_Model_GetReportRequestListResponse MarketplaceWebService_Model_GetReportRequestListResponse
  564. *
  565. * @throws MarketplaceWebService_Exception
  566. */
  567. public function getReportRequestList($request)
  568. {
  569. if (!$request instanceof MarketplaceWebService_Model_GetReportRequestListRequest) {
  570. // require_once ('MarketplaceWebService/Model/GetReportRequestListRequest.php');
  571. $request = new MarketplaceWebService_Model_GetReportRequestListRequest($request);
  572. }
  573. // require_once ('MarketplaceWebService/Model/GetReportRequestListResponse.php');
  574. $httpResponse = $this->invoke($this->convertGetReportRequestList($request));
  575. $response = MarketplaceWebService_Model_GetReportRequestListResponse::fromXML($httpResponse['ResponseBody']);
  576. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  577. return $response;
  578. }
  579. /**
  580. * Get Report Schedule List By Next Token
  581. * retrieve the next batch of list items and if there are more items to retrieve
  582. *
  583. * @see http://docs.amazonwebservices.com/${docPath}GetReportScheduleListByNextToken.html
  584. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportScheduleListByNextTokenRequest request
  585. * or MarketplaceWebService_Model_GetReportScheduleListByNextTokenRequest object itself
  586. * @see MarketplaceWebService_Model_GetReportScheduleListByNextToken
  587. * @return MarketplaceWebService_Model_GetReportScheduleListByNextTokenResponse MarketplaceWebService_Model_GetReportScheduleListByNextTokenResponse
  588. *
  589. * @throws MarketplaceWebService_Exception
  590. */
  591. public function getReportScheduleListByNextToken($request)
  592. {
  593. if (!$request instanceof MarketplaceWebService_Model_GetReportScheduleListByNextTokenRequest) {
  594. // require_once ('MarketplaceWebService/Model/GetReportScheduleListByNextTokenRequest.php');
  595. $request = new MarketplaceWebService_Model_GetReportScheduleListByNextTokenRequest($request);
  596. }
  597. // require_once ('MarketplaceWebService/Model/GetReportScheduleListByNextTokenResponse.php');
  598. $httpResponse = $this->invoke($this->convertGetReportScheduleListByNextToken($request));
  599. $response = MarketplaceWebService_Model_GetReportScheduleListByNextTokenResponse::fromXML($httpResponse['ResponseBody']);
  600. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  601. return $response;
  602. }
  603. /**
  604. * Get Report List By Next Token
  605. * retrieve the next batch of list items and if there are more items to retrieve
  606. *
  607. * @see http://docs.amazonwebservices.com/${docPath}GetReportListByNextToken.html
  608. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportListByNextTokenRequest request
  609. * or MarketplaceWebService_Model_GetReportListByNextTokenRequest object itself
  610. * @see MarketplaceWebService_Model_GetReportListByNextToken
  611. * @return MarketplaceWebService_Model_GetReportListByNextTokenResponse MarketplaceWebService_Model_GetReportListByNextTokenResponse
  612. *
  613. * @throws MarketplaceWebService_Exception
  614. */
  615. public function getReportListByNextToken($request)
  616. {
  617. if (!$request instanceof MarketplaceWebService_Model_GetReportListByNextTokenRequest) {
  618. // require_once ('MarketplaceWebService/Model/GetReportListByNextTokenRequest.php');
  619. $request = new MarketplaceWebService_Model_GetReportListByNextTokenRequest($request);
  620. }
  621. // require_once ('MarketplaceWebService/Model/GetReportListByNextTokenResponse.php');
  622. $httpResponse = $this->invoke($this->convertGetReportListByNextToken($request));
  623. $response = MarketplaceWebService_Model_GetReportListByNextTokenResponse::fromXML($httpResponse['ResponseBody']);
  624. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  625. return $response;
  626. }
  627. /**
  628. * Manage Report Schedule
  629. * Creates, updates, or deletes a report schedule
  630. * for a given report type, such as order reports in particular.
  631. *
  632. * @see http://docs.amazonwebservices.com/${docPath}ManageReportSchedule.html
  633. * @param mixed $request array of parameters for MarketplaceWebService_Model_ManageReportScheduleRequest request
  634. * or MarketplaceWebService_Model_ManageReportScheduleRequest object itself
  635. * @see MarketplaceWebService_Model_ManageReportSchedule
  636. * @return MarketplaceWebService_Model_ManageReportScheduleResponse MarketplaceWebService_Model_ManageReportScheduleResponse
  637. *
  638. * @throws MarketplaceWebService_Exception
  639. */
  640. public function manageReportSchedule($request)
  641. {
  642. if (!$request instanceof MarketplaceWebService_Model_ManageReportScheduleRequest) {
  643. // require_once ('MarketplaceWebService/Model/ManageReportScheduleRequest.php');
  644. $request = new MarketplaceWebService_Model_ManageReportScheduleRequest($request);
  645. }
  646. // require_once ('MarketplaceWebService/Model/ManageReportScheduleResponse.php');
  647. $httpResponse = $this->invoke($this->convertManageReportSchedule($request));
  648. $response = MarketplaceWebService_Model_ManageReportScheduleResponse::fromXML($httpResponse['ResponseBody']);
  649. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  650. return $response;
  651. }
  652. /**
  653. * Get Report Request Count
  654. * returns a count of report requests; by default all the report
  655. * requests in the last 90 days
  656. *
  657. * @see http://docs.amazonwebservices.com/${docPath}GetReportRequestCount.html
  658. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportRequestCountRequest request
  659. * or MarketplaceWebService_Model_GetReportRequestCountRequest object itself
  660. * @see MarketplaceWebService_Model_GetReportRequestCount
  661. * @return MarketplaceWebService_Model_GetReportRequestCountResponse MarketplaceWebService_Model_GetReportRequestCountResponse
  662. *
  663. * @throws MarketplaceWebService_Exception
  664. */
  665. public function getReportRequestCount($request)
  666. {
  667. if (!$request instanceof MarketplaceWebService_Model_GetReportRequestCountRequest) {
  668. // require_once ('MarketplaceWebService/Model/GetReportRequestCountRequest.php');
  669. $request = new MarketplaceWebService_Model_GetReportRequestCountRequest($request);
  670. }
  671. // require_once ('MarketplaceWebService/Model/GetReportRequestCountResponse.php');
  672. $httpResponse = $this->invoke($this->convertGetReportRequestCount($request));
  673. $response = MarketplaceWebService_Model_GetReportRequestCountResponse::fromXML($httpResponse['ResponseBody']);
  674. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  675. return $response;
  676. }
  677. /**
  678. * Get Report Schedule List
  679. * returns the list of report schedules
  680. *
  681. * @see http://docs.amazonwebservices.com/${docPath}GetReportScheduleList.html
  682. * @param mixed $request array of parameters for MarketplaceWebService_Model_GetReportScheduleListRequest request
  683. * or MarketplaceWebService_Model_GetReportScheduleListRequest object itself
  684. * @see MarketplaceWebService_Model_GetReportScheduleList
  685. * @return MarketplaceWebService_Model_GetReportScheduleListResponse MarketplaceWebService_Model_GetReportScheduleListResponse
  686. *
  687. * @throws MarketplaceWebService_Exception
  688. */
  689. public function getReportScheduleList($request)
  690. {
  691. if (!$request instanceof MarketplaceWebService_Model_GetReportScheduleListRequest) {
  692. // require_once ('MarketplaceWebService/Model/GetReportScheduleListRequest.php');
  693. $request = new MarketplaceWebService_Model_GetReportScheduleListRequest($request);
  694. }
  695. // require_once ('MarketplaceWebService/Model/GetReportScheduleListResponse.php');
  696. $httpResponse = $this->invoke($this->convertGetReportScheduleList($request));
  697. $response = MarketplaceWebService_Model_GetReportScheduleListResponse::fromXML($httpResponse['ResponseBody']);
  698. $response->setResponseHeaderMetadata($httpResponse['ResponseHeaderMetadata']);
  699. return $response;
  700. }
  701. // Private API ------------------------------------------------------------//
  702. /**
  703. * Get the base64 encoded md5 value of $data. If $data is a memory or temp file stream, this
  704. * method dumps the contents into a string before calculating the md5. Hence, this method
  705. * shouldn't be used for large memory streams.
  706. *
  707. * @param $data
  708. * @return unknown_type
  709. */
  710. private function getContentMd5($data) {
  711. $md5Hash = null;
  712. if (is_string($data)) {
  713. $md5Hash = md5($data, true);
  714. } else if (is_resource($data)) {
  715. // Assume $data is a stream.
  716. $streamMetadata = stream_get_meta_data($data);
  717. if ($streamMetadata['stream_type'] === 'MEMORY' || $streamMetadata['stream_type'] === 'TEMP') {
  718. $md5Hash = md5(stream_get_contents($data), true);
  719. } else {
  720. $md5Hash = md5_file($streamMetadata['uri'], true);
  721. }
  722. }
  723. return base64_encode($md5Hash);
  724. }
  725. /**
  726. * Invoke request and return response
  727. */
  728. private function invoke(array $converted, $dataHandle = null, $contentMd5 = null)
  729. {
  730. $parameters = $converted[CONVERTED_PARAMETERS_KEY];
  731. $actionName = $parameters["Action"];
  732. $response = array();
  733. $responseBody = null;
  734. $statusCode = 200;
  735. /* Submit the request and read response body */
  736. try {
  737. // Ensure the endpoint URL is set.
  738. if (empty($this->config['ServiceURL'])) {
  739. throw new MarketplaceWebService_Exception(
  740. array('ErrorCode' => 'InvalidServiceUrl',
  741. 'Message' => "Missing serviceUrl configuration value. You may obtain a list of valid MWS URLs by consulting the MWS Developer's Guide, or reviewing the sample code published along side this library."));
  742. }
  743. /* Add required request parameters */
  744. $parameters = $this->addRequiredParameters($parameters);
  745. $converted[CONVERTED_PARAMETERS_KEY] = $parameters;
  746. $shouldRetry = false;
  747. $retries = 0;
  748. do {
  749. try {
  750. $response = $this->performRequest($actionName, $converted, $dataHandle, $contentMd5);
  751. $httpStatus = $response['Status'];
  752. switch ($httpStatus) {
  753. case 200:
  754. $shouldRetry = false;
  755. break;
  756. case 500:
  757. case 503:
  758. // require_once ('MarketplaceWebService/Model/ErrorResponse.php');
  759. $errorResponse = MarketplaceWebService_Model_ErrorResponse::fromXML($response['ResponseBody']);
  760. // We will not retry throttling errors since this would just add to the throttling problem.
  761. $shouldRetry = ($errorResponse->getError()->getCode() === 'RequestThrottled')
  762. ? false : true;
  763. if ($shouldRetry && $retries <= $this->config['MaxErrorRetry']) {
  764. $this->pauseOnRetry(++$retries);
  765. } else {
  766. throw $this->reportAnyErrors($response['ResponseBody'], $response['Status'], null, $response['ResponseHeaderMetadata']);
  767. }
  768. break;
  769. default:
  770. $shouldRetry = false;
  771. throw $this->reportAnyErrors($response['ResponseBody'], $response['Status'], null, $response['ResponseHeaderMetadata']);
  772. break;
  773. }
  774. /* Rethrow on deserializer error */
  775. } catch (Exception $e) {
  776. // require_once ('MarketplaceWebService/Exception.php');
  777. throw new MarketplaceWebService_Exception(array('Exception' => $e, 'Message' => $e->getMessage()));
  778. }
  779. } while ($shouldRetry);
  780. } catch (MarketplaceWebService_Exception $se) {
  781. throw $se;
  782. } catch (Exception $t) {
  783. throw new MarketplaceWebService_Exception(array('Exception' => $t, 'Message' => $t->getMessage()));
  784. }
  785. return array('ResponseBody' => $response['ResponseBody'], 'ResponseHeaderMetadata' => $response['ResponseHeaderMetadata']);
  786. }
  787. /**
  788. * Look for additional error strings in the response and return formatted exception
  789. */
  790. private function reportAnyErrors($responseBody, $status, Exception $e = null, $responseHeaderMetadata)
  791. {
  792. $exProps = array();
  793. $exProps["StatusCode"] = $status;
  794. $exProps["ResponseHeaderMetadata"] = $responseHeaderMetadata;
  795. libxml_use_internal_errors(true); // Silence XML parsing errors
  796. $xmlBody = simplexml_load_string($responseBody);
  797. if ($xmlBody !== false) { // Check XML loaded without errors
  798. $exProps["XML"] = $responseBody;
  799. $exProps["ErrorCode"] = $xmlBody->Error->Code;
  800. $exProps["Message"] = $xmlBody->Error->Message;
  801. $exProps["ErrorType"] = !empty($xmlBody->Error->Type) ? $xmlBody->Error->Type : "Unknown";
  802. $exProps["RequestId"] = !empty($xmlBody->RequestID) ? $xmlBody->RequestID : $xmlBody->RequestId; // 'd' in RequestId is sometimes capitalized
  803. } else { // We got bad XML in response, just throw a generic exception
  804. $exProps["Message"] = "Internal Error";
  805. }
  806. // require_once ('MarketplaceWebService/Exception.php');
  807. return new MarketplaceWebService_Exception($exProps);
  808. }
  809. /**
  810. * Setup and execute the request via cURL and return the server response.
  811. *
  812. * @param $action - the MWS action to perform.
  813. * @param $parameters - the MWS parameters for the Action.
  814. * @param $dataHandle - A stream handle to either a feed to upload, or a report/feed submission result to download.
  815. * @param $contentMd5 - The Content-MD5 HTTP header value used for feed submissions.
  816. * @return array
  817. */
  818. private function performRequest($action, array $converted, $dataHandle = null, $contentMd5 = null) {
  819. $curlOptions = $this->configureCurlOptions($action, $converted, $dataHandle, $contentMd5);
  820. if (is_null($curlOptions[CURLOPT_RETURNTRANSFER]) || !$curlOptions[CURLOPT_RETURNTRANSFER]) {
  821. $curlOptions[CURLOPT_RETURNTRANSFER] = true;
  822. }
  823. $this->curlClient = curl_init();
  824. curl_setopt_array($this->curlClient, $curlOptions);
  825. $this->headerContents = @fopen('php://memory', 'rw+');
  826. $this->errorResponseBody = @fopen('php://memory', 'rw+');
  827. $httpResponse = curl_exec($this->curlClient);
  828. rewind($this->headerContents);
  829. $header = stream_get_contents($this->headerContents);
  830. $parsedHeader = $this->parseHttpHeader($header);
  831. // require_once ('MarketplaceWebService/Model/ResponseHeaderMetadata.php');
  832. $responseHeaderMetadata = new MarketplaceWebService_Model_ResponseHeaderMetadata(
  833. $parsedHeader['x-mws-request-id'],
  834. $parsedHeader['x-mws-response-context'],
  835. $parsedHeader['x-mws-timestamp']);
  836. $code = (int) curl_getinfo($this->curlClient, CURLINFO_HTTP_CODE);
  837. // Only attempt to verify the Content-MD5 value if the request was successful.
  838. if (RequestType::getRequestType($action) === RequestType::POST_DOWNLOAD) {
  839. if ($code != 200) {
  840. rewind($this->errorResponseBody);
  841. $httpResponse = stream_get_contents($this->errorResponseBody);
  842. } else {
  843. $this->verifyContentMd5($this->getParsedHeader($parsedHeader,'Content-MD5'), $dataHandle);
  844. $httpResponse = $this->getDownloadResponseDocument($action, $parsedHeader);
  845. }
  846. }
  847. // Cleanup open streams and cURL instance.
  848. @fclose($this->headerContents);
  849. @fclose($this->errorResponseBody);
  850. curl_close($this->curlClient);
  851. return array (
  852. 'Status' => $code,
  853. 'ResponseBody' => $httpResponse,
  854. 'ResponseHeaderMetadata' => $responseHeaderMetadata);
  855. }
  856. private function getParsedHeader($parsedHeader, $key) {
  857. return $parsedHeader[strtolower($key)];
  858. }
  859. /**
  860. * Compares the received Content-MD5 Hash value from the response with a locally calculated
  861. * value based on the contents of the response body. If the received hash value doesn't match
  862. * the locally calculated hash value, an exception is raised.
  863. *
  864. * @param $receivedMd5Hash
  865. * @param $streamHandle
  866. * @return unknown_type
  867. */
  868. private function verifyContentMd5($receivedMd5Hash, $streamHandle) {
  869. rewind($streamHandle);
  870. $expectedMd5Hash = $this->getContentMd5($streamHandle);
  871. rewind($streamHandle);
  872. if (!($receivedMd5Hash === $expectedMd5Hash)) {
  873. // require_once ('MarketplaceWebService/Exception.php');
  874. throw new MarketplaceWebService_Exception(
  875. array(
  876. 'Message' => 'Received Content-MD5 = ' . $receivedMd5Hash . ' but expected ' . $expectedMd5Hash,
  877. 'ErrorCode' => 'ContentMD5DoesNotMatch'));
  878. }
  879. }
  880. /**
  881. * Build an associative array of an HTTP Header lines. For requests, the HTTP request line
  882. * is not contained in the array, nor is the HTTP status line for response headers.
  883. *
  884. * @param $header
  885. * @return array
  886. */
  887. private function parseHttpHeader($header) {
  888. $parsedHeader = array ();
  889. foreach (explode("\n", $header) as $line) {
  890. $splitLine = preg_split('/:\s/', $line, 2, PREG_SPLIT_NO_EMPTY);
  891. if (sizeof($splitLine) == 2) {
  892. $k = strtolower(trim($splitLine[0]));
  893. $v = trim($splitLine[1]);
  894. if (array_key_exists($k, $parsedHeader)) {
  895. $parsedHeader[$k] = $parsedHeader[$k] . "," . $v;
  896. } else {
  897. $parsedHeader[$k] = $v;
  898. }
  899. }
  900. }
  901. return $parsedHeader;
  902. }
  903. /**
  904. * cURL callback to write the response HTTP body into a stream. This is only intended to be used
  905. * with RequestType::POST_DOWNLOAD request types, since the responses can potentially become
  906. * large.
  907. *
  908. * @param $ch - The curl handle.
  909. * @param $string - body portion to write.
  910. * @return int - number of byes written.
  911. */
  912. private function responseCallback($ch, $string) {
  913. $httpStatusCode = (int) curl_getinfo($this->curlClient, CURLINFO_HTTP_CODE);
  914. // For unsuccessful responses, i.e. non-200 HTTP responses, we write the response body
  915. // into a separate stream.
  916. $responseHandle;
  917. if ($httpStatusCode == 200) {
  918. $responseHandle = $this->responseBodyContents;
  919. } else {
  920. $responseHandle = $this->errorResponseBody;
  921. }
  922. return fwrite($responseHandle, $string);
  923. }
  924. /**
  925. * cURL callback to write the response HTTP header into a stream.
  926. *
  927. * @param $ch - The curl handle.
  928. * @param $string - header portion to write.
  929. * @return int - number of bytes written to stream.
  930. */
  931. private function headerCallback($ch, $string) {
  932. $bytesWritten = fwrite($this->headerContents, $string);
  933. return $bytesWritten;
  934. }
  935. /**
  936. * Gets cURL options common to all MWS requests.
  937. * @return unknown_type
  938. */
  939. private function getDefaultCurlOptions() {
  940. return array (
  941. CURLOPT_POST => true,
  942. CURLOPT_USERAGENT => $this->config['UserAgent'],
  943. CURLOPT_VERBOSE => true,
  944. CURLOPT_HEADERFUNCTION => array ($this, 'headerCallback'),
  945. CURLOPT_RETURNTRANSFER => true,
  946. CURLOPT_SSL_VERIFYPEER => true,
  947. CURLOPT_SSL_VERIFYHOST => 2
  948. );
  949. }
  950. /**
  951. * Configures specific curl options based on the request type.
  952. *
  953. * @param $action
  954. * @param $parameters
  955. * @param $streamHandle
  956. * @return array
  957. */
  958. private function configureCurlOptions($action, array $converted, $streamHandle = null, $contentMd5 = null) {
  959. $curlOptions = $this->getDefaultCurlOptions();
  960. if (!is_null($this->config['ProxyHost'])) {
  961. $proxy = $this->config['ProxyHost'];
  962. $proxy .= ':' . ($this->config['ProxyPort'] == -1 ? '80' : $this->config['ProxyPort']);
  963. $curlOptions[CURLOPT_PROXY] = $proxy;
  964. }
  965. $serviceUrl = $this->config['ServiceURL'];
  966. // append the '/' character to the end of the service URL if it doesn't exist.
  967. if (!(substr($serviceUrl, strlen($serviceUrl) - 1) === '/')) {
  968. $serviceUrl .= '/';
  969. }
  970. $requestType = RequestType::getRequestType($action);
  971. if ($requestType == RequestType::POST_UPLOAD) {
  972. if (is_null($streamHandle) || !is_resource($streamHandle)) {
  973. // require_once ('MarketplaceWebService/Exception.php');
  974. throw new MarketplaceWebService_Exception(
  975. array ('Message' => 'Missing stream resource.'));
  976. }
  977. $serviceUrl .= '?' . $this->getParametersAsString($converted[CONVERTED_PARAMETERS_KEY]);
  978. $curlOptions[CURLOPT_URL] = $serviceUrl;
  979. $header[] = 'Expect: ';
  980. $header[] = 'Accept: ';
  981. $header[] = 'Transfer-Encoding: chunked';
  982. $header[] = 'Content-MD5: ' . $contentMd5;
  983. $curlOptions[CURLOPT_HTTPHEADER] = array_merge($header, $converted[CONVERTED_HEADERS_KEY]);
  984. rewind($streamHandle);
  985. $curlOptions[CURLOPT_INFILE] = $streamHandle;
  986. $curlOptions[CURLOPT_UPLOAD] = true;
  987. $curlOptions[CURLOPT_CUSTOMREQUEST] = self::REQUEST_TYPE;
  988. } else if (!($requestType === RequestType::UNKNOWN)) {
  989. $curlOptions[CURLOPT_URL] = $this->config['ServiceURL'];
  990. $curlOptions[CURLOPT_POSTFIELDS] = $this->getParametersAsString($converted[CONVERTED_PARAMETERS_KEY]);
  991. if ($requestType == RequestType::POST_DOWNLOAD) {
  992. $this->responseBodyContents = $streamHandle;
  993. $curlOptions[CURLOPT_WRITEFUNCTION] = array ($this, 'responseCallback');
  994. }
  995. } else {
  996. throw new InvalidArgumentException("$action is not a valid request type.");
  997. }
  998. return $curlOptions;
  999. }
  1000. /**
  1001. * For RequestType::POST_DOWNLOAD actions, construct a response containing the Amazon Request ID
  1002. * and Content MD5 header value.
  1003. *
  1004. * @param $responseType
  1005. * @param $header
  1006. * @return unknown_type
  1007. */
  1008. private function getDownloadResponseDocument($responseType, $header) {
  1009. $md5 = $this->getParsedHeader($header, 'Content-MD5');
  1010. $requestId = $this->getParsedHeader($header, 'x-amz-request-id');
  1011. $response = '<' . $responseType . 'Response xmlns="http://mws.amazonaws.com/doc/2009-01-01/">';
  1012. $response .= '<' . $responseType . 'Result>';
  1013. $response .= '<ContentMd5>';
  1014. $response .= $md5;
  1015. $response .= '</ContentMd5>';
  1016. $response .= '</' . $responseType . 'Result>';
  1017. $response .= '<ResponseMetadata>';
  1018. $response .= '<RequestId>';
  1019. $response .= $requestId;
  1020. $response .= '</RequestId>';
  1021. $response .= '</ResponseMetadata>';
  1022. $response .= '</' . $responseType . 'Response>';
  1023. return $response;
  1024. }
  1025. /**
  1026. * Exponential sleep on failed request
  1027. * @param retries current retry
  1028. */
  1029. private function pauseOnRetry($retries)
  1030. {
  1031. $delay = (int) (pow(4, $retries) * 100000) ;
  1032. usleep($delay);
  1033. }
  1034. /**
  1035. * Add authentication related and version parameters
  1036. */
  1037. private fun

Large files files are truncated, but you can click here to view the full file