1
1
<?php namespace Gitlab \Api ;
2
2
3
3
use Gitlab \Client ;
4
+ use Gitlab \HttpClient \Message \ResponseMediator ;
5
+ use Http \Discovery \StreamFactoryDiscovery ;
6
+ use Http \Message \MultipartStream \MultipartStreamBuilder ;
7
+ use Http \Message \StreamFactory ;
4
8
5
9
/**
6
10
* Abstract class for Api classes
@@ -23,12 +27,19 @@ abstract class AbstractApi implements ApiInterface
23
27
*/
24
28
protected $ client ;
25
29
30
+ /**
31
+ * @var StreamFactory
32
+ */
33
+ private $ streamFactory ;
34
+
26
35
/**
27
36
* @param Client $client
37
+ * @param StreamFactory|null $streamFactory
28
38
*/
29
- public function __construct (Client $ client )
39
+ public function __construct (Client $ client, StreamFactory $ streamFactory = null )
30
40
{
31
41
$ this ->client = $ client ;
42
+ $ this ->streamFactory = $ streamFactory ?: StreamFactoryDiscovery::find ();
32
43
}
33
44
34
45
/**
@@ -48,9 +59,11 @@ public function configure()
48
59
*/
49
60
protected function get ($ path , array $ parameters = array (), $ requestHeaders = array ())
50
61
{
51
- $ response = $ this ->client -> getHttpClient ()-> get ( $ path , $ parameters, $ requestHeaders );
62
+ $ path = $ this ->preparePath ( $ path , $ parameters );
52
63
53
- return $ response ->getContent ();
64
+ $ response = $ this ->client ->getHttpClient ()->get ($ path , $ requestHeaders );
65
+
66
+ return ResponseMediator::getContent ($ response );
54
67
}
55
68
56
69
/**
@@ -62,9 +75,35 @@ protected function get($path, array $parameters = array(), $requestHeaders = arr
62
75
*/
63
76
protected function post ($ path , array $ parameters = array (), $ requestHeaders = array (), array $ files = array ())
64
77
{
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 );
68
107
}
69
108
70
109
/**
@@ -75,9 +114,13 @@ protected function post($path, array $parameters = array(), $requestHeaders = ar
75
114
*/
76
115
protected function patch ($ path , array $ parameters = array (), $ requestHeaders = array ())
77
116
{
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 ));
79
120
80
- return $ response ->getContent ();
121
+ $ response = $ this ->client ->getHttpClient ()->patch ($ path , $ requestHeaders , $ body );
122
+
123
+ return ResponseMediator::getContent ($ response );
81
124
}
82
125
83
126
/**
@@ -88,9 +131,13 @@ protected function patch($path, array $parameters = array(), $requestHeaders = a
88
131
*/
89
132
protected function put ($ path , array $ parameters = array (), $ requestHeaders = array ())
90
133
{
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 );
92
139
93
- return $ response -> getContent ();
140
+ return ResponseMediator:: getContent ($ response );
94
141
}
95
142
96
143
/**
@@ -101,9 +148,13 @@ protected function put($path, array $parameters = array(), $requestHeaders = arr
101
148
*/
102
149
protected function delete ($ path , array $ parameters = array (), $ requestHeaders = array ())
103
150
{
104
- $ response = $ this ->client -> getHttpClient ()-> delete ( $ path, $ parameters , $ requestHeaders );
151
+ $ path = $ this ->preparePath ( $ path );
105
152
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 );
107
158
}
108
159
109
160
/**
@@ -126,4 +177,28 @@ protected function encodePath($path)
126
177
127
178
return str_replace ('. ' , '%2E ' , $ path );
128
179
}
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
+ }
129
204
}
0 commit comments