password = $config['password']; $this->userId = $config['user']; $this->interfaceId = $config['interface']; $this->profileId = $config['profile']; $this->orgId = $config['organization']; $this->local_ip_address = $config['local_ip_address']; $this->isGuest = (user_is_logged_in() || $this->isGuestIPAddress($_SERVER["REMOTE_ADDR"])) ? 'n' : 'y'; $this->logAPIRequests = ($config['log'] == 1); if ($this->logAPIRequests) { $writer = new Zend_Log_Writer_Stream('php://output'); $this->logger = new Zend_Log($writer); } } /** * Detects if the user is authorized based on the IP address. * * @return string */ public function isGuestIPAddress($ipUser) { $s = $this->local_ip_address; if (trim($s) == "") { return FALSE; } // Break records. $m = explode(",", $s); foreach ($m as $ip) { if (strcmp(substr($ipUser, 0, strlen(trim($ip))), trim($ip)) == 0) { // Inside of ip address range of customer. return TRUE; } } return FALSE; } /** * Public getter for private isGuest . * * @param none * * @return string isGuest * * @access public */ public function isGuest() { return $this->isGuest; } /** * Request the authentication token. * * @param none * * @return object SimpleXml or PEAR_Error * * @access public */ public function requestAuthenticationToken() { $url = self::$authentication_end_point . '/UIDAuth'; // Add the body of the request. $params = << {$this->userId} {$this->password} {$this->interfaceId} BODY; $response = $this->request($url, $params, array(), 'POST'); return $response; } /** * Request the session token. * * @param array $headers * Authentication token. * * @return object SimpleXml or PEAR_Error * * @access public */ public function requestSessionToken($headers) { $url = self::$end_point . '/CreateSession'; // Add the HTTP query params. $params = array( 'profile' => $this->profileId, 'org' => $this->orgId, 'guest' => $this->isGuest, ); $response = $this->request($url, $params, $headers); return $response; } /** * Request the search records. * * @param array $params * Search specific parameters. * @param array $headers * Authentication and session tokens. * * @return object SimpleXml or PEAR_Error * * @access public */ public function requestSearch($params, $headers) { $url = self::$end_point . '/Search'; $response = $this->request($url, $params, $headers); return $response; } /** * Request a specific record. * * @param array $params * Retrieve specific parameters. * @param array $headers * Authentication and session tokens. * * @return object SimpleXml or PEAR_Error * * @access public */ public function requestRetrieve($params, $headers) { $url = self::$end_point . '/Retrieve'; $response = $this->request($url, $params, $headers); return $response; } /** * Request the info data. * * @param null $params * Not used. * @param array $headers * Authentication and session tokens. * * @return object SimpleXml or PEAR_Error * * @access public */ public function requestInfo($params, $headers) { $url = self::$end_point . '/Info'; $response = $this->request($url, $params, $headers); return $response; } /** * Send an HTTP request and inspect the response. * * @param string $url * The url of the HTTP request. * @param array $params * The parameters of the HTTP request. * @param array $headers * The headers of the HTTP request. * @param array $body * The body of the HTTP request. * @param string $method * The HTTP method, default is 'GET'. * * @return object SimpleXml or PEAR_Error * * @access protected */ protected function request($url, $params, $headers = array(), $method = 'GET') { $xml = FALSE; $return = FALSE; $data = NULL; if (!empty($params)) { // Arrays of parameters are used only for GET requests. if (is_array($params)) { $query = http_build_query($params, '', '&'); $query = preg_replace('/\%5B\d+\%5D/', '', $query); $url = $url . '?' . $query; // String parameters are used only for POST requests. } else { $data = $params; $headers = array_merge( array('content-type' => 'text/xml'), $headers ); } } // Add compression in case its not there. $headers = array_merge( array('Accept-Encoding' => 'gzip,deflate'), $headers ); $options = array( 'headers' => $headers, 'method' => $method, 'data' => $data, ); // Send the request. try { $response = drupal_http_request($url, $options); $code = $response->code; if (isset($response->headers['content-encoding'])) { if ($response->headers['content-encoding'] == 'gzip') { $response->data = gzinflate(substr($response->data, 10)); } elseif ($response->headers['content-encoding'] == 'deflate') { $response->data = gzinflate($response->data); } } switch ($code) { case self::HTTP_OK: $xml_str = $response->data; try { // Clean EMP namespace. $xml_str = str_replace(array("data; try { $xml = simplexml_load_string($xml_str); // If the response is an API error. $isError = isset($xml->ErrorNumber) || isset($xml->ErrorCode); if ($isError) { $error = ''; $code = 0; if (isset($xml->DetailedErrorDescription) && !empty($xml->DetailedErrorDescription)) { $error = (string) $xml->DetailedErrorDescription; } elseif (isset($xml->ErrorDescription)) { $error = (string) $xml->ErrorDescription; } elseif (isset($xml->Reason)) { $error = (string) $xml->Reason; } if (isset($xml->ErrorNumber)) { $code = (integer) $xml->ErrorNumber; } elseif (isset($xml->ErrorCode)) { $code = (integer) $xml->ErrorCode; } $return = new EBSCOException($error, $code); } else { $return = new EBSCOException("HTTP {$code} : The request could not be understood by the server due to malformed syntax. Modify your search before retrying."); } } catch (Exception $e) { $return = new EBSCOException($xml); } break; case self::HTTP_NOT_FOUND: $return = new EBSCOException("HTTP {$code} : The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable."); break; case self::HTTP_INTERNAL_SERVER_ERROR: $return = new EBSCOException("HTTP {$code} : The server encountered an unexpected condition which prevented it from fulfilling the request."); break; default: $return = new EBSCOException("HTTP {$code} : Unexpected HTTP error."); break; } } catch (Exception $e) { // Or $this->toString($response) $message = $this->toString($client); $this->logger->log($message, Zend_Log::ERR); $return = new EBSCOException($response); } // Log any error /*if ($this->logAPIRequests) { // $client = both the HTTP request and response // $response = only the HTTP response $message = $this->toString($client); // or $this->toString($response) $this->logger->log($message, Zend_Log::ERR); }*/ return $return; } /** * Capture the output of print_r into a string. * * @param object Any object * * @access private */ private function toString($object) { ob_start(); print_r($object); return ob_get_clean(); } }