use MonkeysLegion\HttpClient\Middleware\RateLimitMiddleware;
$transport->pipe(new RateLimitMiddleware(maxPerSecond: 10));
// Per-domain token bucket
use MonkeysLegion\HttpClient\Middleware\TimeoutMiddleware;
$transport->pipe(new TimeoutMiddleware(timeout: 30, connectTimeout: 5));
use MonkeysLegion\HttpClient\Bridge\PsrClientAdapter;
$psrClient = new PsrClientAdapter($httpClient);
$psrResponse = $psrClient->sendRequest($psrRequest);
// Works as drop-in for any PSR-18 consumer (Stripe, AWS SDK, etc.)
use MonkeysLegion\HttpClient\Bridge\PsrTransportAdapter;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Psr7\HttpFactory;
$guzzle = new GuzzleClient();
$factory = new HttpFactory();
$transport = new PsrTransportAdapter($guzzle, $factory, $factory);
$client = new HttpClient(transport: $transport);
use MonkeysLegion\HttpClient\Async\Pool;
use MonkeysLegion\HttpClient\DTO\RequestContext;
use MonkeysLegion\HttpClient\Enum\HttpMethod;
$requests = [
new RequestContext(HttpMethod::GET, 'https://api.example.com/users/1'),
new RequestContext(HttpMethod::GET, 'https://api.example.com/users/2'),
new RequestContext(HttpMethod::GET, 'https://api.example.com/users/3'),
];
$responses = Pool::send($transport, $requests, concurrency: 5);
// Returns list<HttpResponse> in same order as requests
use MonkeysLegion\HttpClient\Transport\MockTransport;
use MonkeysLegion\HttpClient\HttpClient;
$mock = new MockTransport();
$mock->enqueueJson(['id' => 1, 'name' => 'Test'], statusCode: 201);
$client = new HttpClient(transport: $mock);
$response = $client->post('/users', json: ['name' => 'Test']);
assert($response->statusCode === 201);
assert($response->get('name') === 'Test');
assert($mock->requestCount() === 1);
assert($mock->assertSent('/users'));