Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
}
],
"require": {
"php": "^5.6 || ^7.0",
"php": "^7.1",
"ext-xml": "*",
"php-http/client-common": "^1.6",
"php-http/client-implementation": "^1.0",
Expand Down
101 changes: 69 additions & 32 deletions lib/Gitlab/Api/AbstractApi.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
use Gitlab\Client;
use Gitlab\HttpClient\Message\QueryStringBuilder;
use Gitlab\HttpClient\Message\ResponseMediator;
use Gitlab\Tests\HttpClient\Message\QueryStringBuilderTest;
use Http\Discovery\StreamFactoryDiscovery;
use Http\Message\MultipartStream\MultipartStreamBuilder;
use Http\Message\StreamFactory;
Expand Down Expand Up @@ -32,13 +31,18 @@ abstract class AbstractApi implements ApiInterface
private $streamFactory;

/**
* @param Client $client
* @var int|null
*/
private $sudo = null;

/**
* @param Client $client
* @param StreamFactory|null $streamFactory
*/
public function __construct(Client $client, StreamFactory $streamFactory = null)
{
$this->client = $client;
$this->streamFactory = $streamFactory ?: StreamFactoryDiscovery::find();
$this->client = $client;
$this->streamFactory = $streamFactory ? : StreamFactoryDiscovery::find();
}

/**
Expand All @@ -54,42 +58,60 @@ public function configure()
* Performs a GET query and returns the response as a PSR-7 response object.
*
* @param string $path
* @param array $parameters
* @param array $requestHeaders
* @param array $parameters
* @param array $requestHeaders
*
* @return ResponseInterface
*/
protected function getAsResponse($path, array $parameters = array(), $requestHeaders = array())
protected function getAsResponse($path, array $parameters = [], $requestHeaders = [])
{
$path = $this->preparePath($path, $parameters);

$requestHeaders = $this->processRequestHeaders($requestHeaders);

return $this->client->getHttpClient()->get($path, $requestHeaders);
}

public function sudo(?int $userId) : self
{
$this->sudo = $userId;

return $this;
}

/**
* @param string $path
* @param array $parameters
* @param array $requestHeaders
* @param array $parameters
* @param array $requestHeaders
*
* @return mixed
*/
protected function get($path, array $parameters = array(), $requestHeaders = array())
protected function get($path, array $parameters = [], $requestHeaders = [])
{

$requestHeaders = $this->processRequestHeaders($requestHeaders);

return ResponseMediator::getContent($this->getAsResponse($path, $parameters, $requestHeaders));
}

/**
* @param string $path
* @param array $parameters
* @param array $requestHeaders
* @param array $files
* @param array $parameters
* @param array $requestHeaders
* @param array $files
*
* @return mixed
*/
protected function post($path, array $parameters = array(), $requestHeaders = array(), array $files = array())
protected function post($path, array $parameters = [], $requestHeaders = [], array $files = [])
{
$path = $this->preparePath($path);


$requestHeaders = $this->processRequestHeaders($requestHeaders);

$body = null;
if (empty($files) && !empty($parameters)) {
$body = $this->streamFactory->createStream(QueryStringBuilder::build($parameters));
$body = $this->streamFactory->createStream(QueryStringBuilder::build($parameters));
$requestHeaders['Content-Type'] = 'application/x-www-form-urlencoded';
} elseif (!empty($files)) {
$builder = new MultipartStreamBuilder($this->streamFactory);
Expand All @@ -100,15 +122,15 @@ protected function post($path, array $parameters = array(), $requestHeaders = ar

foreach ($files as $name => $file) {
$builder->addResource($name, fopen($file, 'r'), [
'headers' => [
'headers' => [
'Content-Type' => $this->guessContentType($file),
],
'filename' => basename($file),
]);
}

$body = $builder->build();
$requestHeaders['Content-Type'] = 'multipart/form-data; boundary='.$builder->getBoundary();
$body = $builder->build();
$requestHeaders['Content-Type'] = 'multipart/form-data; boundary=' . $builder->getBoundary();
}

$response = $this->client->getHttpClient()->post($path, $requestHeaders, $body);
Expand All @@ -118,17 +140,20 @@ protected function post($path, array $parameters = array(), $requestHeaders = ar

/**
* @param string $path
* @param array $parameters
* @param array $requestHeaders
* @param array $parameters
* @param array $requestHeaders
*
* @return mixed
*/
protected function put($path, array $parameters = array(), $requestHeaders = array())
protected function put($path, array $parameters = [], $requestHeaders = [])
{
$path = $this->preparePath($path);

$requestHeaders = $this->processRequestHeaders($requestHeaders);

$body = null;
if (!empty($parameters)) {
$body = $this->streamFactory->createStream(http_build_query($parameters));
$body = $this->streamFactory->createStream(http_build_query($parameters));
$requestHeaders['Content-Type'] = 'application/x-www-form-urlencoded';
}

Expand All @@ -139,31 +164,36 @@ protected function put($path, array $parameters = array(), $requestHeaders = arr

/**
* @param string $path
* @param array $parameters
* @param array $requestHeaders
* @param array $parameters
* @param array $requestHeaders
*
* @return mixed
*/
protected function delete($path, array $parameters = array(), $requestHeaders = array())
protected function delete($path, array $parameters = [], $requestHeaders = [])
{
$path = $this->preparePath($path, $parameters);

$requestHeaders = $this->processRequestHeaders($requestHeaders);

$response = $this->client->getHttpClient()->delete($path, $requestHeaders);

return ResponseMediator::getContent($response);
}

/**
* @param int $id
* @param int $id
* @param string $path
*
* @return string
*/
protected function getProjectPath($id, $path)
{
return 'projects/'.$this->encodePath($id).'/'.$path;
return 'projects/' . $this->encodePath($id) . '/' . $path;
}

/**
* @param string $path
*
* @return string
*/
protected function encodePath($path)
Expand All @@ -185,22 +215,20 @@ protected function createOptionsResolver()
->setAllowedTypes('page', 'int')
->setAllowedValues('page', function ($value) {
return $value > 0;
})
;
});
$resolver->setDefined('per_page')
->setAllowedTypes('per_page', 'int')
->setAllowedValues('per_page', function ($value) {
return $value > 0 && $value <= 100;
})
;
});

return $resolver;
}

private function preparePath($path, array $parameters = [])
{
if (count($parameters) > 0) {
$path .= '?'.QueryStringBuilder::build($parameters);
$path .= '?' . QueryStringBuilder::build($parameters);
}

return $path;
Expand All @@ -220,4 +248,13 @@ private function guessContentType($file)

return $finfo->file($file);
}

protected function processRequestHeaders(array $headers) : array
{
if ($this->sudo !== null && !isset($headers['Sudo'])) {
$headers['Sudo'] = $this->sudo;
}

return $headers;
}
}
5 changes: 3 additions & 2 deletions lib/Gitlab/Api/MergeRequests.php
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,13 @@ public function merge($project_id, $mr_id, $message = null)
/**
* @param int $project_id
* @param int $mr_id
* @param array $parameters
*
* @return mixed
*/
public function showNotes($project_id, $mr_id)
public function showNotes($project_id, $mr_id, array $parameters = [])
{
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.$this->encodePath($mr_id).'/notes'));
return $this->get($this->getProjectPath($project_id, 'merge_requests/'.$this->encodePath($mr_id).'/notes'), $parameters);
}

/**
Expand Down