@@ -334,9 +334,19 @@ func TestParser(t *testing.T) {
334334 require .Equal (t , "/AAA" , path )
335335 })
336336
337- t .Run ("path nonprintable" , func (t * testing.T ) {
338- _ , err := parsePath ("/%41%07" )
339- require .EqualError (t , err , status .ErrBadRequest .Error ())
337+ t .Run ("path urlencoded unicode" , func (t * testing.T ) {
338+ t .Run ("fastpath" , func (t * testing.T ) {
339+ parser , request := getParser (config .Default ())
340+ _ , _ , err := parser .Parse ([]byte ("GET /%D0%9F%D0%B0%D0%B2%D0%BB%D0%BE " ))
341+ require .NoError (t , err )
342+ require .Equal (t , "/%d0%9f%d0%b0%d0%b2%d0%bb%d0%be" , request .Path )
343+ })
344+
345+ t .Run ("slowpath" , func (t * testing.T ) {
346+ request , err := parseRequestLine ("/%D0%9F%D0%B0%D0%B2%D0%BB%D0%BE" )
347+ require .NoError (t , err )
348+ require .Equal (t , "/%d0%9f%d0%b0%d0%b2%d0%bb%d0%be" , request .Path )
349+ })
340350 })
341351
342352 t .Run ("unsafe" , func (t * testing.T ) {
@@ -395,14 +405,6 @@ func TestParser(t *testing.T) {
395405 require .Equal (t , "Slava Ukraini" , params .Value ("hello world" ))
396406 })
397407
398- t .Run ("fastpath nonprintable" , func (t * testing.T ) {
399- _ , err := parseParams ("hello%07=world" )
400- require .EqualError (t , err , status .ErrBadParams .Error ())
401-
402- _ , err = parseParams ("hello=wor%07ld" )
403- require .EqualError (t , err , status .ErrBadParams .Error ())
404- })
405-
406408 splitchars := func (str string ) []string {
407409 byChars := make ([]string , len (str ))
408410 for i := range str {
@@ -420,12 +422,19 @@ func TestParser(t *testing.T) {
420422 require .Equal (t , "Heroyam Slava" , params .Value ("Slava Ukraini" ))
421423 })
422424
423- t .Run ("slowpath nonprintable" , func (t * testing.T ) {
424- _ , err := parseParams (splitchars ("h%07ey=hello" )... )
425- require .EqualError (t , err , status .ErrBadParams .Error ())
425+ t .Run ("allow unicode values" , func (t * testing.T ) {
426+ t .Run ("fastpath" , func (t * testing.T ) {
427+ parser , request := getParser (config .Default ())
428+ _ , _ , err := parser .Parse ([]byte ("GET /?n=Слава+Україні " ))
429+ require .NoError (t , err )
430+ require .Equal (t , "Слава Україні" , request .Params .Value ("n" ))
431+ })
426432
427- _ , err = parseParams (splitchars ("hey=he%07llo" )... )
428- require .EqualError (t , err , status .ErrBadParams .Error ())
433+ t .Run ("slowpath" , func (t * testing.T ) {
434+ request , err := parseRequestLine ("/?n=Слава+Україні" )
435+ require .NoError (t , err )
436+ require .Equal (t , "Слава Україні" , request .Params .Value ("n" ))
437+ })
429438 })
430439 })
431440 })
@@ -534,18 +543,13 @@ func TestParser(t *testing.T) {
534543 {
535544 Name : "encoded nonprintable" ,
536545 Sample : "/%ff" ,
537- WantError : status . ErrBadRequest ,
546+ WantError : nil ,
538547 },
539548 {
540549 Name : "param key nonprintable" ,
541550 Sample : "/?he%07llo=world" ,
542551 WantError : status .ErrBadParams ,
543552 },
544- {
545- Name : "param value nonprintable" ,
546- Sample : "/?hello=wor%07ld" ,
547- WantError : status .ErrBadParams ,
548- },
549553 {
550554 Name : "fragment" ,
551555 Sample : "/hello#Section1" ,
0 commit comments