gestione gare pubbliche
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

<?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;
}
}
}
}