/** * Extract data or throw errors. * * @return mixed */ protected function getData() { // Check if client says "Everything aokay" if ($this->response->isSuccess()) { if ($this->response->isSplitcontent() == true) { try { $this->response->setResponse($this->rebuildSplitcontent($this->response->getSplitname(), $this->response->getSplitcount())); } catch (\RuntimeException $exc) { throw $exc; } } return $this->response->getResponse(); } else { if ($this->getDebug() == true) { $string = vsprintf($GLOBALS['TL_LANG']['ERR']['client_error'] . ":<br />%s<br /><br />RPC Call: %s | Class: %s | Function: %s", array(nl2br($this->response->getError()->getMessage()), $this->response->getError()->getRPC(), strlen($this->response->getError()->getClass()) != 0 ? $this->response->getError()->getClass() : " - ", strlen($this->response->getError()->getFunction()) != 0 ? $this->response->getError()->getFunction() : " - ")); } else { if ($this->response->getError()->getRPC() == "") { $string = "There was an unknown error on client site."; } else { $string = vsprintf($GLOBALS['TL_LANG']['ERR']['client_error'] . ":<br />%s<br /><br />RPC Call: %s", array(nl2br($this->response->getError()->getMessage()), $this->response->getError()->getRPC())); } } throw new \RuntimeException($string); } }
/** * @todo Update the error class or better make a implementation of it * @return IO */ public function InputResponse($strResponse, $objCodifyEngine) { $objDebug = Debug::getInstance(); // Check for start and end tag if (strpos($strResponse, "<|@|") === false || strpos($strResponse, "|@|>") === false) { $objDebug->addDebug("Error CtoComIOImpl_Default", substr($strResponse, 0, 4096)); throw new \RuntimeException("Could not find start or endtag from response."); } // Find position of start/end - tag $intStart = intval(strpos($strResponse, "<|@|") + 4); $intLength = intval(strpos($strResponse, "|@|>") - $intStart); $strResponse = substr($strResponse, $intStart, $intLength); $strResponse = base64_decode($strResponse); $strResponse = @gzuncompress($strResponse); // Check if uncompress works if ($strResponse === false) { throw new \RuntimeException("Error on uncompressing the response. Maybe wrong API-Key or ctoCom version."); } // Decrypt $strResponse = $objCodifyEngine->Decrypt($strResponse); // Deserialize response $arrResponse = unserialize($strResponse); // Check if we have a array if (is_array($arrResponse) == false) { $objDebug->addDebug("Error CtoComIOImpl_Default", substr($arrResponse, 0, 4096)); throw new \RuntimeException("Response is not an array. Maybe wrong API-Key or cryptionengine."); } // Clean array $arrResponse = $this->cleanUp($arrResponse); $objContainer = new IO(); $objContainer->setSuccess($arrResponse["success"]); $objContainer->setResponse($arrResponse["response"]); $objContainer->setSplitcontent($arrResponse["splitcontent"]); $objContainer->setSplitcount($arrResponse["splitcount"]); $objContainer->setSplitname($arrResponse["splitname"]); // Set error if ($arrResponse["error"] != "") { $objError = new Error(); $objError->setID($arrResponse["error"]["id"]); $objError->setObject($arrResponse["error"]["object"]); $objError->setMessage($arrResponse["error"]["msg"]); $objError->setRPC($arrResponse["error"]["rpc"]); $objError->setClass($arrResponse["error"]["class"]); $objError->setFunction($arrResponse["error"]["function"]); $objError->setException($arrResponse["error"]["exception"]); $objContainer->setError($objError); } return $objContainer; }
/** * Build the answer and serialize it * * @return string */ protected function generateOutput() { $objOutputContainer = new IO(); if ($this->objError == false) { $objOutputContainer->setSuccess(true); $objOutputContainer->setResponse($this->mixOutput); $objOutputContainer->setSplitcontent(false); $objOutputContainer->setSplitcount(0); $objOutputContainer->setSplitname(""); } else { $objOutputContainer->setSuccess(false); $objOutputContainer->setError($this->objError); $objOutputContainer->setResponse(null); $objOutputContainer->setSplitcontent(false); $objOutputContainer->setSplitcount(0); $objOutputContainer->setSplitname(""); } $mixOutput = $this->objIOEngine->OutputResponse($objOutputContainer, $this->objCodifyengine); // Check if we have a big output and split it if ($this->config->getResponseLength() != -1 && strlen($mixOutput) > $this->config->getResponseLength()) { $mixOutput = str_split($mixOutput, (int) ($this->config->getResponseLength() * 0.8)); $strFileName = md5(time()) . md5(rand(0, 65000)) . ".ctoComPart"; $intCountPart = count($mixOutput); foreach ($mixOutput as $keyOutput => $valueOutput) { $objFile = new \File("system/tmp/" . $keyOutput . "_" . $strFileName); $objFile->write($valueOutput); $objFile->close(); } $objOutputContainer = new IO(); $objOutputContainer->setSuccess(true); $objOutputContainer->setResponse(null); $objOutputContainer->setSplitcontent(true); $objOutputContainer->setSplitcount($intCountPart); $objOutputContainer->setSplitname($strFileName); $mixOutput = $this->objIOEngine->OutputResponse($objOutputContainer, $this->objCodifyengine); } // Set some header fields header("Content-Type: " . $GLOBALS["CTOCOM_IO"][$this->strIOEngine]["contentType"]); // Clean output buffer while (@ob_end_clean()) { } // Echo response echo $mixOutput; }