我通過創建一個自定義撥號函數返回一個包裝連接來得到這個工作。我的包裝攔截了連接上的第一次讀取,並用HTTP/1.1替換了ICY。不是超級健壯的,但證明了這個概念:
package main
import (
"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)
}
誰的想法是偏離規範在這樣一個基本的方式?這似乎是一個糟糕的主意。你有沒有考慮分出net/http包並使其不那麼嚴格? – captncraig
這是錯的。 Icecast不會這樣回覆。這是一個HTTP 1.0兼容的服務器。另一方面,Shoutcast正在被推遲,而不是HTTP服務器。 – TBR
@ captncraig 1997是一個更簡單的時間...並不是說它找不到它。 – Brad