@@ -27,6 +27,8 @@ import (
27
27
"sync"
28
28
29
29
"golang_org/x/net/idna"
30
+ "golang_org/x/text/unicode/norm"
31
+ "golang_org/x/text/width"
30
32
)
31
33
32
34
const (
@@ -581,6 +583,19 @@ func (req *Request) write(w io.Writer, usingProxy bool, extraHeaders Header, wai
581
583
return nil
582
584
}
583
585
586
+ func idnaASCII (v string ) (string , error ) {
587
+ if isASCII (v ) {
588
+ return v , nil
589
+ }
590
+ // The idna package doesn't do everything from
591
+ // https://tools.ietf.org/html/rfc5895 so we do it here.
592
+ // TODO(bradfitz): should the idna package do this instead?
593
+ v = strings .ToLower (v )
594
+ v = width .Fold .String (v )
595
+ v = norm .NFC .String (v )
596
+ return idna .ToASCII (v )
597
+ }
598
+
584
599
// cleanHost cleans up the host sent in request's Host header.
585
600
//
586
601
// It both strips anything after '/' or ' ', and puts the value
@@ -600,13 +615,13 @@ func cleanHost(in string) string {
600
615
}
601
616
host , port , err := net .SplitHostPort (in )
602
617
if err != nil { // input was just a host
603
- a , err := idna . ToASCII (in )
618
+ a , err := idnaASCII (in )
604
619
if err != nil {
605
620
return in // garbage in, garbage out
606
621
}
607
622
return a
608
623
}
609
- a , err := idna . ToASCII (host )
624
+ a , err := idnaASCII (host )
610
625
if err != nil {
611
626
return in // garbage in, garbage out
612
627
}
0 commit comments