1+ <?php
2+
3+ namespace Prokl \ServiceProvider \Services \PSR \PSR18 ;
4+
5+ use Bitrix \Main \Web \HttpClient ;
6+ use Bitrix \Main \Web \HttpHeaders ;
7+ use GuzzleHttp \Psr7 \Response ;
8+ use Psr \Http \Client \ClientInterface ;
9+ use Psr \Http \Message \RequestInterface ;
10+ use Psr \Http \Message \ResponseInterface ;
11+
12+ /**
13+ * Class PsrClient
14+ * @package Prokl\ServiceProvider\Services\PSR\PSR18
15+ *
16+ * @see https://github.com/beta-eto-code/bitrix-psr18 (fork)
17+ */
18+ class PsrClient implements ClientInterface
19+ {
20+ /**
21+ * @var HttpClient $httpClient
22+ */
23+ private $ httpClient ;
24+
25+ /**
26+ * Client constructor.
27+ *
28+ * @param HttpClient|null $httpClient
29+ */
30+ public function __construct (HttpClient $ httpClient = null )
31+ {
32+ $ this ->httpClient = $ httpClient ?? new HttpClient ();
33+ }
34+
35+ /**
36+ * @inheritDoc
37+ */
38+ public function sendRequest (RequestInterface $ request ): ResponseInterface
39+ {
40+ $ method = strtoupper ($ request ->getMethod ());
41+ $ bxClient = clone $ this ->httpClient ;
42+ $ this ->loadHeaders ($ bxClient , $ request );
43+
44+ $ body = (string )$ request ->getBody ();
45+ if (empty ($ body )) {
46+ $ body = null ;
47+ }
48+
49+ $ bxClient ->query ($ method , (string )$ request ->getUri (), $ body );
50+ $ responseBody = $ bxClient ->getResult ();
51+ if (empty ($ responseBody )) {
52+ $ responseBody = null ;
53+ }
54+
55+ return new Response ($ bxClient ->getStatus (), $ this ->normalizeHeader ($ bxClient ->getHeaders ()), $ responseBody );
56+ }
57+
58+
59+ /**
60+ * @param HttpClient $httpClient
61+ * @param RequestInterface $request
62+ */
63+ private function loadHeaders (HttpClient $ httpClient , RequestInterface $ request )
64+ {
65+ $ httpClient ->clearHeaders ();
66+ foreach ($ request ->getHeaders () as $ name => $ values ) {
67+ $ httpClient ->setHeader ($ name , implode (", " , $ values ));
68+ }
69+ }
70+
71+ /**
72+ * @param HttpHeaders $headers
73+ * @return array
74+ */
75+ private function normalizeHeader (HttpHeaders $ headers ): array
76+ {
77+ $ result = [];
78+ foreach ($ headers as $ key => $ value ) {
79+ $ result [$ key ] = implode (", " , (array )$ value );
80+ }
81+
82+ return $ result ;
83+ }
84+ }
0 commit comments