You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

259 lines
7.7 KiB

<?php
namespace app\Providers;
/**
* Description of WebHeader
*
* @author Lucas Awade
*/
class WebHeader
{
/** @class support headers * */
private $headers = [
"Access-Control-Allow-Headers",
"Access-Control-Allow-Methods",
"Access-Control-Allow-Origin",
"Cache-Control",
"Connection",
"Content-Description",
"Content-Disposition",
"Content-Length",
"Access-Control-Max-Age",
"Content-Transfer-Encoding",
"Content-Type",
"Expires",
"Pragma",
"Location"
];
/** @codes https://http.cat/ * */
const HTTP_CODE_RESPONSE = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
204 => 'No Content',
206 => 'Partial Content',
207 => 'Multi-Status',
300 => 'Multiple Choices',
301 => 'Moves Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect',
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Payload Too Large',
414 => 'Request-URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Request Range Not Satisfiable',
417 => 'Expectation Failed',
418 => 'Im a teapot',
420 => 'Enhance Your Calm',
421 => 'Misdirected Request',
422 => 'Unprocessable Entity',
423 => 'Locked',
424 => 'Failed Dependency',
425 => 'Too Early',
426 => 'Upgrade Required',
429 => 'Too Many Requests',
431 => 'Request Header Fields Too Large',
444 => 'No Response',
450 => 'Blocked by Windows Parental Controls',
451 => 'Unavailable For Legal Reasons',
499 => 'Client Closed Request',
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
506 => 'Variant Also Negotiates',
507 => 'Insufficient Storage',
508 => 'Loop Detected',
509 => 'Bandwidth Limit Exceeded',
510 => 'Not Extended',
511 => 'Network Authentication Required',
599 => 'Network Connect Timeout Error'
];
/**
* This variable set methods to use headers
* @var $methods
*/
private $methods = [];
/**
* This variable for logs
* @var $log
*/
private $log;
/**
* This variable for set new configs.
* @var $config
*/
private $config;
########################################################################
##### CLASS METHODS #####
########################################################################
function __construct($config = null)
{
$this->config($config);
$this->blockRequest();
}
public function config($config)
{
if ($config) {
foreach ($config as $key => $val) {
$this->config[strtoupper($key)] = $val;
}
}
return $this->config;
}
public function API($contentType)
{
$this->methods([
"Access-Control-Allow-Origin" => ['*'],
"Content-Type" => $contentType,
"Access-Control-Allow-Methods" => ['GET', 'POST', 'PUT', 'DELETE'],
"Access-Control-Max-Age" => 0,
"Access-Control-Allow-Headers" => ['Origin', 'X-Requested-With', 'Content-Type', 'Accept', 'Authorization']
]);
$this->bootstrap();
}
public function response($code)
{
if (array_key_exists($code, self::HTTP_CODE_RESPONSE)) {
header("HTTP/1.0 {$code} " . self::HTTP_CODE_RESPONSE[$code]);
}
}
public function redirect($url = null)
{
// $redirect = ($url ? $url : $this->config['REDIRECT']);
// if (strpos('http://', $redirect) === false && strpos('https://', $redirect) === false) {
// $redirect = "http://$redirect";
// }
$redirect = $url ? $url : CONF_MIDDLEWARE_REDIRECT;
$this->methods([
"Location" => ($redirect)
]);
$this->bootstrap();
}
public function fileTransfer($name, $file, $mimetype)
{
//logger('logggeeeee')->info(basename($name . "." . explode('/', $mimetype)[1]));
$this->methods([
"Content-Description" => 'File Transfer',
"Content-Transfer-Encoding" => "binary",
"Content-Type" => $mimetype,
"Cache-Control" => "must-revalidate",
"Content-Length" => filesize($file),
"Content-Disposition" => "attachment; filename=" . basename($name . "." . explode('/', $mimetype)[1]),
"Expires" => 0,
"Connection" => 'close',
"Pragma" => 'public'
]);
$this->bootstrap();
ob_end_clean();
ob_start();
readfile($file);
ob_flush();
}
########################################################################
##### PRIVATE METHODS #####
########################################################################
private function bootstrap($header = null)
{
if (!$header && !$this->getMethods()) {
return null;
}
foreach ($header as $key => $val) {
if (!in_array($key, $this->headers)) {
array_push($this->headers, $key);
}
}
$this->methods($header);
$this->headers();
$this->clean();
}
private function blockRequest()
{
if ($this->config['BLOCK_REQUEST']) {
if (is_array($this->config['BLOCK_REQUEST'])) {
if (in_array($_SERVER['REMOTE_ADDR'], $this->config['BLOCK_REQUEST'])) {
$this->log->info("BLOCK REQUEST: " . $_SERVER['REMOTE_ADDR']);
$this->response(301);
$this->redirect(($this->config['REDIRECT'] ? $this->config['REDIRECT'] : 'index.php'));
exit(0);
}
} else if ($_SERVER['REMOTE_ADDR'] == $this->config['BLOCK_REQUEST']) {
$this->log->info("BLOCK REQUEST: " . $_SERVER['REMOTE_ADDR']);
$this->response(301);
$this->redirect($this->config['REDIRECT']);
exit(0);
}
}
}
private function headers()
{
foreach ($this->methods as $key => $header) {
if (in_array($key, $this->headers)) {
header("{$key}: {$header}");
}
}
}
private function methods($header)
{
foreach ($header as $key => $val) {
$method = str_replace(' ', '-', ucwords(str_replace('-', ' ', $key)));
if (is_array($val)) {
$this->methods[$method] = implode(',', $val);
} else {
$this->methods[$method] = $val;
}
}
}
private function clean()
{
unset($this->methods);
}
########################################################################
##### GETS AND SETTERS #####
########################################################################
function getMethods()
{
return $this->methods;
}
}