reverse http / websocket proxy based on fasthttp
reverse http proxy handler based on fasthttp.
HTTP
reverse proxy based fasthttp
httputil.ReverseProxy
library.fasthttp.HostClient
rounddobin
HostClient
object pool with an overlay of fasthttp connection pool.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)
}
}