11<?php namespace Gitlab \Api ;
22
33use Gitlab \Client ;
4+ use Gitlab \HttpClient \Message \ResponseMediator ;
5+ use Http \Discovery \StreamFactoryDiscovery ;
6+ use Http \Message \MultipartStream \MultipartStreamBuilder ;
7+ use Http \Message \StreamFactory ;
48
59/**
610 * Abstract class for Api classes
@@ -23,12 +27,19 @@ abstract class AbstractApi implements ApiInterface
2327 */
2428 protected $ client ;
2529
30+ /**
31+ * @var StreamFactory
32+ */
33+ private $ streamFactory ;
34+
2635 /**
2736 * @param Client $client
37+ * @param StreamFactory|null $streamFactory
2838 */
29- public function __construct (Client $ client )
39+ public function __construct (Client $ client, StreamFactory $ streamFactory = null )
3040 {
3141 $ this ->client = $ client ;
42+ $ this ->streamFactory = $ streamFactory ?: StreamFactoryDiscovery::find ();
3243 }
3344
3445 /**
@@ -48,9 +59,11 @@ public function configure()
4859 */
4960 protected function get ($ path , array $ parameters = array (), $ requestHeaders = array ())
5061 {
51- $ response = $ this ->client -> getHttpClient ()-> get ( $ path , $ parameters, $ requestHeaders );
62+ $ path = $ this ->preparePath ( $ path , $ parameters );
5263
53- return $ response ->getContent ();
64+ $ response = $ this ->client ->getHttpClient ()->get ($ path , $ requestHeaders );
65+
66+ return ResponseMediator::getContent ($ response );
5467 }
5568
5669 /**
@@ -62,9 +75,35 @@ protected function get($path, array $parameters = array(), $requestHeaders = arr
6275 */
6376 protected function post ($ path , array $ parameters = array (), $ requestHeaders = array (), array $ files = array ())
6477 {
65- $ response = $ this ->client ->getHttpClient ()->post ($ path , $ parameters , $ requestHeaders , $ files );
66-
67- return $ response ->getContent ();
78+ $ path = $ this ->preparePath ($ path );
79+
80+ $ body = null ;
81+ if (empty ($ files ) && !empty ($ parameters )) {
82+ $ body = $ this ->streamFactory ->createStream (http_build_query ($ parameters ));
83+ $ requestHeaders ['Content-Type ' ] = 'application/x-www-form-urlencoded ' ;
84+ } elseif (!empty ($ files )) {
85+ $ builder = new MultipartStreamBuilder ($ this ->streamFactory );
86+
87+ foreach ($ parameters as $ name => $ value ) {
88+ $ builder ->addResource ($ name , $ value );
89+ }
90+
91+ foreach ($ files as $ name => $ file ) {
92+ $ builder ->addResource ($ name , fopen ($ file , 'r ' ), [
93+ 'headers ' => [
94+ 'Content-Type ' => $ this ->guessContentType ($ file ),
95+ ],
96+ 'filename ' => basename ($ file ),
97+ ]);
98+ }
99+
100+ $ body = $ builder ->build ();
101+ $ requestHeaders ['Content-Type ' ] = 'multipart/form-data; boundary= ' .$ builder ->getBoundary ();
102+ }
103+
104+ $ response = $ this ->client ->getHttpClient ()->post ($ path , $ requestHeaders , $ body );
105+
106+ return ResponseMediator::getContent ($ response );
68107 }
69108
70109 /**
@@ -75,9 +114,13 @@ protected function post($path, array $parameters = array(), $requestHeaders = ar
75114 */
76115 protected function patch ($ path , array $ parameters = array (), $ requestHeaders = array ())
77116 {
78- $ response = $ this ->client ->getHttpClient ()->patch ($ path , $ parameters , $ requestHeaders );
117+ $ path = $ this ->preparePath ($ path );
118+
119+ $ body = empty ($ parameters ) ? null : $ this ->streamFactory ->createStream (http_build_query ($ parameters ));
79120
80- return $ response ->getContent ();
121+ $ response = $ this ->client ->getHttpClient ()->patch ($ path , $ requestHeaders , $ body );
122+
123+ return ResponseMediator::getContent ($ response );
81124 }
82125
83126 /**
@@ -88,9 +131,13 @@ protected function patch($path, array $parameters = array(), $requestHeaders = a
88131 */
89132 protected function put ($ path , array $ parameters = array (), $ requestHeaders = array ())
90133 {
91- $ response = $ this ->client ->getHttpClient ()->put ($ path , $ parameters , $ requestHeaders );
134+ $ path = $ this ->preparePath ($ path );
135+
136+ $ body = empty ($ parameters ) ? null : $ this ->streamFactory ->createStream (http_build_query ($ parameters ));
137+
138+ $ response = $ this ->client ->getHttpClient ()->put ($ path , $ requestHeaders , $ body );
92139
93- return $ response -> getContent ();
140+ return ResponseMediator:: getContent ($ response );
94141 }
95142
96143 /**
@@ -101,9 +148,13 @@ protected function put($path, array $parameters = array(), $requestHeaders = arr
101148 */
102149 protected function delete ($ path , array $ parameters = array (), $ requestHeaders = array ())
103150 {
104- $ response = $ this ->client -> getHttpClient ()-> delete ( $ path, $ parameters , $ requestHeaders );
151+ $ path = $ this ->preparePath ( $ path );
105152
106- return $ response ->getContent ();
153+ $ body = empty ($ parameters ) ? null : $ this ->streamFactory ->createStream (http_build_query ($ parameters ));
154+
155+ $ response = $ this ->client ->getHttpClient ()->delete ($ path , $ requestHeaders , $ body );
156+
157+ return ResponseMediator::getContent ($ response );
107158 }
108159
109160 /**
@@ -126,4 +177,28 @@ protected function encodePath($path)
126177
127178 return str_replace ('. ' , '%2E ' , $ path );
128179 }
180+
181+ private function preparePath ($ path , array $ parameters = [])
182+ {
183+ if (count ($ parameters ) > 0 ) {
184+ $ path .= '? ' .http_build_query ($ parameters );
185+ }
186+
187+ return $ path ;
188+ }
189+
190+ /**
191+ * @param $file
192+ *
193+ * @return string
194+ */
195+ private function guessContentType ($ file )
196+ {
197+ if (!class_exists (\finfo::class, false )) {
198+ return 'application/octet-stream ' ;
199+ }
200+ $ finfo = new \finfo (FILEINFO_MIME_TYPE );
201+
202+ return $ finfo ->file ($ file );
203+ }
129204}
0 commit comments