Skip to content

Commit 2193390

Browse files
committed
Addressed review feedback in PR #553 and updated related tests
1 parent 0cfa823 commit 2193390

File tree

4 files changed

+138
-42
lines changed

4 files changed

+138
-42
lines changed

src/Exceptions/UnexpectedStatusCodeException.php

Lines changed: 109 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,123 @@
55
namespace OpenAI\Exceptions;
66

77
use Exception;
8+
use Psr\Http\Message\RequestInterface;
9+
use Psr\Http\Message\ResponseInterface;
810

911
final class UnexpectedStatusCodeException extends Exception
1012
{
13+
private RequestInterface $request;
14+
15+
private ResponseInterface $response;
16+
1117
/**
12-
* Creates a new Exception instance.
13-
*
14-
* @param int $statusCode The HTTP status code.
18+
* @var array{message: string|null, type: string|null, code: int|string|null}
1519
*/
20+
private array $contents;
1621

17-
public function __construct(int $statusCode)
22+
/**
23+
* Creates a new UnexpectedStatusCodeException instance.
24+
*
25+
* @param int $statusCode The unexpected HTTP status code.
26+
* @param RequestInterface $request The request that was sent.
27+
* @param ResponseInterface $response The response that was received.
28+
*/
29+
public function __construct(int $statusCode, RequestInterface $request, ResponseInterface $response)
1830
{
19-
$message = "Unexpected status code: {$statusCode}";
31+
$this->request = $request;
32+
$this->response = $response;
33+
34+
$body = (string) $response->getBody();
35+
$decoded = json_decode($body, true);
36+
37+
$error = [];
38+
if (is_array($decoded) && isset($decoded['error']) && is_array($decoded['error'])) {
39+
$error = $decoded['error'];
40+
}
41+
42+
$this->contents = [
43+
'message' => ($error['message'] ?? null) ?: "Unexpected status code: {$statusCode}",
44+
'type' => $error['type'] ?? null,
45+
'code' => $error['code'] ?? null,
46+
];
47+
48+
$message = $this->contents['message'];
49+
if (is_array($message)) {
50+
$message = implode(PHP_EOL, $message);
51+
}
2052

2153
parent::__construct($message, $statusCode);
2254
}
55+
56+
/**
57+
* Returns the HTTP status code of the response.
58+
*/
59+
public function getStatusCode(): int
60+
{
61+
return $this->response->getStatusCode();
62+
}
63+
64+
/**
65+
* Returns the error message.
66+
*/
67+
public function getErrorMessage(): string
68+
{
69+
return $this->getMessage();
70+
}
71+
72+
/**
73+
* Returns the error code if available.
74+
*/
75+
public function getErrorCode(): string|int|null
76+
{
77+
return $this->contents['code'] ?? null;
78+
}
79+
80+
/**
81+
* Returns the error type if available.
82+
*/
83+
public function getErrorType(): ?string
84+
{
85+
return $this->contents['type'] ?? null;
86+
}
87+
88+
/**
89+
* Returns the request that was made.
90+
*/
91+
public function getRequest(): RequestInterface
92+
{
93+
return $this->request;
94+
}
95+
96+
/**
97+
* Returns the response that was received.
98+
*/
99+
public function getResponse(): ResponseInterface
100+
{
101+
return $this->response;
102+
}
103+
104+
/**
105+
* Returns a string representation of the request.
106+
*/
107+
public function getRequestDetails(): string
108+
{
109+
return sprintf(
110+
'Request: %s %s',
111+
$this->request->getMethod(),
112+
$this->request->getUri()
113+
);
114+
}
115+
116+
/**
117+
* Returns a string representation of the response.
118+
*/
119+
public function getResponseDetails(): string
120+
{
121+
return sprintf(
122+
'Response: %d %s',
123+
$this->response->getStatusCode(),
124+
$this->response->getReasonPhrase()
125+
);
126+
}
23127
}

src/Transporters/HttpTransporter.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use OpenAI\ValueObjects\Transporter\Response;
2121
use Psr\Http\Client\ClientExceptionInterface;
2222
use Psr\Http\Client\ClientInterface;
23+
use Psr\Http\Message\RequestInterface;
2324
use Psr\Http\Message\ResponseInterface;
2425

2526
/**
@@ -49,7 +50,7 @@ public function requestObject(Payload $payload): Response
4950

5051
$response = $this->sendRequest(fn (): \Psr\Http\Message\ResponseInterface => $this->client->sendRequest($request));
5152

52-
$this->throwIfNotSuccessfulStatusCode($response);
53+
$this->throwIfNotSuccessfulStatusCode($response, $request);
5354

5455
$contents = (string) $response->getBody();
5556

@@ -78,7 +79,7 @@ public function requestContent(Payload $payload): string
7879

7980
$response = $this->sendRequest(fn (): \Psr\Http\Message\ResponseInterface => $this->client->sendRequest($request));
8081

81-
$this->throwIfNotSuccessfulStatusCode($response);
82+
$this->throwIfNotSuccessfulStatusCode($response, $request);
8283

8384
$contents = (string) $response->getBody();
8485

@@ -96,7 +97,7 @@ public function requestStream(Payload $payload): ResponseInterface
9697

9798
$response = $this->sendRequest(fn () => ($this->streamHandler)($request));
9899

99-
$this->throwIfNotSuccessfulStatusCode($response);
100+
$this->throwIfNotSuccessfulStatusCode($response, $request);
100101

101102
$this->throwIfJsonError($response, $response);
102103

@@ -144,12 +145,12 @@ private function throwIfJsonError(ResponseInterface $response, string|ResponseIn
144145
}
145146
}
146147

147-
private function throwIfNotSuccessfulStatusCode(ResponseInterface $response): void
148+
private function throwIfNotSuccessfulStatusCode(ResponseInterface $response, RequestInterface $request): void
148149
{
149150
$statusCode = $response->getStatusCode();
150151

151152
if ($statusCode < 200 || $statusCode >= 300) {
152-
throw new UnexpectedStatusCodeException($statusCode);
153+
throw new UnexpectedStatusCodeException($statusCode, $request, $response);
153154
}
154155
}
155156
}

tests/Arch.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
->expect('OpenAI\Exceptions')
2020
->toOnlyUse([
2121
'Psr\Http\Client',
22+
'Psr\Http\Message',
2223
])->toImplement(Throwable::class);
2324

2425
test('resources')->expect('OpenAI\Resources')->toOnlyUse([

0 commit comments

Comments
 (0)