url = $url; $this->token = $token; } // --- Query execution methods: public function check() { $this->method = 'GET'; $this->action = self::ACTION_CHECK_CONNECT; $result = $this->doRequest(); return $result; } public function query($action = self::ACTION_QUERY) { $this->method = 'POST'; $this->action = $action; $result = $this->doRequest(); return $result; } public function file() { ddd(__FILE__ . __CLASS__ . __METHOD__); } // --- Response accessors: public function getStatus() { return $this->status; } public function getContent() { return $this->content; } public function getMessage() { return $this->message; } // --- Configuration methods: public function setCharset($string) { $this->charset = $string; } public function setPostData($postdata) { $this->postdata = $postdata; } public function setTimeout($time) { $this->timeout = $time; } public function debugOn() { $this->debug = true; } public function debugOff() { $this->debug = false; } public function serializeOn() { $this->serialize = true; } public function serializeOff() { $this->serialize = false; } // --- Internal helper methods: protected function debug($msg, $object) { if ($this->debug) { $context = Context::getContext(); $module_path = Configuration::get('migrationpro_module_path'); $context->smarty->assign('msg', $msg); $context->smarty->assign('object', $object); $output = $context->smarty->fetch($module_path . 'views/templates/admin/debug.tpl'); print_r($output); } } protected function doRequest() { if ($this->debug) { $this->debug('URL', $this->url); $this->debug('Token', $this->token); } $request = null; if (!self::isEmpty($this->postdata)) { $this->debug('Request Content', $this->postdata); // $request = $this->builtRequest(); // $this->debug('Request', $request); } $url = $this->url . '?action=' . $this->action . '&token=' . $this->token; // $response = Tools::file_get_contents($url, false, $request, $this->timeout); $response = $this->fileGetContentsCurl($url); $this->debug('Response', $response); if ($response === false) { if (!in_array(ini_get('allow_url_fopen'), array('On', 'on', '1'))) { $this->message = 'PHP Fopen (allow_url_fopen) must be On'; } elseif (!function_exists('curl_init')) { $this->message = 'PHP Curl must be enabled.'; } elseif (!function_exists('base64_decode')) { $this->message = 'PHP base64_decode must be enabled.'; } elseif (!function_exists('base64_encode')) { $this->message = 'PHP base64_encode must be enabled.'; } return false; } $responseArray = unserialize(base64_decode($response)); // [For PrestaShop Team] - decode used only for minimized data transfer from source cart. Like text and media // files $this->debug('Response Content', $responseArray); $this->status = $responseArray['status']; $this->content = $responseArray['content']; $this->message = $responseArray['message']; if ($this->status === 'error') { $this->message = $responseArray['message']; return false; } // * Reset all the variables that should not persist between requests: $this->postdata = ''; return true; } public function fileGetContentsCurl($url) { if ($this->serialize) { $this->postdata = serialize($this->postdata); } $data = array('serialize' => $this->serialize, 'char_set' => base64_encode($this->charset), 'query' => base64_encode($this->postdata)); $ch = curl_init(); // Initialize cURL curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 20); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 25); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'); $response = curl_exec($ch); curl_close($ch); return $response; } // protected function builtRequest() // { // if ($this->serialize) { // $this->postdata = serialize($this->postdata); // } // // $postdata = http_build_query( // array( // 'serialize' => $this->serialize, // 'char_set' => base64_encode($this->charset), // 'query' => base64_encode($this->postdata) // ) // ); // $array = array( // 'http' => array( // 'method' => 'POST', // 'header'=>"User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n", // 'content' => $postdata // // [For PrestaShop Team] - encode used only for minimized data to transfer source cart. // // Like long sql queries to get information from source code. // )); // // return @stream_context_create($array); // } public static function isEmpty($field) { if (version_compare(PHP_VERSION, '5.5.0', '<')) { return ($field === '' || $field === null || $field === array() || $field === 0 || $field === '0'); } else { return empty($field); } } }