appSecret = \Constants::$secret; } //发送请求,获取result,带重试 public function getResult($requestPath, $fields, $retries) { $result = new \Result($this->getReq($requestPath, $fields)); if ($result->getErrorCode() == \ErrorCode::Success) { return $result; } //重试 for ($i = 0; $i < $retries; $i++) { $result = new \Result($this->getReq($requestPath, $fields)); if ($result->getErrorCode() == \ErrorCode::Success) { break; } } return $result; } //get方式发送请求 public function getReq($requestPath, $fields, $timeout = 3) { return $this->httpRequest($requestPath, $fields, "Get", $timeout); } //发送请求,获取result,带重试 public function postResult($requestPath, $fields, $retries) { $result = new \Result($this->postReq($requestPath, $fields)); if ($result->getErrorCode() == \ErrorCode::Success) { return $result; } //重试 for ($i = 0; $i < $retries; $i++) { $result = new \Result($this->postReq($requestPath, $fields)); if ($result->getErrorCode() == \ErrorCode::Success) { break; } } return $result; } //post方式发送请求 public function postReq($requestPath, $fields, $timeout = 10) { return $this->httpRequest($requestPath, $fields, "Post", $timeout); } private function buildFullRequestURL(Server $server, PushRequestPath $requestPath) { return \Constants::$HTTP_PROTOCOL . "://" . $server->getHost() . $requestPath->getPath(); } private function httpRequest($requestPath, $fields, $method, $timeout = 10) { $server = \ServerSwitch::getInstance()->selectServer($requestPath); $url = $this->buildFullRequestURL($server, $requestPath); $headers = array('Authorization: key=' . $this->appSecret, 'Content-Type: application/x-www-form-urlencoded;charset=UTF-8', \Constants::X_PUSH_SDK_VERSION . ': ' . \Constants::SDK_VERSION); if (\Constants::$autoSwitchHost && \ServerSwitch::getInstance()->needRefreshHostList()) { array_push($headers, \Constants::X_PUSH_HOST_LIST . ': true'); } // Open connection $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, true); if ($method == "Post") { curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields)); } else { curl_setopt($ch, CURLOPT_URL, $url . '?' . http_build_query($fields)); curl_setopt($ch, CURLOPT_POST, false); } $content = curl_exec($ch); $result = ""; if ($content !== false) { $info = curl_getinfo($ch); $total_time = $info['total_time']; if ($total_time > \Constants::HOST_RESPONSE_EXPECT_TIME) { $server->decrPriority(); } else { $server->incrPriority(); } list($responseHeaderStr, $result) = explode("\r\n\r\n", $content, 2); $responseHeaders = $this->convertHeaders($responseHeaderStr); if (array_key_exists(\Constants::X_PUSH_HOST_LIST, $responseHeaders)) { $serverListStr = $responseHeaders[\Constants::X_PUSH_HOST_LIST]; \ServerSwitch::getInstance()->initialize($serverListStr); } } else { $server->decrPriority(); $result = json_encode(array( "code" => \ErrorCode::NETWORK_ERROR_TIMEOUT, "reason" => "network error or timeout" )); } // Close connection curl_close($ch); return $result; } /** * @param $responseHeaderStr * @return array */ private function convertHeaders($responseHeaderStr) { $responseHeaderArr = explode("\r\n", $responseHeaderStr); $responseHeaders = array(); foreach ($responseHeaderArr as $responseHeader) { $items = explode(":", $responseHeader, 2); if ($items !== false) { if (count($items) == 2) { $responseHeaders[trim($items[0])] = trim($items[1]); } else { $responseHeaders["Header_" . count($responseHeaders)] = trim($responseHeader); } } } return $responseHeaders; } } ?>