Implemented strict http request serialization for APIs that forbid a session to be used in concurrent requests (e.g. dedimania).

Updated all API requests in DedimaniaPlugin to be serialized by this mechanism. Closes #139.
This commit is contained in:
Sebastian Büttner
2017-05-22 22:32:15 +02:00
parent d03f155415
commit b0732bee96
5 changed files with 77 additions and 12 deletions

View File

@ -19,6 +19,11 @@ class Request extends EventDispatcher implements RequestInterface
* @var Options Object containing options for current request
*/
protected $options = null;
/**
* @var bool Whether requests to the target host should be serialized or not.
*/
protected $serializeRequests = false;
/**
* Create new cURL handle
@ -121,7 +126,8 @@ class Request extends EventDispatcher implements RequestInterface
* @param \cURL\RequestsQueue $requestsQueue
* @throws \cURL\Exception
*/
public function attachTo(RequestsQueue $requestsQueue) {
public function attachTo(RequestsQueue $requestsQueue)
{
if (isset($this->queue)) {
throw new Exception('Already bound to a RequestQueue.');
}
@ -129,6 +135,24 @@ class Request extends EventDispatcher implements RequestInterface
$this->queue->attach($this);
}
/**
* Whether to serialize requests to the same host or not.
*
* @param bool $serialize
*/
public function setSerialize($serialize = true)
{
$this->serializeRequests = $serialize;
}
/**
* @return bool
*/
public function getSerialize()
{
return $this->serializeRequests;
}
/**
* Creates new RequestsQueue with single Request attached to it
* and calls RequestsQueue::socketPerform() method.

View File

@ -217,4 +217,12 @@ class RequestsQueue extends EventDispatcher implements RequestsQueueInterface, \
}
return curl_multi_select($this->mh, $timeout) !== -1;
}
/**
* @param $option
* @param $value
*/
public function setOption($option, $value) {
curl_multi_setopt($this->mh, $option, $value);
}
}