finalizeUrl(ArrayUtils::implodeUrl($this->prepareSearchUrlParts($ttl, $nextCursor))); } /** * Internal pre-serialization helper. * * @return array * * @internal */ protected function prepareSearchUrlParts($ttl, $nextCursor) { if ($ttl == null) { $ttl = $this->ttl; } $query = $this->asArray(); $_nextCursor = ArrayUtils::pop($query, 'next_cursor'); if ($nextCursor == null) { $nextCursor = $_nextCursor; } ksort($query); $b64Query = StringUtils::base64UrlEncode(json_encode($query)); return [ 'distribution' => $this->finalizeDistribution(), 'asset_type' => self::$assetType, 'signature' => $this->finalizeSearchSignature("{$ttl}{$b64Query}"), 'ttl' => $ttl, 'b64query' => $b64Query, 'next_cursor' => $nextCursor, ]; } /** * Finalizes URL signature. * * @see https://cloudinary.com/documentation/advanced_url_delivery_options#generating_delivery_url_signatures * * @return string * @throws ConfigurationException */ private function finalizeSearchSignature($toSign) { if (empty($this->cloud->apiSecret)) { throw new ConfigurationException('Must supply apiSecret'); } return Utils::sign( $toSign, $this->cloud->apiSecret, false, Utils::ALGO_SHA256 ); } }