first commit
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Contracts\HttpClientContract;
|
||||
|
||||
class CurlHttpClient implements HttpClientContract
|
||||
{
|
||||
/**
|
||||
* Make an http request
|
||||
*
|
||||
* @param $method
|
||||
* @param $url
|
||||
* @param array $body
|
||||
* @param $headers
|
||||
* @return mixed
|
||||
*/
|
||||
public function request($method, $url, $body, $headers)
|
||||
{
|
||||
$method = strtoupper($method);
|
||||
|
||||
$options = [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_URL => $url,
|
||||
CURLOPT_HTTPHEADER => $this->prepareRequestHeaders($headers),
|
||||
CURLOPT_CUSTOMREQUEST => $method,
|
||||
CURLOPT_FAILONERROR => true,
|
||||
CURLOPT_HEADER => true,
|
||||
CURLOPT_TIMEOUT => 30,
|
||||
];
|
||||
|
||||
if ($method === 'POST') {
|
||||
$options[CURLOPT_POST] = 1;
|
||||
$options[CURLOPT_POSTFIELDS] = json_encode($body);
|
||||
}
|
||||
|
||||
$curl = curl_init();
|
||||
|
||||
curl_setopt_array($curl, $options);
|
||||
|
||||
$response = curl_exec($curl);
|
||||
|
||||
list($rawHeaders, $rawBody) = explode("\r\n\r\n", $response, 2);
|
||||
|
||||
$info = curl_getinfo($curl);
|
||||
|
||||
curl_close($curl);
|
||||
|
||||
$responseHeaders = $this->resolveResponseHeaders($rawHeaders);
|
||||
$responseBody = json_decode($rawBody, true);
|
||||
|
||||
return new ApiResponse($responseBody, $info['http_code'], $responseHeaders);
|
||||
}
|
||||
|
||||
/**
|
||||
* Must return `true` if client is supported
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasSupport()
|
||||
{
|
||||
return function_exists('curl_version');
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify request headers from key value pair
|
||||
* to vector array
|
||||
*
|
||||
* @param array $headers
|
||||
* @return array
|
||||
*/
|
||||
protected function prepareRequestHeaders ($headers)
|
||||
{
|
||||
return array_map(function ($key, $value) {
|
||||
return sprintf('%s:%s', $key, $value);
|
||||
}, array_keys($headers), $headers);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve raw response headers as
|
||||
* associative array
|
||||
*
|
||||
* @param $rawHeaders
|
||||
* @return array
|
||||
*/
|
||||
private function resolveResponseHeaders($rawHeaders)
|
||||
{
|
||||
$headers = [];
|
||||
|
||||
foreach (explode("\r\n", $rawHeaders) as $i => $line) {
|
||||
$parts = explode(': ', $line);
|
||||
|
||||
if (count($parts) === 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$headers[$parts[0]] = $parts[1];
|
||||
}
|
||||
return $headers;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Contracts\HttpClientContract;
|
||||
|
||||
class DummyHttpClient implements HttpClientContract
|
||||
{
|
||||
/**
|
||||
* Make an http request
|
||||
*
|
||||
* @param $method
|
||||
* @param $url
|
||||
* @param $body
|
||||
* @param $headers
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function request($method, $url, $body, $headers)
|
||||
{
|
||||
return new ApiResponse('Dummy response', 200, []);
|
||||
}
|
||||
|
||||
/**
|
||||
* Must return `true` if client is supported
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasSupport()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http\Requests;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Collector;
|
||||
use Analyst\Contracts\RequestContract;
|
||||
use Analyst\Contracts\RequestorContract;
|
||||
|
||||
abstract class AbstractLoggerRequest implements RequestContract
|
||||
{
|
||||
/**
|
||||
* @var Collector
|
||||
*/
|
||||
protected $collector;
|
||||
|
||||
/**
|
||||
* @var integer
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $path;
|
||||
|
||||
public function __construct(Collector $collector, $pluginId, $path)
|
||||
{
|
||||
$this->collector = $collector;
|
||||
$this->id = $pluginId;
|
||||
$this->path = $path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cast request data to array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return [
|
||||
'plugin_id' => $this->id,
|
||||
'php_version' => $this->collector->getPHPVersion(),
|
||||
'wp_version' => $this->collector->getWordPressVersion(),
|
||||
'plugin_version' => $this->collector->getPluginVersion($this->path),
|
||||
'url' => $this->collector->getSiteUrl(),
|
||||
'sdk_version' => $this->collector->getSDKVersion(),
|
||||
'ip' => $this->collector->getServerIp(),
|
||||
'mysql_version' => $this->collector->getMysqlVersion(),
|
||||
'locale' => $this->collector->getSiteLanguage(),
|
||||
'current_theme' => $this->collector->getCurrentThemeName(),
|
||||
'active_plugins_list' => implode(', ', $this->collector->getActivePluginsList()),
|
||||
'email' => $this->collector->getGeneralEmailAddress(),
|
||||
'name' => $this->collector->getCurrentUserName()
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the request
|
||||
* @param RequestorContract $requestor
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public abstract function execute(RequestorContract $requestor);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http\Requests;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Collector;
|
||||
use Analyst\Contracts\RequestContract;
|
||||
use Analyst\Contracts\RequestorContract;
|
||||
|
||||
/**
|
||||
* Class ActivateRequest
|
||||
*
|
||||
* Is is very similar to install request
|
||||
* but with different path
|
||||
*
|
||||
* @since 0.9.12
|
||||
*/
|
||||
class ActivateRequest extends AbstractLoggerRequest
|
||||
{
|
||||
/**
|
||||
* Execute the request
|
||||
* @param RequestorContract $requestor
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function execute(RequestorContract $requestor)
|
||||
{
|
||||
return $requestor->post('logger/activate', $this->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Make request instance
|
||||
*
|
||||
* @param Collector $collector
|
||||
* @param $pluginId
|
||||
* @param $path
|
||||
* @return static
|
||||
*/
|
||||
public static function make(Collector $collector, $pluginId, $path)
|
||||
{
|
||||
return new static($collector, $pluginId, $path);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http\Requests;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Collector;
|
||||
use Analyst\Contracts\RequestorContract;
|
||||
|
||||
/**
|
||||
* Class DeactivateRequest
|
||||
*
|
||||
* @since 0.9.10
|
||||
*/
|
||||
class DeactivateRequest extends AbstractLoggerRequest
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $question;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $answer;
|
||||
|
||||
/**
|
||||
* @param Collector $collector
|
||||
* @param $pluginId
|
||||
* @param $path
|
||||
* @param $question
|
||||
* @param $answer
|
||||
* @return static
|
||||
*/
|
||||
public static function make(Collector $collector, $pluginId, $path, $question, $answer)
|
||||
{
|
||||
return new static($collector, $pluginId, $path, $question, $answer);
|
||||
}
|
||||
|
||||
public function __construct(Collector $collector, $pluginId, $path, $question, $answer)
|
||||
{
|
||||
parent::__construct($collector, $pluginId, $path);
|
||||
|
||||
$this->question = $question;
|
||||
$this->answer = $answer;
|
||||
}
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
return array_merge(parent::toArray(), [
|
||||
'question' => $this->question,
|
||||
'answer' => $this->answer,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the request
|
||||
* @param RequestorContract $requestor
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function execute(RequestorContract $requestor)
|
||||
{
|
||||
return $requestor->post('logger/deactivate', $this->toArray());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http\Requests;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Collector;
|
||||
use Analyst\Contracts\RequestorContract;
|
||||
|
||||
/**
|
||||
* Class InstallRequest
|
||||
*
|
||||
* @since 0.9.4
|
||||
*/
|
||||
class InstallRequest extends AbstractLoggerRequest
|
||||
{
|
||||
/**
|
||||
* Execute the request
|
||||
* @param RequestorContract $requestor
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function execute(RequestorContract $requestor)
|
||||
{
|
||||
return $requestor->post('logger/install', $this->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Make request instance
|
||||
*
|
||||
* @param Collector $collector
|
||||
* @param $pluginId
|
||||
* @param $path
|
||||
* @return static
|
||||
*/
|
||||
public static function make(Collector $collector, $pluginId, $path)
|
||||
{
|
||||
return new static($collector, $pluginId, $path);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http\Requests;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Collector;
|
||||
use Analyst\Contracts\RequestContract;
|
||||
use Analyst\Contracts\RequestorContract;
|
||||
|
||||
/**
|
||||
* Class OptInRequest
|
||||
*
|
||||
* Is is very similar to install request
|
||||
* but with different path
|
||||
*
|
||||
* @since 0.9.5
|
||||
*/
|
||||
class OptInRequest extends AbstractLoggerRequest
|
||||
{
|
||||
/**
|
||||
* Execute the request
|
||||
* @param RequestorContract $requestor
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function execute(RequestorContract $requestor)
|
||||
{
|
||||
return $requestor->post('logger/opt-in', $this->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Make request instance
|
||||
*
|
||||
* @param Collector $collector
|
||||
* @param $pluginId
|
||||
* @param $path
|
||||
* @return static
|
||||
*/
|
||||
public static function make(Collector $collector, $pluginId, $path)
|
||||
{
|
||||
return new static($collector, $pluginId, $path);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http\Requests;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Collector;
|
||||
use Analyst\Contracts\RequestContract;
|
||||
use Analyst\Contracts\RequestorContract;
|
||||
|
||||
/**
|
||||
* Class OptOutRequest
|
||||
*
|
||||
* Is is very similar to install request
|
||||
* but with different path
|
||||
*
|
||||
* @since 0.9.9
|
||||
*/
|
||||
class OptOutRequest extends AbstractLoggerRequest
|
||||
{
|
||||
/**
|
||||
* @param Collector $collector
|
||||
* @param $pluginId
|
||||
* @param $path
|
||||
* @return static
|
||||
*/
|
||||
public static function make(Collector $collector, $pluginId, $path)
|
||||
{
|
||||
return new static($collector, $pluginId, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the request
|
||||
* @param RequestorContract $requestor
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function execute(RequestorContract $requestor)
|
||||
{
|
||||
return $requestor->post('logger/opt-out', $this->toArray());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http\Requests;
|
||||
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Collector;
|
||||
use Analyst\Contracts\RequestorContract;
|
||||
|
||||
/**
|
||||
* Class DeactivateRequest
|
||||
*
|
||||
* @since 0.9.13
|
||||
*/
|
||||
class UninstallRequest extends AbstractLoggerRequest
|
||||
{
|
||||
/**
|
||||
* @param Collector $collector
|
||||
* @param $pluginId
|
||||
* @param $path
|
||||
* @return static
|
||||
*/
|
||||
public static function make(Collector $collector, $pluginId, $path)
|
||||
{
|
||||
return new static($collector, $pluginId, $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the request
|
||||
* @param RequestorContract $requestor
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function execute(RequestorContract $requestor)
|
||||
{
|
||||
return $requestor->post('logger/uninstall', $this->toArray());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace Analyst\Http;
|
||||
|
||||
use WP_Error;
|
||||
use Analyst\ApiResponse;
|
||||
use Analyst\Contracts\HttpClientContract;
|
||||
use Requests_Utility_CaseInsensitiveDictionary;
|
||||
|
||||
class WordPressHttpClient implements HttpClientContract
|
||||
{
|
||||
/**
|
||||
* Make an http request
|
||||
*
|
||||
* @param $method
|
||||
* @param $url
|
||||
* @param $body
|
||||
* @param $headers
|
||||
* @return ApiResponse
|
||||
*/
|
||||
public function request($method, $url, $body, $headers)
|
||||
{
|
||||
$options = [
|
||||
'body' => json_encode($body),
|
||||
'headers' => $headers,
|
||||
'method' => $method,
|
||||
'timeout' => 30,
|
||||
];
|
||||
|
||||
$response = wp_remote_request($url, $options);
|
||||
|
||||
$body = [];
|
||||
$responseHeaders = [];
|
||||
|
||||
if ($response instanceof WP_Error) {
|
||||
$code = $response->get_error_code();
|
||||
} else {
|
||||
/** @var Requests_Utility_CaseInsensitiveDictionary $headers */
|
||||
$responseHeaders = $response['headers']->getAll();
|
||||
$body = json_decode($response['body'], true);
|
||||
$code = $response['response']['code'];
|
||||
}
|
||||
|
||||
|
||||
return new ApiResponse(
|
||||
$body,
|
||||
$code,
|
||||
$responseHeaders
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Must return `true` if client is supported
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasSupport()
|
||||
{
|
||||
return function_exists('wp_remote_request');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user