Skip to content

Instantly share code, notes, and snippets.

@biningo
Created November 4, 2023 06:59
Show Gist options
  • Save biningo/b6db8340ef39153a4f1ded518472b6b2 to your computer and use it in GitHub Desktop.
Save biningo/b6db8340ef39153a4f1ded518472b6b2 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"io"
"log"
"net"
"net/http"
)
var Established = []byte("HTTP/1.1 200 Connection Established\r\n\r\n")
type ProxyServer struct {
Travel *http.Transport
}
func (p *ProxyServer) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodConnect {
p.HttpsHandle(rw, r)
} else {
p.HttpHandle(rw, r)
}
}
func (p *ProxyServer) HttpHandle(rw http.ResponseWriter, r *http.Request) {
fmt.Println(r.URL)
resp, _ := p.Travel.RoundTrip(r)
fmt.Println(rw.Header())
for k := range rw.Header() {
rw.Header().Del(k)
}
for k, values := range resp.Header {
for _, v := range values {
rw.Header().Add(k, v)
}
}
rw.WriteHeader(200)
io.Copy(rw, resp.Body)
}
func (p *ProxyServer) HttpsHandle(rw http.ResponseWriter, r *http.Request) {
hj, _ := rw.(http.Hijacker)
client, _, _ := hj.Hijack()
conn, _ := net.Dial("tcp", r.URL.Host)
client.Write(Established)
go io.Copy(client, conn)
go io.Copy(conn, client)
}
func NewProxyServer(addr string) *http.Server {
log.Println("listen", addr)
return &http.Server{
Addr: addr,
Handler: &ProxyServer{Travel: &http.Transport{}},
}
}
func main() {
server := NewProxyServer(":8080")
server.ListenAndServe()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment