/** * Make an OAI-PMH request. Die if there is an error; return a SimpleXML object * on success. * * @param string $verb OAI-PMH verb to execute. * @param array $params GET parameters for ListRecords method. * * @return object SimpleXML-formatted response. */ protected function sendRequest($verb, $params = array()) { // Debug: if ($this->verbose) { Console::write("Sending request: verb = {$verb}, params = " . print_r($params, true)); } // Set up retry loop: while (true) { // Set up the request: $request = new Client(null, array('timeout' => 60)); $request->setUri($this->baseURL); // Load request parameters: $query = $request->getRequest()->getQuery(); $query->set('verb', $verb); foreach ($params as $key => $value) { $query->set($key, $value); } // Perform request and die on error: $result = $request->setMethod('GET')->send(); if ($result->getStatusCode() == 503) { $delayHeader = $result->getHeaders()->get('Retry-After'); $delay = is_object($delayHeader) ? $delayHeader->getDeltaSeconds() : 0; if ($delay > 0) { if ($this->verbose) { Console::writeLine("Received 503 response; waiting {$delay} seconds..."); } sleep($delay); } } else { if (!$result->isSuccess()) { throw new \Exception('HTTP Error'); } else { // If we didn't get an error, we can leave the retry loop: break; } } } // If we got this far, there was no error -- send back response. return $this->processResponse($result->getBody()); }