maxRedirects; $previous = null; do { $this->setupRequest($request); $this->onRequest && call_user_func($this->onRequest, $request); $response = $this->process($request); $this->onResponse && call_user_func($this->onResponse, $response); $previous = $response->setPrevious($previous); if ($counter > 0 && in_array($response->getCode(), $this->redirectCodes) && $response->hasHeader('Location')) { /** @todo Use the same HTTP $method for redirection? Set $content to NULL? */ $request = new Request( $request->getMethod(), $response->getHeader('Location'), $request->getHeaders(), $request->getContent() ); $counter--; continue; } break; } while (true); return $response; } /** @inheritdoc */ public function onRequest(?callable $callback): static { $this->onRequest = $callback; return $this; } /** @inheritdoc */ public function onResponse(?callable $callback): static { $this->onResponse = $callback; return $this; } protected function setupRequest(Request $request): void { $request->addHeader('Expect', ''); } /** * @throws BadResponseException */ abstract protected function process(Request $request): Response; }