diff --git a/public/userarea/class/VisualLimsApiClientXml.class.php b/public/userarea/class/VisualLimsApiClientXml.class.php new file mode 100644 index 0000000..c33adb1 --- /dev/null +++ b/public/userarea/class/VisualLimsApiClientXml.class.php @@ -0,0 +1,124 @@ +load(); + + $this->baseUrl = $_ENV['API_BASE_URL']; + $this->username = $_ENV['API_USERNAME']; + $this->password = $_ENV['API_PASSWORD']; + } + + public static function getInstance() + { + if (self::$instance === null) { + self::$instance = new VisualLimsApiClientXml(); + } + return self::$instance; + } + + private function authenticate() + { + $ch = curl_init("{$this->baseUrl}/api/authentication/authenticate"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([ + 'Username' => $this->username, + 'Password' => $this->password + ])); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Accept: application/json' + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_VERBOSE, true); + $log = fopen(__DIR__ . '/curl_auth_debug_xml.log', 'w') ?: fopen('php://stderr', 'w'); + curl_setopt($ch, CURLOPT_STDERR, $log); + + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curl_error = curl_error($ch); + fclose($log); + curl_close($ch); + + if ($response === false || $http_code != 200) { + throw new Exception("Autenticazione fallita: HTTP {$http_code}, Errore cURL: {$curl_error}, Risposta: " . substr($response, 0, 1000)); + } + + $token_data = json_decode($response, true); + $this->token = null; + + if (is_array($token_data) && isset($token_data['token'])) { + $this->token = $token_data['token']; + } elseif (is_string($token_data) && !empty($token_data)) { + $this->token = trim($token_data, '"'); + } elseif (is_string($response) && !empty($response)) { + $this->token = trim($response, '"'); + } + + if (empty($this->token)) { + throw new Exception("Token non ricevuto: " . substr($response, 0, 1000)); + } + } + + private function getToken() + { + if ($this->token === null) { + $this->authenticate(); + } + return $this->token; + } + + public function get($endpoint, $options = []) + { + $token = $this->getToken(); + $query = http_build_query($options); + $url = "{$this->baseUrl}/api/odata/{$endpoint}" . ($query ? '?' . $query : ''); + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Authorization: Bearer {$token}", + "Accept: application/xml" + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_VERBOSE, true); + $log = fopen(__DIR__ . '/curl_request_debug_xml.log', 'w') ?: fopen('php://stderr', 'w'); + curl_setopt($ch, CURLOPT_STDERR, $log); + + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curl_error = curl_error($ch); + fclose($log); + curl_close($ch); + + if ($response === false) { + throw new Exception("Errore nella richiesta: {$curl_error}"); + } + + if ($http_code !== 200) { + throw new Exception("Errore nel recupero dati: HTTP {$http_code}, Risposta: " . substr($response, 0, 1000)); + } + + // Verifica che la risposta sia XML + if (strpos($response, 'load(); + + $this->baseUrl = $_ENV['API_BASE_URL']; + $this->username = $_ENV['API_USERNAME']; + $this->password = $_ENV['API_PASSWORD']; + } + + public static function getInstance() + { + if (self::$instance === null) { + self::$instance = new VisualLimsApiClientXml(); + } + return self::$instance; + } + + private function authenticate() + { + $ch = curl_init("{$this->baseUrl}/api/authentication/authenticate"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([ + 'Username' => $this->username, + 'Password' => $this->password + ])); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Accept: application/json' + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_VERBOSE, true); + $log = fopen(__DIR__ . '/curl_auth_debug_xml.log', 'w') ?: fopen('php://stderr', 'w'); + curl_setopt($ch, CURLOPT_STDERR, $log); + + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curl_error = curl_error($ch); + fclose($log); + curl_close($ch); + + if ($response === false || $http_code != 200) { + throw new Exception("Autenticazione fallita: HTTP {$http_code}, Errore cURL: {$curl_error}, Risposta: " . substr($response, 0, 1000)); + } + + $token_data = json_decode($response, true); + $this->token = null; + + if (is_array($token_data) && isset($token_data['token'])) { + $this->token = $token_data['token']; + } elseif (is_string($token_data) && !empty($token_data)) { + $this->token = trim($token_data, '"'); + } elseif (is_string($response) && !empty($response)) { + $this->token = trim($response, '"'); + } + + if (empty($this->token)) { + throw new Exception("Token non ricevuto: " . substr($response, 0, 1000)); + } + } + + private function getToken() + { + if ($this->token === null) { + $this->authenticate(); + } + return $this->token; + } + + public function get($endpoint, $options = []) + { + $token = $this->getToken(); + $query = http_build_query($options); + $url = "{$this->baseUrl}/api/odata/{$endpoint}" . ($query ? '?' . $query : ''); + + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + "Authorization: Bearer {$token}", + "Accept: application/xml" + ]); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_VERBOSE, true); + $log = fopen(__DIR__ . '/curl_request_debug_xml.log', 'w') ?: fopen('php://stderr', 'w'); + curl_setopt($ch, CURLOPT_STDERR, $log); + + $response = curl_exec($ch); + $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $curl_error = curl_error($ch); + fclose($log); + curl_close($ch); + + if ($response === false) { + throw new Exception("Errore nella richiesta: {$curl_error}"); + } + + if ($http_code !== 200) { + throw new Exception("Errore nel recupero dati: HTTP {$http_code}, Risposta: " . substr($response, 0, 1000)); + } + + // Verifica che la risposta sia XML + if (strpos($response, 'get($endpoint, $options); + + // Salva il file XML in locale + file_put_contents(__DIR__ . '/metadata_response.xml', $data); + + // Restituisci il contenuto XML + echo $data; +} catch (Exception $e) { + file_put_contents(__DIR__ . '/error_log.txt', date('Y-m-d H:i:s') . ' - ' . $e->getMessage() . PHP_EOL, FILE_APPEND); + http_response_code(500); + echo '' . htmlspecialchars($e->getMessage()) . ''; +} diff --git a/public/userarea/metadata_response.xml b/public/userarea/metadata_response.xml new file mode 100644 index 0000000..453cac5 --- /dev/null +++ b/public/userarea/metadata_response.xml @@ -0,0 +1 @@ + \ No newline at end of file