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); //print_r($url); //print_r($response); $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; } else if (isset($xml->ErrorDescription)) { $error = (string) $xml->ErrorDescription; } else if (isset($xml->Reason)) { $error = (string) $xml->Reason; } if (isset($xml->ErrorNumber)) { $code = (integer) $xml->ErrorNumber; } else if (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) { $message = $this->toString($client); // or $this->toString($response) $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(); } } ?>