@@ -192,6 +192,7 @@ func TestTreeWildcard(t *testing.T) {
192192 "/get/abc/123abg/:param" ,
193193 "/get/abc/123abf/:param" ,
194194 "/get/abc/123abfff/:param" ,
195+ "/get/abc/escaped_colon/test\\ :param" ,
195196 }
196197 for _ , route := range routes {
197198 tree .addRoute (route , fakeHandler (route ))
@@ -315,6 +316,7 @@ func TestTreeWildcard(t *testing.T) {
315316 {"/get/abc/123abg/test" , false , "/get/abc/123abg/:param" , Params {Param {Key : "param" , Value : "test" }}},
316317 {"/get/abc/123abf/testss" , false , "/get/abc/123abf/:param" , Params {Param {Key : "param" , Value : "testss" }}},
317318 {"/get/abc/123abfff/te" , false , "/get/abc/123abfff/:param" , Params {Param {Key : "param" , Value : "te" }}},
319+ {"/get/abc/escaped_colon/test\\ :param" , false , "/get/abc/escaped_colon/test\\ :param" , nil },
318320 })
319321
320322 checkPriorities (t , tree )
@@ -419,6 +421,9 @@ func TestTreeWildcardConflict(t *testing.T) {
419421 {"/id/:id" , false },
420422 {"/static/*file" , false },
421423 {"/static/" , true },
424+ {"/escape/test\\ :d1" , false },
425+ {"/escape/test\\ :d2" , false },
426+ {"/escape/test:param" , false },
422427 }
423428 testRoutes (t , routes )
424429}
@@ -971,3 +976,20 @@ func TestTreeWildcardConflictEx(t *testing.T) {
971976 }
972977 }
973978}
979+
980+ func TestTreeInvalidEscape (t * testing.T ) {
981+ routes := map [string ]bool {
982+ "/r1/r" : true ,
983+ "/r2/:r" : true ,
984+ "/r3/\\ :r" : true ,
985+ }
986+ tree := & node {}
987+ for route , valid := range routes {
988+ recv := catchPanic (func () {
989+ tree .addRoute (route , fakeHandler (route ))
990+ })
991+ if recv == nil != valid {
992+ t .Fatalf ("%s should be %t but got %v" , route , valid , recv )
993+ }
994+ }
995+ }
0 commit comments