%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Tools/Model/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Tools/Model/NCRequestResult.php |
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles\Tools\Model;
use GuzzleHttp\Exception\BadResponseException;
use JsonSerializable;
use OCA\Circles\Tools\Exceptions\RequestContentException;
use OCA\Circles\Tools\Traits\TArrayTools;
use OCP\Http\Client\IResponse;
class NCRequestResult implements JsonSerializable {
use TArrayTools;
public const TYPE_STRING = 0;
public const TYPE_BINARY = 1;
public const TYPE_JSON = 2;
public const TYPE_XRD = 3;
/** @var int */
private $statusCode = 0;
/** @var array */
private $headers = [];
/** @var mixed */
private $content;
/** @var array */
private $contentAsArray = [];
/** @var int */
private $contentType = 0;
/** @var BadResponseException */
private $exception = null;
/**
* NCRequestResult constructor.
*
* @param IResponse|null $response
* @param BadResponseException|null $e
*/
public function __construct(?IResponse $response, ?BadResponseException $e = null) {
if (!is_null($response)) {
$this->setStatusCode($response->getStatusCode());
$this->setContent($response->getBody());
$this->setHeaders($response->getHeaders());
}
if (!is_null($e)) {
$this->setException($e);
}
$this->generateMeta();
}
/**
* @return int
*/
public function getStatusCode(): int {
return $this->statusCode;
}
/**
* @param int $statusCode
*
* @return self
*/
public function setStatusCode(int $statusCode): self {
$this->statusCode = $statusCode;
return $this;
}
/**
* @return array
*/
public function getHeaders(): array {
return $this->headers;
}
/**
* @param array $headers
*
* @return self
*/
public function setHeaders(array $headers): self {
$this->headers = $headers;
return $this;
}
/**
* @param string $key
*
* @return array
*/
public function getHeader(string $key): array {
return $this->getArray($key, $this->headers);
}
public function withinHeader(string $key, string $needle): bool {
foreach ($this->getHeader($key) as $header) {
if (strpos($header, $needle) !== false) {
return true;
}
}
return false;
}
/**
* @param string $content
*
* @return self
*/
public function setContent(string $content): self {
$this->content = $content;
return $this;
}
/**
* @return string
* @throws RequestContentException
*/
public function getContent(): string {
if (is_null($this->content) || !is_string($this->content)) {
throw new RequestContentException();
}
return $this->content;
}
/**
* @return array
*/
public function getAsArray(): array {
if (empty($this->contentAsArray)) {
$this->generateContentAsArray();
}
return $this->contentAsArray;
}
/**
* @return string
*/
public function getBinary() {
return $this->content;
}
/**
* @return int
*/
public function getContentType(): int {
return $this->contentType;
}
/**
* @param int $type
*
* @return $this
*/
public function setContentType(int $type): self {
$this->contentType = $type;
return $this;
}
/**
* @param int $type
*
* @return bool
*/
public function isContentType(int $type): bool {
return ($this->contentType === $type);
}
/**
*
*/
private function generateMeta(): void {
$this->setContentType($this->discoverContentType());
$this->generateContentAsArray();
}
/**
* @return int
*/
private function discoverContentType(): int {
if ($this->withinHeader('Content-Type', 'application/xrd')) {
return self::TYPE_XRD;
}
if ($this->withinHeader('Content-Type', 'application/json')
|| $this->withinHeader('Content-Type', 'application/jrd')
) {
return self::TYPE_JSON;
}
try {
$content = $this->getContent();
} catch (RequestContentException $e) {
return self::TYPE_BINARY;
}
// in case header failure
$arr = json_decode($content, true);
if (is_array($arr)) {
return self::TYPE_JSON;
}
return self::TYPE_STRING;
}
/**
*
*/
private function generateContentAsArray(): void {
try {
$content = $this->getContent();
if ($this->isContentType(self::TYPE_XRD)) {
$xml = simplexml_load_string($content);
$content = json_encode($xml, JSON_UNESCAPED_SLASHES);
}
$arr = json_decode($content, true);
if (is_array($arr)) {
$this->contentAsArray = $arr;
}
} catch (RequestContentException $e) {
}
}
/**
* @param BadResponseException $e
*
* @return self
*/
public function setException(BadResponseException $e): self {
$this->exception = $e;
$this->setStatusCode($e->getResponse()->getStatusCode());
return $this;
}
/**
* @return BadResponseException
*/
public function getException(): BadResponseException {
return $this->exception;
}
/**
* @return bool
*/
public function hasException(): bool {
return (!is_null($this->exception));
}
/**
* @return array
*/
public function jsonSerialize(): array {
try {
$content = $this->getContent();
} catch (RequestContentException $e) {
$content = 'not a string';
}
return [
'statusCode' => $this->getStatusCode(),
'headers' => $this->getHeaders(),
'content' => $content,
'contentAsArray' => $this->contentAsArray,
'contentType' => $this->getContentType()
];
}
}