@@ -112,6 +112,11 @@ private static interface PathParserCharProcessor {
112112 void end (PathPatternParser pathPatternParser );
113113 }
114114
115+ private static boolean isValidPathParamNameChar (int curChar ) {
116+ //only letters/digit/underscore are authorized in path param name
117+ return Character .isLetterOrDigit (curChar ) || curChar == '_' ;
118+ }
119+
115120 private static final class CurlyBracesPathParamPathParserCharProcessor implements PathParserCharProcessor {
116121 private int openBr = 1 ;
117122 private boolean inRegexDef ;
@@ -166,8 +171,8 @@ public void handle(int curChar, PathPatternParser pathPatternParser) {
166171 inRegexDef = true ;
167172 pathParamRegex .append ("(" );
168173 } else {
169- if (!Character . isLetterOrDigit (curChar )) {
170- //only letters are authorized in path param name
174+ if (!isValidPathParamNameChar (curChar )) {
175+ //only letters/digit/underscore are authorized in path param name
171176 throw new IllegalArgumentException (String .format (
172177 "illegal path parameter definition '%s' at offset %d" +
173178 " - only letters and digits are authorized in path param name" ,
@@ -188,7 +193,7 @@ private static final class SimpleColumnBasedPathParamParserCharProcessor impleme
188193 private StringBuilder pathParamName = new StringBuilder ();
189194 @ Override
190195 public void handle (int curChar , PathPatternParser pathPatternParser ) {
191- if (!Character . isLetterOrDigit (curChar )) {
196+ if (!isValidPathParamNameChar (curChar )) {
192197 pathPatternParser .patternBuilder .append ("([^\\ /]+)" );
193198 pathPatternParser .stdPathPatternBuilder .append ("{" ).append (pathParamName ).append ("}" );
194199 pathPatternParser .groupNamesBuilder .add (pathParamName .toString ());
0 commit comments