Skip to content

Instantly share code, notes, and snippets.

@bradfitz
Created November 6, 2022 23:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save bradfitz/4b9d08087221e1820bbac18c474d372f to your computer and use it in GitHub Desktop.
Save bradfitz/4b9d08087221e1820bbac18c474d372f to your computer and use it in GitHub Desktop.
package main
import (
"io"
"log"
"net"
"net/http"
"os"
)
func main() {
log.Fatal(http.ListenAndServe("10.2.0.1:8123", http.HandlerFunc(handle)))
}
func handle(w http.ResponseWriter, r *http.Request) {
if r.Method == "CONNECT" {
log.Printf("CONNECT RequestURI = %q", r.RequestURI)
var d net.Dialer
c, err := d.DialContext(r.Context(), "tcp", r.RequestURI)
if err != nil {
http.Error(w, err.Error(), http.StatusBadGateway)
return
}
defer c.Close()
conn, _, err := w.(http.Hijacker).Hijack()
if err != nil {
panic(err)
}
defer conn.Close()
io.WriteString(conn, "HTTP/1.1 200 OK\r\n\r\n")
errc := make(chan error, 1)
go func() {
_, err := io.Copy(c, conn)
errc <- err
}()
go func() {
_, err := io.Copy(conn, c)
errc <- err
}()
<-errc
}
r.Write(os.Stderr)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment