Skip to content

Commit 438b45a

Browse files
committed
Addressed review feedback in PR openai-php#553 and updated related tests
1 parent 0cfa823 commit 438b45a

File tree

4 files changed

+129
-42
lines changed

4 files changed

+129
-42
lines changed

src/Exceptions/UnexpectedStatusCodeException.php

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,114 @@
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+
17+
private array $contents;
18+
1119
/**
12-
* Creates a new Exception instance.
20+
* Creates a new UnexpectedStatusCodeException instance.
1321
*
14-
* @param int $statusCode The HTTP status code.
22+
* @param int $statusCode The unexpected HTTP status code.
23+
* @param RequestInterface $request The request that was sent.
24+
* @param ResponseInterface $response The response that was received.
1525
*/
16-
17-
public function __construct(int $statusCode)
26+
public function __construct(int $statusCode, RequestInterface $request, ResponseInterface $response)
1827
{
19-
$message = "Unexpected status code: {$statusCode}";
28+
$this->request = $request;
29+
$this->response = $response;
30+
31+
$body = (string) $response->getBody();
32+
$decoded = json_decode($body, true);
33+
34+
$this->contents = is_array($decoded['error'] ?? null)
35+
? $decoded['error']
36+
: ['message' => $body, 'type' => null, 'code' => null];
37+
38+
$message = ($this->contents['message'] ?: "Unexpected status code: {$statusCode}");
39+
40+
if (is_array($message)) {
41+
$message = implode(PHP_EOL, $message);
42+
}
2043

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

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)