Non puoi selezionare più di 25 argomenti
Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
161 righe
5.3 KiB
161 righe
5.3 KiB
<?php |
|
|
|
namespace ProcurePlus { |
|
|
|
|
|
/** |
|
* Questa classe si occupa della comunicazione HTTP tra Tuttogare e ProcurePlus |
|
*/ |
|
class HTTP |
|
{ |
|
/** |
|
* Risponde alla richiesta in corso in formato JSON |
|
* |
|
* @param array $data Dati della risposta |
|
* @param integer $httpCode Codice della risposta |
|
*/ |
|
public static function respondJson(array $data, int $httpCode = 200) { |
|
header('Content-Type: application/json'); |
|
http_response_code($httpCode); |
|
die(json_encode($data, JSON_PRETTY_PRINT)); |
|
} |
|
|
|
/** |
|
* Istanzia una classe CURL per contattare ProcurePlus |
|
* |
|
* @param string $method Metodo da invocare |
|
* @return \CurlHandle |
|
*/ |
|
private static function getCurl(string $method) { |
|
$curl = curl_init(); |
|
if ($curl === false) { |
|
throw new \Exception('Problema di rete sconosciuto.'); |
|
} |
|
|
|
global $config; |
|
if (!empty($config["procurePlus"]["url"])) { |
|
$url = $config["procurePlus"]["url"] . "/" . $method; |
|
|
|
|
|
// -- Settiamo l'url completo di target |
|
curl_setopt($curl, CURLOPT_URL, $url); |
|
|
|
// -- Popolazione dell'header |
|
curl_setopt($curl, CURLOPT_HEADER, 1); |
|
|
|
// -- Cheidiamo a CURL di darci una risposta |
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); |
|
|
|
// -- Settiamo un tiemout |
|
curl_setopt($curl, CURLOPT_TIMEOUT, 30); |
|
|
|
|
|
// -- Settiamo la config SSL |
|
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); |
|
|
|
if(DEVELOP_ENV) { |
|
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0); |
|
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); |
|
} |
|
|
|
return $curl; |
|
} |
|
} |
|
/** |
|
* Effettua una richiesta HTTP Firmata verso ProcurePlus |
|
* |
|
* @param string $url Url da contattare |
|
* @param string $domain Dominio dell'ente dalla quale parte la richiesta |
|
* @param array $requestData Dati della richiesta che saranno serializzati in JSON |
|
*/ |
|
public static function signedRequest(string $method, array $requestData = [], ?string $domain = null, ?string $key = null) |
|
{ |
|
global $config; |
|
|
|
|
|
|
|
if($domain === null) { |
|
$domain = getCurrentDomain(); |
|
} |
|
|
|
// Stringa del corpo |
|
$rawBody = json_encode($requestData); |
|
// Calcoliamo content-length |
|
$content_length = strlen($rawBody); |
|
|
|
$curl = self::getCurl($method); |
|
if (!empty($curl)) { |
|
curl_setopt($curl, CURLOPT_POST, 1); |
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $rawBody); |
|
|
|
|
|
|
|
// Adesso dobbiamo costruire il JWT per firmare la richiesta |
|
$payload = [ |
|
"bodyHash" => sha1($rawBody), |
|
]; |
|
// Adesso generiamo un JWT contenente il payload |
|
|
|
$jwt = \JOSE_JWT::encode($payload); |
|
|
|
|
|
if($key === null) { |
|
try { |
|
// Firmiamo la richiesta con la chiave di federazione |
|
$key = KeyStore::get("sign", $domain, "private"); |
|
} catch(\Exception $e) { |
|
// Dominio non federato |
|
return; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
$jwt->header["platform"] = $config["id-installazione"]; |
|
$jwt->header["domain"] = $domain; |
|
$jws = $jwt->sign($key, "RS512"); |
|
|
|
// IMPORTANTE: Ricalcoliamo l'header content-length manualmente per evitare situazioni imbarazzanti |
|
if ($content_length > 0) |
|
$headers["content-length"] = $content_length; |
|
|
|
|
|
$headers["Authorization"] = "Bearer {$jws->toString()}"; |
|
$headers["User-Agent"] = "Studio Amica Tuttogarev3 (PHP)"; |
|
// -- Popolazione degli header |
|
$plain_headers = []; |
|
foreach ($headers as $key => $header) { |
|
$plain_headers[] = $key . ": " . $header; |
|
} |
|
curl_setopt($curl, CURLOPT_HTTPHEADER, $plain_headers); |
|
curl_setopt($curl, CURLINFO_HEADER_OUT, true); |
|
|
|
|
|
|
|
// -- Inviamo la richiesta |
|
$response = curl_exec($curl); |
|
|
|
// -- Verifichiamo la richiesta |
|
if ($response === false) { |
|
$error = curl_error($curl); |
|
$httpReturnCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); |
|
|
|
if ($httpReturnCode === 0) { |
|
$httpReturnCode = 502; |
|
} |
|
$message = "Richiesta '{$method}' fallita {$httpReturnCode} '{$error}'"; |
|
throw new \Exception($message); |
|
} |
|
|
|
// -- Otteniamo la risposta |
|
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); |
|
$body = substr($response, $headerSize); |
|
// -- Puliamo |
|
curl_close($curl); |
|
|
|
return $body; |
|
} |
|
} |
|
} |
|
}
|
|
|