reverse http proxy handler based on fasthttp.
[x] HTTP
reverse proxy based fasthttp
httputil.ReverseProxy
library.fasthttp.HostClient
rounddobin
HostClient
object pool with an overlay of fasthttp connection pool.[x] WebSocket
reverse proxy.
var (
proxyServer = proxy.NewReverseProxy("localhost:8080")
// use with balancer
// weights = map[string]proxy.Weight{
// "localhost:8080": 20,
// "localhost:8081": 30,
// "localhost:8082": 50,
// }
// proxyServer = proxy.NewReverseProxy("", proxy.WithBalancer(weights))
)
// ProxyHandler ... fasthttp.RequestHandler func
func ProxyHandler(ctx *fasthttp.RequestCtx) {
// all proxy to localhost
proxyServer.ServeHTTP(ctx)
}
func main() {
if err := fasthttp.ListenAndServe(":8081", ProxyHandler); err != nil {
log.Fatal(err)
}
}
var (
proxyServer *proxy.WSReverseProxy
once sync.Once
)
// ProxyHandler ... fasthttp.RequestHandler func
func ProxyHandler(ctx *fasthttp.RequestCtx) {
once.Do(func() {
var err error
proxyServer, err = proxy.NewWSReverseProxyWith(
proxy.WithURL_OptionWS("ws://localhost:8080/echo"),
// [OPTIONAL]: you can override path from `WithURL_OptionWS`
// by providing WithDynamicPath_OptionWS.
proxy.WithDynamicPath_OptionWS(true, proxy.DefaultOverrideHeader),
)
if err != nil {
panic(err)
}
})
switch string(ctx.Path()) {
case "/echo":
// [OPTIONAL]: you can override path from `WithURL_OptionWS`
// by providing proxy.DefaultOverrideHeader (or any custom) header
// ctx.Request.Header.Set(proxy.DefaultOverrideHeader, "/real_echo")
proxyServer.ServeHTTP(ctx)
case "/":
fasthttp.ServeFileUncompressed(ctx, "./index.html")
default:
ctx.Error("Unsupported path", fasthttp.StatusNotFound)
}
}
func main() {
log.Println("serving on: 8081")
if err := fasthttp.ListenAndServe(":8081", ProxyHandler); err != nil {
log.Fatal(err)
}
}