@Override public String sign(Policy policy) throws UrlSigningException { if (!accepts(policy.getBaseUrl())) { throw UrlSigningException.urlNotSupported(); } // Get the key that matches this URI since there must be one that matches as the base url has been accepted. KeyEntry keyEntry = getKeyEntry(policy.getBaseUrl()); policy.setResourceStrategy(getResourceStrategy()); try { URI uri = new URI(policy.getBaseUrl()); List<NameValuePair> queryStringParameters = new ArrayList<>(); if (uri.getQuery() != null) { queryStringParameters = URLEncodedUtils.parse(new URI(policy.getBaseUrl()).getQuery(), StandardCharsets.UTF_8); } queryStringParameters.addAll(URLEncodedUtils.parse( ResourceRequestUtil.policyToResourceRequestQueryString(policy, keyEntry.getId(), keyEntry.getKey()), StandardCharsets.UTF_8)); return new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), uri.getPath(), URLEncodedUtils.format(queryStringParameters, StandardCharsets.UTF_8), null).toString(); } catch (Exception e) { getLogger().error("Unable to create signed URL because {}", ExceptionUtils.getStackTrace(e)); throw new UrlSigningException(e); } }