package main import ("bufio" "strings" "net" "net/url" "net/http" "io/ioutil") func panicOnErr(err error, msg string) { if err != nil { panic(msg+":"+err.Error()) } } func byDial(req *http.Request) (*http.Response,error) { port := "" if ! strings.Contains(req.URL.Host,":") { port = ":80" } c,err := net.Dial("tcp",req.URL.Host+port) panicOnErr(err,"dial") req.Write(c) resp,err := http.ReadResponse(bufio.NewReader(c),req) panicOnErr(err,"read resp") return resp,nil } func byTransport(req *http.Request) (*http.Response,error) { resp,err := http.DefaultTransport.RoundTrip(req) panicOnErr(err,"read resp") return resp,nil } func byClient(req *http.Request) (*http.Response,error) { client := &http.Client{} return client.Do(req) } func reqBy(u *url.URL,f func(*http.Request)(*http.Response,error)) string { req,err := http.NewRequest("GET",u.String(),nil) panicOnErr(err,"newreq") resp,err := f(req) panicOnErr(err,"read resp") defer resp.Body.Close() b,err := ioutil.ReadAll(resp.Body) panicOnErr(err,"readall") return resp.Status+"\n'''"+string(b[:50])+"'''\n" } func main() { m := map[string]func(*http.Request)(*http.Response,error){ "client":byClient, "transport":byTransport, "dial":byDial, } for _,urlStr := range []string{"http://tip.golang.org","http://t.co/UZqlvMMQ"} { println("GET",urlStr) u,err := url.Parse(urlStr) panicOnErr(err,"parse") for name,f := range m { println(name+":",reqBy(u,f)) } println("====") } }