@
rkonfj #19 这是一个用 Go 实现的简单代 http 理服务器,把所有 http 请求都代理到 backend (可以设置你自签 CA 的 https 服务器)
```
package main
import (
"crypto/tls"
"crypto/x509"
"flag"
"net/http"
"net/http/httputil"
"net/url"
"os"
)
var (
backend string
caPath string
)
func main() {
flag.StringVar(&backend, "backend", "", "server URL")
flag.StringVar(&caPath, "ca", "", "ca certificate path")
flag.Parse()
backendURL, _ := url.Parse(backend)
caCertPool, _ := x509.SystemCertPool()
if caPath != "" {
caCert, err := os.ReadFile(caPath)
if err != nil {
panic(err)
}
if ok := caCertPool.AppendCertsFromPEM(caCert); !ok {
panic("append CA failed")
}
}
rp := httputil.NewSingleHostReverseProxy(backendURL)
rp.Transport = &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: caCertPool,
ServerName: backendURL.Hostname(),
},
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
r.Header.Del("Proxy-Connection")
r.Host = backendURL.Host
rp.ServeHTTP(w, r)
})
http.ListenAndServe(":3080", nil)
}
```