RestClient.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?PHP
  2. namespace Mailgun\Connection;
  3. use Guzzle\Http\Client as Guzzle;
  4. use Mailgun\MailgunClient;
  5. use Mailgun\Connection\Exceptions\GenericHTTPError;
  6. use Guzzle\Http\QueryAggregator\DuplicateAggregator;
  7. use Guzzle\Http\QueryAggregator\PhpAggregator;
  8. use Mailgun\Connection\Exceptions\InvalidCredentials;
  9. use Mailgun\Connection\Exceptions\NoDomainsConfigured;
  10. use Mailgun\Connection\Exceptions\MissingRequiredParameters;
  11. use Mailgun\Connection\Exceptions\MissingEndpoint;
  12. /*
  13. This class is a wrapper for the Guzzle (HTTP Client Library).
  14. */
  15. class RestClient{
  16. private $apiKey;
  17. protected $mgClient;
  18. protected $hasFiles = False;
  19. public function __construct($apiKey, $apiEndpoint, $apiVersion, $ssl){
  20. $this->apiKey = $apiKey;
  21. $this->mgClient = new Guzzle($this->generateEndpoint($apiEndpoint, $apiVersion, $ssl));
  22. $this->mgClient->setDefaultOption('curl.options', array('CURLOPT_FORBID_REUSE' => true));
  23. $this->mgClient->setDefaultOption('auth', array (API_USER, $this->apiKey));
  24. $this->mgClient->setDefaultOption('exceptions', false);
  25. $this->mgClient->setUserAgent(SDK_USER_AGENT . '/' . SDK_VERSION);
  26. }
  27. public function post($endpointUrl, $postData = array(), $files = array()){
  28. $request = $this->mgClient->post($endpointUrl, array(), $postData);
  29. if(isset($files["message"])){
  30. $this->hasFiles = True;
  31. foreach($files as $message){
  32. $request->addPostFile("message", $message);
  33. }
  34. }
  35. if(isset($files["attachment"])){
  36. $this->hasFiles = True;
  37. foreach($files["attachment"] as $attachment){
  38. // Backward compatibility code
  39. if (is_array($attachment)){
  40. $request->addPostFile("attachment",
  41. $attachment['filePath'], null,
  42. $attachment['remoteName']);
  43. }
  44. else{
  45. $request->addPostFile("attachment", $attachment);
  46. }
  47. }
  48. }
  49. if(isset($files["inline"])){
  50. $this->hasFiles = True;
  51. foreach($files["inline"] as $inline){
  52. // Backward compatibility code
  53. if (is_array($inline)){
  54. $request->addPostFile("inline",
  55. $inline['filePath'], null,
  56. $inline['remoteName']);
  57. }
  58. else{
  59. $request->addPostFile("inline", $inline);
  60. }
  61. }
  62. }
  63. /*
  64. This block of code is to accommodate for a bug in Guzzle.
  65. See https://github.com/guzzle/guzzle/issues/545.
  66. It can be removed when Guzzle resolves the issue.
  67. */
  68. if($this->hasFiles){
  69. $request->getPostFields()->setAggregator(new PhpAggregator());
  70. }
  71. else{
  72. $request->getPostFields()->setAggregator(new DuplicateAggregator());
  73. }
  74. $response = $request->send();
  75. return $this->responseHandler($response);
  76. }
  77. public function get($endpointUrl, $queryString = array()){
  78. $request = $this->mgClient->get($endpointUrl);
  79. if(isset($queryString)){
  80. foreach($queryString as $key=>$value){
  81. $request->getQuery()->set($key, $value);
  82. }
  83. }
  84. $response = $request->send();
  85. return $this->responseHandler($response);
  86. }
  87. public function delete($endpointUrl){
  88. $request = $this->mgClient->delete($endpointUrl);
  89. $response = $request->send();
  90. return $this->responseHandler($response);
  91. }
  92. public function put($endpointUrl, $putData){
  93. $request = $this->mgClient->put($endpointUrl, array(), $putData);
  94. $request->getPostFields()->setAggregator(new DuplicateAggregator());
  95. $response = $request->send();
  96. return $this->responseHandler($response);
  97. }
  98. public function responseHandler($responseObj){
  99. $httpResponseCode = $responseObj->getStatusCode();
  100. if($httpResponseCode === 200){
  101. $data = (string) $responseObj->getBody();
  102. $jsonResponseData = json_decode($data, false);
  103. $result = new \stdClass();
  104. // return response data as json if possible, raw if not
  105. $result->http_response_body = $data && $jsonResponseData === null ? $data : $jsonResponseData;
  106. }
  107. elseif($httpResponseCode == 400){
  108. throw new MissingRequiredParameters(EXCEPTION_MISSING_REQUIRED_PARAMETERS);
  109. }
  110. elseif($httpResponseCode == 401){
  111. throw new InvalidCredentials(EXCEPTION_INVALID_CREDENTIALS);
  112. }
  113. elseif($httpResponseCode == 404){
  114. throw new MissingEndpoint(EXCEPTION_MISSING_ENDPOINT);
  115. }
  116. else{
  117. throw new GenericHTTPError(EXCEPTION_GENERIC_HTTP_ERROR, $httpResponseCode, $responseObj->getBody());
  118. }
  119. $result->http_response_code = $httpResponseCode;
  120. return $result;
  121. }
  122. private function generateEndpoint($apiEndpoint, $apiVersion, $ssl){
  123. if(!$ssl){
  124. return "http://" . $apiEndpoint . "/" . $apiVersion . "/";
  125. }
  126. else{
  127. return "https://" . $apiEndpoint . "/" . $apiVersion . "/";
  128. }
  129. }
  130. }