FFIVE
我通过创建一个返回包装连接的自定义 Dial 函数来实现这一点。我的包装器拦截了连接上的第一次读取,并用 HTTP/1.1 替换了 ICY。不是超级健壮,但证明了这个概念:package mainimport ( "fmt" "net" "net/http")type IcyConnWrapper struct { net.Conn haveReadAny bool}func (i *IcyConnWrapper) Read(b []byte) (int, error) { if i.haveReadAny { return i.Conn.Read(b) } i.haveReadAny = true //bounds checking ommitted. There are a few ways this can go wrong. //always check array sizes and returned n. n, err := i.Conn.Read(b[:3]) if err != nil { return n, err } if string(b[:3]) == "ICY" { //write Correct http response into buffer copy(b, []byte("HTTP/1.1")) return 8, nil } return n, nil}func main() { tr := &http.Transport{ Dial: func(network, a string) (net.Conn, error) { realConn, err := net.Dial(network, a) if err != nil { return nil, err } return &IcyConnWrapper{Conn: realConn}, nil }, } client := &http.Client{Transport: tr} http.DefaultClient = client resp, err := http.Get("http://178.33.230.189:8100") //random url I found on the internet fmt.Println(err) fmt.Println(resp.StatusCode)}