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; } /** * @param callable|NULL function(Request $request) * @return self */ public function onRequest($callback) { $this->onRequest = $callback; return $this; } /** * @param callable|NULL function(Response $response) * @return self */ public function onResponse($callback) { $this->onResponse = $callback; return $this; } protected function setupRequest(Request $request) { $request->addHeader('Expect', ''); } /** * @return Response * * @throws BadResponseException */ abstract protected function process(Request $request); }