Skip to content

Commit

Permalink
Add components:
Browse files Browse the repository at this point in the history
Add core files to components directory,
Add response class.
  • Loading branch information
Mohammadreza-73 committed Feb 4, 2023
1 parent 42c3483 commit 5b45a0c
Show file tree
Hide file tree
Showing 7 changed files with 258 additions and 9 deletions.
8 changes: 6 additions & 2 deletions app/Core/Request.php → app/Core/Components/Http/Request.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
<?php

namespace App\Core;
namespace App\Core\Components\Http;

/**
* Request Class
* @package App\Core\Components\Http\Request
*/
class Request
{
private array $request_data = [];
Expand Down Expand Up @@ -72,7 +76,7 @@ public function isset(string $key = 'params', string $params_key = null): bool
*/
public function redirect(string $route): void
{
header('Location: ' . siteUrl($route));
header('Location: ' . app_url($route));
die();
}

Expand Down
245 changes: 245 additions & 0 deletions app/Core/Components/Http/Response.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
<?php

namespace App\Core\Components\Http;

/**
* Response Class
* @package App\Core\Components\Http\Response
*/
class Response
{
public const HTTP_CONTINUE = 100;
public const HTTP_SWITCHING_PROTOCOLS = 101;
public const HTTP_PROCESSING = 102; // RFC2518
public const HTTP_EARLY_HINTS = 103; // RFC8297
public const HTTP_OK = 200;
public const HTTP_CREATED = 201;
public const HTTP_ACCEPTED = 202;
public const HTTP_NON_AUTHORITATIVE_INFORMATION = 203;
public const HTTP_NO_CONTENT = 204;
public const HTTP_RESET_CONTENT = 205;
public const HTTP_PARTIAL_CONTENT = 206;
public const HTTP_MULTI_STATUS = 207; // RFC4918
public const HTTP_ALREADY_REPORTED = 208; // RFC5842
public const HTTP_IM_USED = 226; // RFC3229
public const HTTP_MULTIPLE_CHOICES = 300;
public const HTTP_MOVED_PERMANENTLY = 301;
public const HTTP_FOUND = 302;
public const HTTP_SEE_OTHER = 303;
public const HTTP_NOT_MODIFIED = 304;
public const HTTP_USE_PROXY = 305;
public const HTTP_RESERVED = 306;
public const HTTP_TEMPORARY_REDIRECT = 307;
public const HTTP_PERMANENTLY_REDIRECT = 308; // RFC7238
public const HTTP_BAD_REQUEST = 400;
public const HTTP_UNAUTHORIZED = 401;
public const HTTP_PAYMENT_REQUIRED = 402;
public const HTTP_FORBIDDEN = 403;
public const HTTP_NOT_FOUND = 404;
public const HTTP_METHOD_NOT_ALLOWED = 405;
public const HTTP_NOT_ACCEPTABLE = 406;
public const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;
public const HTTP_REQUEST_TIMEOUT = 408;
public const HTTP_CONFLICT = 409;
public const HTTP_GONE = 410;
public const HTTP_LENGTH_REQUIRED = 411;
public const HTTP_PRECONDITION_FAILED = 412;
public const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;
public const HTTP_REQUEST_URI_TOO_LONG = 414;
public const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
public const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
public const HTTP_EXPECTATION_FAILED = 417;
public const HTTP_I_AM_A_TEAPOT = 418; // RFC2324
public const HTTP_MISDIRECTED_REQUEST = 421; // RFC7540
public const HTTP_UNPROCESSABLE_ENTITY = 422; // RFC4918
public const HTTP_LOCKED = 423; // RFC4918
public const HTTP_FAILED_DEPENDENCY = 424; // RFC4918
public const HTTP_TOO_EARLY = 425; // RFC-ietf-httpbis-replay-04
public const HTTP_UPGRADE_REQUIRED = 426; // RFC2817
public const HTTP_PRECONDITION_REQUIRED = 428; // RFC6585
public const HTTP_TOO_MANY_REQUESTS = 429; // RFC6585
public const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431; // RFC6585
public const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451;
public const HTTP_INTERNAL_SERVER_ERROR = 500;
public const HTTP_NOT_IMPLEMENTED = 501;
public const HTTP_BAD_GATEWAY = 502;
public const HTTP_SERVICE_UNAVAILABLE = 503;
public const HTTP_GATEWAY_TIMEOUT = 504;
public const HTTP_VERSION_NOT_SUPPORTED = 505;
public const HTTP_VARIANT_ALSO_NEGOTIATES_EXPERIMENTAL = 506; // RFC2295
public const HTTP_INSUFFICIENT_STORAGE = 507; // RFC4918
public const HTTP_LOOP_DETECTED = 508; // RFC5842
public const HTTP_NOT_EXTENDED = 510; // RFC2774
public const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC6585

/**
* @var string
*/
public $headers;

/**
* @var string $charset
*/
protected $charset = 'utf-8';

/**
* @var string
*/
protected $content;

/**
* @var string
*/
protected $version = '1.1';

/**
* @var int
*/
protected $status_code;

/**
* @var string
*/
protected $status_text;

/**
* Status codes translation table.
*
* Unless otherwise noted, the status code is defined in RFC2616.
*
* @var array
*/
public static $status_texts = [
100 => 'Continue',
101 => 'Switching Protocols',
102 => 'Processing', // RFC2518
103 => 'Early Hints',
200 => 'OK',
201 => 'Created',
202 => 'Accepted',
203 => 'Non-Authoritative Information',
204 => 'No Content',
205 => 'Reset Content',
206 => 'Partial Content',
207 => 'Multi-Status', // RFC4918
208 => 'Already Reported', // RFC5842
226 => 'IM Used', // RFC3229
300 => 'Multiple Choices',
301 => 'Moved Permanently',
302 => 'Found',
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect', // RFC7238
400 => 'Bad Request',
401 => 'Unauthorized',
402 => 'Payment Required',
403 => 'Forbidden',
404 => 'Not Found',
405 => 'Method Not Allowed',
406 => 'Not Acceptable',
407 => 'Proxy Authentication Required',
408 => 'Request Timeout',
409 => 'Conflict',
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
413 => 'Content Too Large', // RFC-ietf-httpbis-semantics
414 => 'URI Too Long',
415 => 'Unsupported Media Type',
416 => 'Range Not Satisfiable',
417 => 'Expectation Failed',
418 => 'I\'m a teapot', // RFC2324
421 => 'Misdirected Request', // RFC7540
422 => 'Unprocessable Content', // RFC-ietf-httpbis-semantics
423 => 'Locked', // RFC4918
424 => 'Failed Dependency', // RFC4918
425 => 'Too Early', // RFC-ietf-httpbis-replay-04
426 => 'Upgrade Required', // RFC2817
428 => 'Precondition Required', // RFC6585
429 => 'Too Many Requests', // RFC6585
431 => 'Request Header Fields Too Large', // RFC6585
451 => 'Unavailable For Legal Reasons', // RFC7725
500 => 'Internal Server Error',
501 => 'Not Implemented',
502 => 'Bad Gateway',
503 => 'Service Unavailable',
504 => 'Gateway Timeout',
505 => 'HTTP Version Not Supported',
506 => 'Variant Also Negotiates', // RFC2295
507 => 'Insufficient Storage', // RFC4918
508 => 'Loop Detected', // RFC5842
510 => 'Not Extended', // RFC2774
511 => 'Network Authentication Required', // RFC6585
];

public function __construct(?string $content = '', int $status = 200, string $headers = '')
{
$this->content = $content;
$this->status_code = $status;
$this->headers = $headers;
}

public function __toString()
{
return sprintf('HTTP/%s %s %s', $this->version, $this->status_code, $this->status_text) . "\r\n" .
$this->headers . "\r\n" .
$this->getContent();
}

public function setStatusCode(int $status): Response
{
$this->status_code = $status;

return $this;
}

public function getStatusCode(): int
{
return $this->status_code;
}

public function setCharset(string $charset): Response
{
$this->charset = $charset;

return $this;
}

public function getCharset(): string
{
return $this->charset;
}

public function setContent(?string $content): Response
{
$this->content = $content ?? '';

return $this;
}

public function getContent(): string
{
return $this->content;
}

/**
* Json encode
*
* @param $data
* @throws RuntimeException
* @return string|null
*/
public function jsonEncode($data): ?string
{
return json_encode($data, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT);
}

public function setHeader(string $header): Response
{
$this->headers = header("Content-Type: $header");

return $this;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

namespace App\Core\Routing;
namespace App\Core\Components\Routing;

class Route
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
<?php

namespace App\Core\Routing;
namespace App\Core\Components\Routing;

use Closure;
use App\Core\Request;
use App\Core\Routing\Route;
use App\Core\Components\Http\Request;
use App\Core\Components\Routing\Route;
use App\Exceptions\ClassNotFoundException;
use App\Exceptions\MethodNotFoundException;
use App\Http\Middleware\Middleware as GlobalMiddleware;
Expand Down
2 changes: 1 addition & 1 deletion bootstrap/init.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@
$whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler);
$whoops->register();

$request = new \App\Core\Request();
$request = new \App\Core\Components\Http\Request();

include base_path('routes/web.php');
2 changes: 1 addition & 1 deletion public/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

require_once '../bootstrap/init.php';

use App\Core\Routing\Router;
use App\Core\Components\Routing\Router;

$router = new Router();
$router->run();
2 changes: 1 addition & 1 deletion routes/web.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?php

use App\Core\Routing\Route;
use App\Core\Components\Routing\Route;
use App\Http\Middleware\BlockIE;

Route::get('/', function () {
Expand Down

0 comments on commit 5b45a0c

Please sign in to comment.