package main import ( "bytes" "fmt" "log" "net" ) var buff = make([]byte, 1000, 1000) func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) l, err := net.Listen("tcp", ":8081") if err != nil { log.Panic(err) } for { client, err := l.Accept() if err != nil { log.Panic(err) } go handleClientRequest(client) } } func handleClientRequest(client net.Conn) { if client == nil { return } defer client.Close() buff = buff[:0] buff = buff[:cap(buff)] c, err := client.Read(buff) if err != nil { log.Println(err) } log.Printf("%s", buff) var method, host, protocol string fmt.Sscanf(string(buff[:bytes.IndexByte(buff, '\n')]), "%s %s %s", &method, &host, &protocol) //获得了请求的host和port,就开始拨号吧 server, err := net.Dial("tcp", host) if err != nil { log.Println(err) } if method == "CONNECT" { fmt.Fprint(client, "HTTP/1.1 200 Connection established\r\n\r\n") } else { server.Write(buff[:c]) } //进行转发 go io.Copy(server, client) io.Copy(client, server) }