diff --git a/test/webservices/RestTest.php b/test/webservices/RestTest.php index d600660db..d9e98f8a7 100644 --- a/test/webservices/RestTest.php +++ b/test/webservices/RestTest.php @@ -15,8 +15,11 @@ class RestTest extends ItopDataTestCase { const USE_TRANSACTION = false; + const MODE = [ 'JSONDATA_AS_STRING' => 0, 'JSONDATA_AS_FILE' => 1 , 'NO_JSONDATA' => 2 ]; + private $sTmpFile = ""; - private $bPassJsonDataAsFile = false; + /** @var int $iJsonDataMode */ + private $sJsonDataMode; private $sUrl; private $sLogin; private $sPassword = "Iuytrez9876543ç_è-("; @@ -52,16 +55,23 @@ class RestTest extends ItopDataTestCase /** * @dataProvider BasicProvider - * @param bool $bPassJsonDataAsFile + * @param int $iJsonDataMode */ - public function testCreateApi($bPassJsonDataAsFile) + public function testCreateApi($iJsonDataMode) { - $this->bPassJsonDataAsFile = $bPassJsonDataAsFile; + $this->iJsonDataMode = $iJsonDataMode; //create ticket $description = date('dmY H:i:s'); $sOuputJson = $this->CreateTicketViaApi($description); $aJson = json_decode($sOuputJson, true); + + if ($this->iJsonDataMode === self::MODE['NO_JSONDATA']){ + $this->assertContains("3", "".$aJson['code'], $sOuputJson); + $this->assertContains("Error: Missing parameter 'json_data'", "".$aJson['message'], $sOuputJson); + return; + } + $this->assertContains("0", "".$aJson['code'], $sOuputJson); $sUserRequestKey = $this->array_key_first($aJson['objects']); $this->assertContains('UserRequest::', $sUserRequestKey); @@ -99,16 +109,23 @@ JSON; /** * @dataProvider BasicProvider - * @param bool $bPassJsonDataAsFile + * @param int $iJsonDataMode */ - public function testUpdateApi($bPassJsonDataAsFile) + public function testUpdateApi($iJsonDataMode) { - $this->bPassJsonDataAsFile = $bPassJsonDataAsFile; + $this->iJsonDataMode = $iJsonDataMode; //create ticket $description = date('dmY H:i:s'); $sOuputJson = $this->CreateTicketViaApi($description); $aJson = json_decode($sOuputJson, true); + + if ($this->iJsonDataMode === self::MODE['NO_JSONDATA']){ + $this->assertContains("3", "".$aJson['code'], $sOuputJson); + $this->assertContains("Error: Missing parameter 'json_data'", "".$aJson['message'], $sOuputJson); + return; + } + $this->assertContains("0", "".$aJson['code'], $sOuputJson); $sUserRequestKey = $this->array_key_first($aJson['objects']); $this->assertContains('UserRequest::', $sUserRequestKey); @@ -130,17 +147,24 @@ JSON; } /** * @dataProvider BasicProvider - * @param bool $bPassJsonDataAsFile + * @param int $iJsonDataMode */ - public function testDeleteApi($bPassJsonDataAsFile) + public function testDeleteApi($iJsonDataMode) { - $this->bPassJsonDataAsFile = $bPassJsonDataAsFile; + $this->iJsonDataMode = $iJsonDataMode; //create ticket $description = date('dmY H:i:s'); $sOuputJson = $this->CreateTicketViaApi($description); $aJson = json_decode($sOuputJson, true); + + if ($this->iJsonDataMode === self::MODE['NO_JSONDATA']){ + $this->assertContains("3", "".$aJson['code'], $sOuputJson); + $this->assertContains("Error: Missing parameter 'json_data'", "".$aJson['message'], $sOuputJson); + return; + } + $this->assertContains("0", "".$aJson['code'], $sOuputJson); $sUserRequestKey = $this->array_key_first($aJson['objects']); $this->assertContains('UserRequest::', $sUserRequestKey); @@ -173,8 +197,9 @@ JSON; public function BasicProvider(){ return [ - 'call rest call' => [ 'bCallApiViaFile' => false], - //'pass json_data as file' => [ 'bCallApiViaFile' => true] + 'call rest call' => [ 'sJsonDataMode' => self::MODE['JSONDATA_AS_STRING']], + 'pass json_data as file' => [ 'sJsonDataMode' => self::MODE['JSONDATA_AS_FILE']], + 'no json data' => [ 'sJsonDataMode' => self::MODE['NO_JSONDATA']] ]; } @@ -228,13 +253,13 @@ JSON; 'auth_pwd' => $this->sPassword, ]; - if ($this->bPassJsonDataAsFile){ + if ($this->iJsonDataMode === self::MODE['JSONDATA_AS_STRING']){ $this->sTmpFile = tempnam(sys_get_temp_dir(), 'jsondata_'); file_put_contents($this->sTmpFile, $sJsonDataContent); $oCurlFile = curl_file_create($this->sTmpFile); $aPostFields['json_data'] = $oCurlFile; - }else{ + }else if ($this->iJsonDataMode === self::MODE['JSONDATA_AS_FILE']){ $aPostFields['json_data'] = $sJsonDataContent; } diff --git a/webservices/rest.php b/webservices/rest.php index 647a035f2..fd7e87523 100644 --- a/webservices/rest.php +++ b/webservices/rest.php @@ -70,7 +70,25 @@ $oCtx = new ContextTag(ContextTag::TAG_REST); $sVersion = utils::ReadParam('version', null, false, 'raw_data'); $sOperation = utils::ReadParam('operation', null); + +//read json_data parameter via as a string (standard behaviour) $sJsonString = utils::ReadParam('json_data', null, false, 'raw_data'); + +if (empty($sJsonString)){ + //N °3455: read json_data parameter via a file passed by http protocol + if(isset($_FILES['json_data']['tmp_name'])) + { + $sTmpFilePath = $_FILES['json_data']['tmp_name']; + if (is_file($sTmpFilePath)){ + $sValue = file_get_contents($sTmpFilePath); + unlink($sTmpFilePath); + if (! empty($sValue)){ + $sJsonString = utils::Sanitize($sValue, null, 'raw_data'); + } + } + } +} + $sProvider = ''; $oKPI = new ExecutionKPI(); @@ -125,7 +143,7 @@ try { throw new Exception("Missing parameter 'version' (e.g. '1.0')", RestResult::MISSING_VERSION); } - + if ($sJsonString == null) { throw new Exception("Missing parameter 'json_data'", RestResult::MISSING_JSON);