Soshot/vendor/embed/embed/src/Http/CurlResult.php

136 lines
3.1 KiB
PHP

<?php
namespace Embed\Http;
/**
* Class to dispatch urls using curl and get the result.
*/
class CurlResult
{
protected $resource;
protected $body;
protected $headers = [];
protected $onHeader;
protected $onBody;
protected $data;
/**
* Creates a new response.
*
* @param resource $resource The curl resource
*/
public function __construct($resource)
{
$this->resource = $resource;
$this->data = (object) [];
curl_setopt($this->resource, CURLOPT_HEADERFUNCTION, [$this, 'headerCallback']);
curl_setopt($this->resource, CURLOPT_WRITEFUNCTION, [$this, 'writeCallback']);
}
/**
* Returns the response result.
*/
public function getResult()
{
$result = curl_getinfo($this->resource);
if (curl_errno($this->resource)) {
$result['error'] = curl_error($this->resource);
}
return [
'url' => isset($result['url']) ? $result['url'] : null,
'statusCode' => isset($result['http_code']) ? $result['http_code'] : null,
'contentType' => isset($result['content_type']) ? $result['content_type'] : null,
'info' => $result,
'content' => $this->body,
'headers' => $this->headers,
'data' => $this->data,
];
}
/**
* Returns the resource.
*
* @return resource
*/
public function getResource()
{
return $this->resource;
}
/**
* Callback used on receive a header.
*
* @param callable $callback
*/
public function onHeader(callable $callback)
{
$this->onHeader = $callback;
}
/**
* Callback used on receive a body string portion.
*
* @param callable $callback
*/
public function onBody(callable $callback)
{
$this->onBody = $callback;
}
/**
* Callback used to collect the headers.
*
* @param resource $resource
* @param string $string
*
* @return int
*/
public function headerCallback($resource, $string)
{
if (!strpos($string, ':')) {
return strlen($string);
}
list($name, $value) = array_map('trim', explode(':', $string, 2));
$name = strtolower($name);
if (!isset($this->headers[$name])) {
$this->headers[$name] = [];
}
$this->headers[$name][] = $value;
if ($this->onHeader === null || call_user_func($this->onHeader, $name, $value, $this->data) !== false) {
return strlen($string);
}
return -1;
}
/**
* Callback used to get the body content.
*
* @param resource $resource
* @param string $string
*
* @return int
*/
public function writeCallback($resource, $string)
{
$this->body .= $string;
if ($this->onBody === null || call_user_func($this->onBody, $this->body, $this->data) !== false) {
return strlen($string);
}
//Cancel
$this->body = null;
return -1;
}
}