diff --git a/conf/java/sample/lib-test-data.json b/conf/java/sample/lib-test-data.json index 24d529e981d..70dfeec731a 100644 --- a/conf/java/sample/lib-test-data.json +++ b/conf/java/sample/lib-test-data.json @@ -9,6 +9,11 @@ "username":"testuser2", "password":"password2", "email":"test2@dummy.com" + }, + { + "username":"user?10", + "password":"password2", + "email":"test2@dummy.com" } ], "petList":[ diff --git a/conf/java/sample/lib-test-script.json b/conf/java/sample/lib-test-script.json index 7ca629d1c4a..557263818a8 100644 --- a/conf/java/sample/lib-test-script.json +++ b/conf/java/sample/lib-test-script.json @@ -164,6 +164,21 @@ "expectedOutput" : "EXCEPTION" } ] + }, + { + "name" : "Find user by name with special characters", + "id" : 5, + "resourceId" : 9, + "input" : { + "username":"${input.userList[2].username}" + }, + "assertions" : [ + { + "actualOutput" : "${output(1.5).username}", + "condition" : "==", + "expectedOutput" : "${input.userList[2].username}" + } + ] } diff --git a/conf/java/templates/ResourceObject.st b/conf/java/templates/ResourceObject.st index 587ad8130d6..57523c525c2 100644 --- a/conf/java/templates/ResourceObject.st +++ b/conf/java/templates/ResourceObject.st @@ -78,7 +78,7 @@ $method.queryParameters:{ argument | }$ $method.pathParameters:{ argument | if( $argument.name$ != null) { - resourcePath = resourcePath.replace("{$argument.name$}", $argument.name$); + resourcePath = resourcePath.replace("{$argument.name$}", APIInvoker.toPathValue($argument.name$)); } }$ $method.headerParameters:{ argument | @@ -96,7 +96,7 @@ $method.queryParameters:{ argument | }$ $method.pathParameters:{ argument | if( $argument.inputModelClassArgument$ != null && $argument.methodNameFromModelClass$ != null) { - resourcePath = resourcePath.replace("{$argument.name$}", $argument.methodNameFromModelClass$); + resourcePath = resourcePath.replace("{$argument.name$}", APIInvoker.toPathValue($argument.methodNameFromModelClass$)); } }$ $method.headerParameters:{ argument | diff --git a/conf/scala/structure/src/main/java/com/wordnik/swagger/common/APIInvoker.java b/conf/scala/structure/src/main/java/com/wordnik/swagger/common/APIInvoker.java index 2074fe630c4..4d42541124c 100644 --- a/conf/scala/structure/src/main/java/com/wordnik/swagger/common/APIInvoker.java +++ b/conf/scala/structure/src/main/java/com/wordnik/swagger/common/APIInvoker.java @@ -17,7 +17,9 @@ package com.wordnik.swagger.common; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.lang.String; +import java.net.URLEncoder; import java.util.Map; import java.util.List; import java.util.HashMap; @@ -250,7 +252,8 @@ public class APIInvoker { * @return */ public static String toPathValue(String value) { - return value == null ? "" : value; + value = (value == null) ? "" : value; + return encode(value); } /** @@ -261,13 +264,22 @@ public class APIInvoker { */ public static String toPathValue(List objects) { StringBuilder out = new StringBuilder(); + String output = ""; for(Object o: objects){ out.append(o.toString()); out.append(","); } if(out.indexOf(",") != -1) { - return out.substring(0, out.lastIndexOf(",") ); + output = out.substring(0, out.lastIndexOf(",") ); + } + return encode(output); + } + + private static String encode(String value){ + try{ + return URLEncoder.encode(value, "utf-8").replaceAll("\\+", "%20"); + }catch(UnsupportedEncodingException uee){ + throw new RuntimeException(uee.getMessage()); } - return out.toString(); } } diff --git a/conf/scala/templates/ResourceObject.st b/conf/scala/templates/ResourceObject.st index 5d82515e964..29b2f9abd07 100644 --- a/conf/scala/templates/ResourceObject.st +++ b/conf/scala/templates/ResourceObject.st @@ -81,7 +81,7 @@ $method.headerParameters:{ argument | }$ $method.pathParameters:{ argument | if(null != $argument.name$) { - resourcePath = resourcePath.replace("{$argument.name$}", $argument.name$) + resourcePath = resourcePath.replace("{$argument.name$}", APIInvoker.toPathValue($argument.name$)) } }$ $endif$ @@ -98,7 +98,7 @@ $method.headerParameters:{ argument | }$ $method.pathParameters:{ argument | if(null != $argument.inputModelClassArgument$ && null != $argument.methodNameFromModelClass$ ) { - resourcePath = resourcePath.replace("{$argument.name$}", $argument.methodNameFromModelClass$) + resourcePath = resourcePath.replace("{$argument.name$}", APIInvoker.toPathValue($argument.methodNameFromModelClass$)) } }$ $endif$ diff --git a/src/main/java/com/wordnik/swagger/runtime/common/APIInvoker.java b/src/main/java/com/wordnik/swagger/runtime/common/APIInvoker.java index e361d362242..6eefcd88d06 100644 --- a/src/main/java/com/wordnik/swagger/runtime/common/APIInvoker.java +++ b/src/main/java/com/wordnik/swagger/runtime/common/APIInvoker.java @@ -17,7 +17,9 @@ package com.wordnik.swagger.runtime.common; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.lang.String; +import java.net.URLEncoder; import java.util.Map; import java.util.List; import java.util.HashMap; @@ -273,7 +275,8 @@ public class APIInvoker { * @return */ public static String toPathValue(String value) { - return value == null ? "" : value; + value = (value == null) ? "" : value; + return encode(value); } /** @@ -284,14 +287,23 @@ public class APIInvoker { */ public static String toPathValue(List objects) { StringBuilder out = new StringBuilder(); + String output = ""; for(Object o: objects){ out.append(o.toString()); out.append(","); } if(out.indexOf(",") != -1) { - return out.substring(0, out.lastIndexOf(",") ); + output = out.substring(0, out.lastIndexOf(",") ); + } + return encode(output); + } + + private static String encode(String value){ + try{ + return URLEncoder.encode(value, "utf-8").replaceAll("\\+", "%20"); + }catch(UnsupportedEncodingException uee){ + throw new RuntimeException(uee.getMessage()); } - return out.toString(); } public boolean isLoggingEnable() {