HttpContentProvider.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\ReleaseNotification\Model\ContentProvider\Http;
  7. use Magento\ReleaseNotification\Model\ContentProviderInterface;
  8. use Magento\Setup\Module\I18n\Locale;
  9. use Psr\Log\LoggerInterface;
  10. use Magento\Framework\HTTP\ClientInterface;
  11. /**
  12. * Requests the release notification content data via an HTTP call to a REST API
  13. */
  14. class HttpContentProvider implements ContentProviderInterface
  15. {
  16. /**
  17. * @var ClientInterface
  18. */
  19. private $httpClient;
  20. /**
  21. * @var LoggerInterface
  22. */
  23. private $logger;
  24. /**
  25. * @var UrlBuilder
  26. */
  27. private $urlBuilder;
  28. /**
  29. * HttpContentProvider constructor.
  30. * @param ClientInterface $httpClient
  31. * @param UrlBuilder $urlBuilder
  32. * @param LoggerInterface $logger
  33. */
  34. public function __construct(
  35. ClientInterface $httpClient,
  36. UrlBuilder $urlBuilder,
  37. LoggerInterface $logger
  38. ) {
  39. $this->httpClient = $httpClient;
  40. $this->urlBuilder = $urlBuilder;
  41. $this->logger = $logger;
  42. }
  43. /**
  44. * @inheritdoc
  45. */
  46. public function getContent($version, $edition, $locale)
  47. {
  48. $result = false;
  49. try {
  50. $result = $this->retrieveContent($version, $edition, $locale);
  51. if (!$result) {
  52. $result = $this->retrieveContent($version, $edition, Locale::DEFAULT_SYSTEM_LOCALE);
  53. if (!$result) {
  54. $result = $this->retrieveContent($version, '', 'default');
  55. }
  56. }
  57. } catch (\Exception $e) {
  58. $this->logger->warning(
  59. sprintf(
  60. 'Failed to retrieve the release notification content. The response is: %s',
  61. empty($result) ? 'Response body is empty.' : $result
  62. )
  63. );
  64. }
  65. return $result;
  66. }
  67. /**
  68. * Retrieve content from given url
  69. *
  70. * @param string $version
  71. * @param string $edition
  72. * @param string $locale
  73. * @return bool|string
  74. */
  75. private function retrieveContent($version, $edition, $locale)
  76. {
  77. $url = $this->urlBuilder->getUrl($version, $edition, $locale);
  78. return empty($url) ? false : $this->getResponse($url);
  79. }
  80. /**
  81. * Returns the response body from the HTTP client
  82. *
  83. * @param $url
  84. * @return string
  85. */
  86. private function getResponse($url)
  87. {
  88. $this->httpClient->get($url);
  89. $responseBody = $this->httpClient->getBody();
  90. if ($this->httpClient->getStatus() === 200 && !empty($responseBody)) {
  91. return $responseBody;
  92. }
  93. return false;
  94. }
  95. }