%PDF- %PDF-
| Direktori : /proc/self/root/backups/router/usr/local/opnsense/mvc/app/library/OPNsense/Mvc/ |
| Current File : //proc/self/root/backups/router/usr/local/opnsense/mvc/app/library/OPNsense/Mvc/Response.php |
<?php
/*
* Copyright (C) 2024 Deciso B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
namespace OPNsense\Mvc;
use Exception;
class Response
{
private Headers $headers;
private mixed $content = '';
private bool $sent = false;
public function __construct()
{
$this->headers = new Headers();
}
public function getHeaders(): Headers
{
return $this->headers;
}
public function setContent(mixed $content): void
{
$this->content = $content;
}
public function getContent(): string
{
return $this->content;
}
/**
* @param string $contentType content type to offer the client
* @param string|null $charset optional characterset
* @return void
*/
public function setContentType(string $contentType, ?string $charset = null): void
{
if (!empty($charset)) {
$contentType .= '; charset=' . $charset;
}
$this->headers->set('Content-Type', $contentType);
}
/**
* @param int $statusCode http status code
* @param string|null $message backwards compatibility, messages are ignored
* @return void
*/
public function setStatusCode(int $statusCode, ?string $message = null): void
{
$this->headers->setResponseCode($statusCode);
}
/**
* @return int|null status code
*/
public function getStatusCode(): int|null
{
return $this->headers->getResponseCode();
}
/**
* @return void
* @throws Exception when already send
*/
public function send(): void
{
if ($this->sent) {
throw new Exception('Response Already Sent');
}
$this->headers->send();
if (is_resource($this->content)) {
/* Never allow output compression on streams */
ini_set('zlib.output_compression', 'Off');
while (ob_get_level() > 0) {
ob_end_flush();
}
fpassthru($this->content);
@fclose($this->content);
} elseif (!empty($this->content)) {
if (is_array($this->content)) {
echo json_encode($this->content);
} else {
echo $this->content;
}
}
$this->sent = true;
}
/**
* @return bool if response was already sent to the client
*/
public function isSent(): bool
{
return $this->sent;
}
/**
* @param string $location location to forward request to
* @param bool $externalRedirect backwards compatibility
* @param int $statusCode HTTP status code
* @return void
*/
public function redirect(string $location, bool $externalRedirect = true, int $statusCode = 302): void
{
$this->setStatusCode($statusCode);
$this->headers->set('Location', $location);
}
public function setHeader(string $name, string $value): void
{
$this->headers->set($name, $value);
}
/**
* XXX: backwards compatibility, remove in a future version
* @param string $header combined header
* @return void
*/
public function setRawHeader(string $header): void
{
$parts = explode(':', $header, 2);
$this->setHeader($parts[0], ltrim($parts[1]));
}
}