Skip to content

Instantly share code, notes, and snippets.

@pdxjohnny
Forked from vmihailenco/proxy.go
Created September 27, 2016 06:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pdxjohnny/4f4baabfbc5bd27eed5a7e39d35a1982 to your computer and use it in GitHub Desktop.
Save pdxjohnny/4f4baabfbc5bd27eed5a7e39d35a1982 to your computer and use it in GitHub Desktop.
Simple TCP proxy in Golang
package main
import (
"flag"
"fmt"
"io"
"log"
"net"
)
var localAddr *string = flag.String("l", "localhost:9999", "local address")
var remoteAddr *string = flag.String("r", "localhost:80", "remote address")
func copy(send io.Writer, recv io.Reader) {
written, err := io.Copy(send, recv)
log.Println("Done proxing, wrote", written, "bytes. Finished with err:", err)
}
func proxyConn(conn *net.TCPConn) {
rAddr, err := net.ResolveTCPAddr("tcp", *remoteAddr)
if err != nil {
log.Fatal(err)
}
rConn, err := net.DialTCP("tcp", nil, rAddr)
if err != nil {
log.Fatal(err)
}
defer rConn.Close()
log.Println("Starting proxy: ", *conn, *rConn)
go copy(conn, rConn)
copy(rConn, conn)
}
func main() {
flag.Parse()
fmt.Printf("Listening: %v\nProxying: %v\n\n", *localAddr, *remoteAddr)
addr, err := net.ResolveTCPAddr("tcp", *localAddr)
if err != nil {
log.Fatal(err)
}
listener, err := net.ListenTCP("tcp", addr)
if err != nil {
log.Fatal(err)
}
for {
conn, err := listener.AcceptTCP()
if err != nil {
log.Fatal(err)
}
go proxyConn(conn)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment