diff options
Diffstat (limited to 'library/Graphite/Graphing/GraphiteWebClient.php')
-rw-r--r-- | library/Graphite/Graphing/GraphiteWebClient.php | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/library/Graphite/Graphing/GraphiteWebClient.php b/library/Graphite/Graphing/GraphiteWebClient.php new file mode 100644 index 0000000..b06b6ce --- /dev/null +++ b/library/Graphite/Graphing/GraphiteWebClient.php @@ -0,0 +1,198 @@ +<?php + +namespace Icinga\Module\Graphite\Graphing; + +use Icinga\Web\Url; +use iplx\Http\Client; +use iplx\Http\ClientInterface; +use iplx\Http\Request; + +/** + * HTTP interface to Graphite Web + */ +class GraphiteWebClient +{ + /** + * Base URL of every Graphite Web HTTP request + * + * @var Url + */ + protected $baseUrl; + + /** + * HTTP basic auth user for every Graphite Web HTTP request + * + * @var string|null + */ + protected $user; + + /** + * The above user's password + * + * @var string|null + */ + protected $password; + + /** + * Don't verify the remote's TLS certificate + * + * @var bool + */ + protected $insecure = false; + + /** + * HTTP client + * + * @var ClientInterface + */ + protected $httpClient; + + /** + * Constructor + * + * @param Url $baseUrl Base URL of every Graphite Web HTTP request + */ + public function __construct(Url $baseUrl) + { + $this->httpClient = new Client(); + + $this->setBaseUrl($baseUrl); + } + + /** + * Send an HTTP request to the configured Graphite Web and return the response's body + * + * @param Url $url + * @param string $method + * @param string[] $headers + * @param string $body + * + * @return string + */ + public function request(Url $url, $method = 'GET', array $headers = [], $body = null) + { + $headers['User-Agent'] = 'icingaweb2-module-graphite'; + if ($this->user !== null) { + $headers['Authorization'] = 'Basic ' . base64_encode("{$this->user}:{$this->password}"); + } + + // TODO(ak): keep connections alive (TCP handshakes are a bit expensive and TLS handshakes are very expensive) + return (string) $this->httpClient->send( + new Request($method, $this->completeUrl($url)->getAbsoluteUrl(), $headers, $body), + ['curl' => [ + CURLOPT_SSL_VERIFYPEER => ! $this->insecure + ]] + )->getBody(); + } + + /** + * Complete the given relative URL according to the base URL + * + * @param Url $url + * + * @return Url + */ + public function completeUrl(Url $url) + { + $completeUrl = clone $this->baseUrl; + return $completeUrl + ->setPath(ltrim(rtrim($completeUrl->getPath(), '/') . '/' . ltrim($url->getPath(), '/'), '/')) + ->setParams($url->getParams()); + } + + /** + * Get the base URL of every Graphite Web HTTP request + * + * @return Url + */ + public function getBaseUrl() + { + return $this->baseUrl; + } + + /** + * Set the base URL of every Graphite Web HTTP request + * + * @param Url $baseUrl + * + * @return $this + */ + public function setBaseUrl(Url $baseUrl) + { + $this->baseUrl = $baseUrl; + + return $this; + } + + /** + * Get the HTTP basic auth user + * + * @return null|string + */ + public function getUser() + { + return $this->user; + } + + /** + * Set the HTTP basic auth user + * + * @param null|string $user + * + * @return $this + */ + public function setUser($user) + { + $this->user = $user; + + return $this; + } + + /** + * Get the HTTP basic auth password + * + * @return null|string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set the HTTP basic auth password + * + * @param null|string $password + * + * @return $this + */ + public function setPassword($password) + { + $this->password = $password; + + return $this; + } + + /** + * Get whether not to verify the remote's TLS certificate + * + * @return bool + */ + public function getInsecure() + { + return $this->insecure; + } + + /** + * Set whether not to verify the remote's TLS certificate + * + * @param bool $insecure + * + * @return $this + */ + public function setInsecure($insecure = true) + { + $this->insecure = $insecure; + + return $this; + } +} |