1 package reverseproxy 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "io" 8 ) 9 10 var ( 11 eoh = []byte("\r\n\r\n") 12 eol = eoh[:2] 13 host = []byte("\r\nHost: ") 14 ) 15 16 func readHTTPServerName(r io.Reader, buf []byte) (string, []byte, error) { 17 n := 1 18 h := -1 19 l := -1 20 for l < 0 { 21 m, err := r.Read(buf[n:]) 22 n += m 23 h = bytes.Index(buf[:n], host) 24 if e := bytes.Index(buf[:n], eoh); h > 0 && (e > h || e == -1) { 25 h += len(host) 26 l = bytes.Index(buf[h:n], eol) 27 } else if e >= 0 { 28 return "", buf, errNoServerHeader 29 } 30 if err != nil { 31 return "", buf, fmt.Errorf("error reading headers: %w", err) 32 } 33 } 34 return string(buf[h : h+l]), buf[:n], nil 35 } 36 37 var errNoServerHeader = errors.New("no server header") 38