Skip to content

Instantly share code, notes, and snippets.

@silvernoo
Last active April 26, 2020 08:10
Show Gist options
  • Select an option

  • Save silvernoo/125b9a64a35d88621bcefd01c32d4c7f to your computer and use it in GitHub Desktop.

Select an option

Save silvernoo/125b9a64a35d88621bcefd01c32d4c7f to your computer and use it in GitHub Desktop.
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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment