@@ -185,6 +185,7 @@ func TestTreeWildcard(t *testing.T) {
185185 "/get/abc/123abg/:param" ,
186186 "/get/abc/123abf/:param" ,
187187 "/get/abc/123abfff/:param" ,
188+ "/get/abc/escaped_colon/test\\ :param" ,
188189 }
189190 for _ , route := range routes {
190191 tree .addRoute (route , fakeHandler (route ))
@@ -305,6 +306,7 @@ func TestTreeWildcard(t *testing.T) {
305306 {"/get/abc/123abg/test" , false , "/get/abc/123abg/:param" , Params {Param {Key : "param" , Value : "test" }}},
306307 {"/get/abc/123abf/testss" , false , "/get/abc/123abf/:param" , Params {Param {Key : "param" , Value : "testss" }}},
307308 {"/get/abc/123abfff/te" , false , "/get/abc/123abfff/:param" , Params {Param {Key : "param" , Value : "te" }}},
309+ {"/get/abc/escaped_colon/test\\ :param" , false , "/get/abc/escaped_colon/test\\ :param" , nil },
308310 })
309311
310312 checkPriorities (t , tree )
@@ -407,6 +409,9 @@ func TestTreeWildcardConflict(t *testing.T) {
407409 {"/user_:name" , false },
408410 {"/id:id" , false },
409411 {"/id/:id" , false },
412+ {"/escape/test\\ :d1" , false },
413+ {"/escape/test\\ :d2" , false },
414+ {"/escape/test:param" , false },
410415 }
411416 testRoutes (t , routes )
412417}
@@ -886,3 +891,22 @@ func TestTreeWildcardConflictEx(t *testing.T) {
886891 }
887892 }
888893}
894+
895+ func TestTreeInvalidEscape (t * testing.T ) {
896+ routes := map [string ]bool {
897+ "/r1/r" : true ,
898+ "/r2/:r" : true ,
899+ "/r3/\\ :r" : true ,
900+ "/r4/\\ \\ :r" : false ,
901+ "/r5/\\ ~:r" : false ,
902+ }
903+ tree := & node {}
904+ for route , valid := range routes {
905+ recv := catchPanic (func () {
906+ tree .addRoute (route , fakeHandler (route ))
907+ })
908+ if recv == nil != valid {
909+ t .Fatalf ("%s should be %t but got %v" , route , valid , recv )
910+ }
911+ }
912+ }
0 commit comments