namespace App\Http\Drivers;
use Cognesy\Http\Config\HttpClientConfig;
use Cognesy\Http\Contracts\CanHandleHttpRequest;
use Cognesy\Http\Data\HttpRequest;
use Cognesy\Http\Data\HttpResponse;
use Cognesy\Http\Exceptions\HttpRequestException;
use Cognesy\Events\Contracts\CanHandleEvents;
class AcmeHttpDriver implements CanHandleHttpRequest
{
public function __construct(
private HttpClientConfig $config,
private CanHandleEvents $events,
private ?object $clientInstance = null,
) {
// Initialize your vendor client here
$this->client = $clientInstance ?? new \Acme\HttpClient([
'connect_timeout' => $config->connectTimeout,
'timeout' => $config->requestTimeout,
]);
}
public function handle(HttpRequest $request): HttpResponse
{
try {
$vendorResponse = $this->client->request(
method: $request->method(),
url: $request->url(),
headers: $request->headers(),
body: $request->body()->toString(),
);
if ($request->isStreamed()) {
return HttpResponse::streaming(
statusCode: $vendorResponse->status(),
headers: $vendorResponse->headers(),
stream: $this->adaptStream($vendorResponse),
);
}
return HttpResponse::sync(
statusCode: $vendorResponse->status(),
headers: $vendorResponse->headers(),
body: $vendorResponse->body(),
);
} catch (\Exception $e) {
throw new HttpRequestException(
message: $e->getMessage(),
request: $request,
previous: $e,
);
}
}
private function adaptStream($response): \Cognesy\Http\Stream\StreamInterface
{
return \Cognesy\Http\Stream\BufferedStream::fromStream(
(function () use ($response) {
foreach ($response->getStream() as $chunk) {
yield $chunk;
}
})()
);
}
}
// @doctest id="f9b5"