From b0b2fd48336d7b7620fdb4ed9f20ca46bef81a19 Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Tue, 12 Feb 2013 13:56:19 -0800 Subject: [PATCH] CLOUDSTACK-1125: [EC2 Query API] Permission denied exception when a parameter value contains space Convert space characters in the parameters to %20 while forming a query string after url-encode because java.net.URLEncoder performs application/x-www-form-urlencoded-type encoding and not percent-encoding. According to RFC 3986 as required by Amazon, we need to percent-encode. --- awsapi/src/com/cloud/bridge/service/EC2RestServlet.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java b/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java index 5d151bac7e4..b5296a4699e 100644 --- a/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java +++ b/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java @@ -1899,10 +1899,14 @@ public class EC2RestServlet extends HttpServlet { String paramName = (String) params.nextElement(); // exclude the signature string obviously. ;) if (paramName.equalsIgnoreCase("Signature")) continue; + // URLEncoder performs application/x-www-form-urlencoded-type encoding and not Percent encoding + // according to RFC 3986 as required by Amazon, we need to Percent-encode (URL Encode) + String encodedValue = URLEncoder.encode(request.getParameter(paramName), "UTF-8") + .replace("+", "%20").replace("*", "%2A"); if (queryString == null) - queryString = paramName + "=" + URLEncoder.encode(request.getParameter(paramName), "UTF-8"); + queryString = paramName + "=" + encodedValue; else - queryString = queryString + "&" + paramName + "=" + URLEncoder.encode(request.getParameter(paramName), "UTF-8"); + queryString = queryString + "&" + paramName + "=" + encodedValue; } } }