Skip to content

Commit

Permalink
Add Fetch classes and exceptions for HTTP handling
Browse files Browse the repository at this point in the history
  • Loading branch information
Thavarshan committed Jan 8, 2025
1 parent 0eded66 commit 3e686d9
Show file tree
Hide file tree
Showing 24 changed files with 838 additions and 1,593 deletions.
9 changes: 6 additions & 3 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,14 @@
]
},
"require": {
"php": "^8.0",
"php": "^8.3",
"guzzlehttp/guzzle": "^7.9",
"guzzlehttp/psr7": "^2.7",
"psr/http-message": "^1.0|^2.0",
"jerome/matrix": "^2.0"
"illuminate/contracts": "^11.37",
"illuminate/events": "^11.37",
"illuminate/support": "^11.37",
"jerome/matrix": "^3.1",
"psr/http-message": "^1.0|^2.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.64",
Expand Down
9 changes: 8 additions & 1 deletion src/Fetch/Enum/Status.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,15 @@ enum Status: int
case UNSUPPORTED_MEDIA_TYPE = 415;
case RANGE_NOT_SATISFIABLE = 416;
case EXPECTATION_FAILED = 417;
case UPGRADE_REQUIRED = 426;
case IM_A_TEAPOT = 418;
case MISDIRECTED_REQUEST = 421;
case UNPROCESSABLE_ENTITY = 422;
case LOCKED = 423;
case FAILED_DEPENDENCY = 424;
case PRECONDITION_REQUIRED = 428;
case TOO_MANY_REQUESTS = 429;
case REQUEST_HEADER_FIELDS_TOO_LARGE = 431;
case UNAVAILABLE_FOR_LEGAL_REASONS = 451;
case INTERNAL_SERVER_ERROR = 500;
case NOT_IMPLEMENTED = 501;
case BAD_GATEWAY = 502;
Expand Down
32 changes: 32 additions & 0 deletions src/Fetch/Events/ConnectionFailed.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Fetch\Events;

use Fetch\Exceptions\ConnectionException;
use Fetch\Request;

class ConnectionFailed
{
/**
* The request instance.
*/
public Request $request;

/**
* The exception instance.
*/
public ConnectionException $exception;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Request $request, ConnectionException $exception)
{
$this->request = $request;
$this->exception = $exception;
}
}
25 changes: 25 additions & 0 deletions src/Fetch/Events/RequestSending.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

namespace Fetch\Events;

use Fetch\Request;

class RequestSending
{
/**
* The request instance.
*/
public Request $request;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Request $request)
{
$this->request = $request;
}
}
32 changes: 32 additions & 0 deletions src/Fetch/Events/ResponseReceived.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Fetch\Events;

use Fetch\Request;
use Fetch\Response;

class ResponseReceived
{
/**
* The request instance.
*/
public Request $request;

/**
* The response instance.
*/
public Response $response;

/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Request $request, Response $response)
{
$this->request = $request;
$this->response = $response;
}
}
10 changes: 10 additions & 0 deletions src/Fetch/Exceptions/ConnectionException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace Fetch\Exceptions;

class ConnectionException extends HttpClientException
{
//
}
12 changes: 12 additions & 0 deletions src/Fetch/Exceptions/HttpClientException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

declare(strict_types=1);

namespace Fetch\Exceptions;

use Exception;

class HttpClientException extends Exception
{
//
}
74 changes: 74 additions & 0 deletions src/Fetch/Exceptions/RequestException.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?php

declare(strict_types=1);

namespace Fetch\Exceptions;

use Fetch\Response;
use GuzzleHttp\Psr7\Message;

class RequestException extends HttpClientException
{
/**
* The response instance.
*/
public Response $response;

/**
* The truncation length for the exception message.
*/
public static int|false $truncateAt = 120;

/**
* Create a new exception instance.
*
* @return void
*/
public function __construct(Response $response)
{
parent::__construct(
$this->prepareMessage($response),
$response->status()
);

$this->response = $response;
}

/**
* Enable truncation of request exception messages.
*/
public static function truncate(): void
{
static::$truncateAt = 120;
}

/**
* Set the truncation length for request exception messages.
*/
public static function truncateAt(int $length): void
{
static::$truncateAt = $length;
}

/**
* Disable truncation of request exception messages.
*/
public static function dontTruncate(): void
{
static::$truncateAt = false;
}

/**
* Prepare the exception message.
*/
protected function prepareMessage(Response $response): string
{
$message = "HTTP request returned status code {$response->status()}";

$summary = static::$truncateAt
? Message::bodySummary($response->toPsrResponse(), static::$truncateAt)
: Message::toString($response->toPsrResponse());

return is_null($summary) ? $message : $message .= ":\n{$summary}\n";
}
}
Loading

0 comments on commit 3e686d9

Please sign in to comment.