172 lines
4.8 KiB
PHP
172 lines
4.8 KiB
PHP
<?php
|
|
/*
|
|
Author: Riccardo Di Dato
|
|
Creation Date: 25/giu/2015
|
|
*/
|
|
|
|
/**
|
|
* Response example:
|
|
* {
|
|
* version: ${protocol_version},
|
|
* time: ${timestamp_microseconds},
|
|
* status: ${response_status},
|
|
* digest: ${digest},
|
|
* details: ${request}
|
|
* }
|
|
* @author Riccardo Di Dato
|
|
*
|
|
*/
|
|
class RAPI_Response extends RAPI_Message{
|
|
/*
|
|
* Class Static
|
|
*/
|
|
const STATUS_OK = 0;
|
|
const STATUS_MALFORMED = 1;
|
|
const STATUS_UNAUTHORIZED = 2;
|
|
const STATUS_INVALID = 3;
|
|
const STATUS_EXPIRED = 4;
|
|
const STATUS_INTERNAL_SERVER_ERROR = 5;
|
|
|
|
private static $STATUS_DATA = array(
|
|
self::STATUS_MALFORMED => array("message"=>"MALFORMED"),
|
|
self::STATUS_UNAUTHORIZED => array("message"=>"UNAUTHORIZED"),
|
|
self::STATUS_INVALID => array("message"=>"INVALID"),
|
|
self::STATUS_EXPIRED => array("message"=>"EXPIRED"),
|
|
self::STATUS_INTERNAL_SERVER_ERROR => array("message"=>"INTERNAL_SERVER_ERROR")
|
|
);
|
|
|
|
public static function getStatusDataMessage($status){
|
|
$rval = "UNKNOWN";
|
|
if (array_key_exists($status, self::$STATUS_DATA)){
|
|
return self::$STATUS_DATA[$status]["message"];
|
|
}
|
|
}
|
|
/*
|
|
* Attribute, setters e getters
|
|
*/
|
|
/**
|
|
* La richiesta relativa a questa risposta
|
|
* @var RAPI_Request
|
|
*/
|
|
private $related_request;
|
|
/**
|
|
* Restituisce la richiesta associata alla risposta
|
|
* @return RAPI_Request
|
|
*/
|
|
public function getRelatedRequest(){
|
|
return $this->related_request;
|
|
}
|
|
|
|
/**
|
|
* Lo stato della richiesta.
|
|
* In caso di richiesta non valida digest e details saranno vuoti
|
|
* @var int
|
|
*/
|
|
private $status;
|
|
/**
|
|
* Restituisce lo stato della richiesta
|
|
* @return int
|
|
*/
|
|
public function getStatus(){
|
|
return $this->status;
|
|
}
|
|
|
|
/*
|
|
* Costruttore
|
|
*/
|
|
/**
|
|
* @param RAPI_Request $relatedRequest La richiesta relativa a questa risposta
|
|
* @param string $protocolVersion La versione del protocollo RAPI
|
|
* @param RAPI_ResponseDetails $details Il contenuto del messaggio
|
|
* @param int $time Timestamp in microsecondi
|
|
* @param string $digest Digest per valutare l'autenticità del messaggio
|
|
*/
|
|
public function __construct(RAPI_Request $relatedRequest, $status, $protocolVersion, RAPI_ResponseDetails $details = NULL, $time = null, $digest = null){
|
|
$this->related_request = $relatedRequest;
|
|
$this->status = $status;
|
|
if ($this->status > 0){
|
|
// $details = new stdClass();
|
|
// $details->message = self::$STATUS_DATA[$this->status]["message"];
|
|
$details = new RAPI_SimpleMessageResponseDetails(self::$STATUS_DATA[$this->status]["message"]);
|
|
// $details = "{'message':'".self::$STATUS_DATA[$this->status]["message"]."'}";
|
|
}
|
|
else if (is_null($details)){
|
|
throw new RAPI_Exception("Building a RAPI_Response without passing a valid details object");
|
|
}
|
|
parent::__construct($protocolVersion, $details, $time, $digest);
|
|
}
|
|
|
|
/*
|
|
* Metodi propri della classe
|
|
*/
|
|
/**
|
|
* Ritorna true se la request corrisponde
|
|
* alla request che ha generato questa response
|
|
* @param RAPI_Request $req
|
|
* @return boolean
|
|
*/
|
|
public function fromSameRequest(RAPI_Request $req){
|
|
return $this->related_request->isEqual($req);
|
|
}
|
|
|
|
/**
|
|
* La funzione esegue l'operazione solo se la response ha come related una
|
|
* request in versione checksum, se le request corrispondono aggiorna
|
|
* la versione locale con quella completa, altrimenti lancia eccezione.
|
|
* @param RAPI_Request $req
|
|
* @return boolean
|
|
* @throws RAPI_Exception
|
|
*/
|
|
public function updateRelatedRequestChecksum(RAPI_Request $req){
|
|
if ($this->fromSameRequest($req)){
|
|
$this->related_request = $req;
|
|
}
|
|
else {
|
|
throw new RAPI_Exception("Calling function RAPI_Response::updateRelatedRequestChecksum() on not corresponding requests");
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Abstract
|
|
*/
|
|
/**
|
|
* @see RAPI_Message::generateEncryptionObject()
|
|
*/
|
|
protected function generateEncryptionObject(){
|
|
$rval = $this->generateEncryptionBaseObject();
|
|
$rval->status = $this->status;
|
|
return $rval;
|
|
}
|
|
/**
|
|
* NOTA: All'oggetto va aggiunta la relatedRequest !
|
|
* @see RAPI_Message::isValidObjectForCreation()
|
|
*/
|
|
protected static function isValidObjectForCreation($obj){
|
|
return self::isValidObjectForCreationBase($obj) &&
|
|
property_exists($obj, "status") &&
|
|
property_exists($obj, "relatedRequest") &&
|
|
($obj->relatedRequest instanceof RAPI_Request);
|
|
}
|
|
|
|
/**
|
|
* @see RAPI_Message::createFromObject()
|
|
*/
|
|
public static function createFromObject($obj){
|
|
if (self::isValidObjectForCreation($obj)){
|
|
$details = null;
|
|
if ($obj->status == RAPI_Response::STATUS_OK){
|
|
$requestClass = get_class($obj->relatedRequest->getDetails());
|
|
$responseClass = $requestClass::getResponseDetailsClass();
|
|
|
|
$details = new $responseClass($obj->details->data,$obj->details->attachments);
|
|
}
|
|
|
|
return new RAPI_Response($obj->relatedRequest, $obj->status, $obj->version, $details, $obj->time, $obj->digest);
|
|
}
|
|
else {
|
|
throw new RAPI_Exception("Invalid request format");
|
|
}
|
|
}
|
|
}
|
|
?>
|