@@ -112,6 +112,11 @@ private static interface PathParserCharProcessor {
112
112
void end (PathPatternParser pathPatternParser );
113
113
}
114
114
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
+
115
120
private static final class CurlyBracesPathParamPathParserCharProcessor implements PathParserCharProcessor {
116
121
private int openBr = 1 ;
117
122
private boolean inRegexDef ;
@@ -166,8 +171,8 @@ public void handle(int curChar, PathPatternParser pathPatternParser) {
166
171
inRegexDef = true ;
167
172
pathParamRegex .append ("(" );
168
173
} 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
171
176
throw new IllegalArgumentException (String .format (
172
177
"illegal path parameter definition '%s' at offset %d" +
173
178
" - only letters and digits are authorized in path param name" ,
@@ -188,7 +193,7 @@ private static final class SimpleColumnBasedPathParamParserCharProcessor impleme
188
193
private StringBuilder pathParamName = new StringBuilder ();
189
194
@ Override
190
195
public void handle (int curChar , PathPatternParser pathPatternParser ) {
191
- if (!Character . isLetterOrDigit (curChar )) {
196
+ if (!isValidPathParamNameChar (curChar )) {
192
197
pathPatternParser .patternBuilder .append ("([^\\ /]+)" );
193
198
pathPatternParser .stdPathPatternBuilder .append ("{" ).append (pathParamName ).append ("}" );
194
199
pathPatternParser .groupNamesBuilder .add (pathParamName .toString ());
0 commit comments