Home
Softono

Fasthttp Reverse Proxy

Open source MIT Go
234
Stars
59
Forks
0
Issues
7
Watchers
6 months
Last Commit

 About Fasthttp Reverse Proxy

reverse http / websocket proxy based on fasthttp

Platforms

Web Self-hosted

Languages

Go

Links

Need Help Installing Fasthttp Reverse Proxy?

We provide expert installation service for this software. Our team will install, configure, and secure Fasthttp Reverse Proxy on your server. plans start at just $30.

Fasthttp Reverse Proxy

View on GitHub

fasthttp-reverse-proxy

Go Report Card GoReportCard

reverse http proxy handler based on fasthttp.

Features

  • HTTP reverse proxy based fasthttp

    • it's faster than golang standard httputil.ReverseProxy library.
    • implemented by fasthttp.HostClient
    • support balance distribute based rounddobin
    • HostClient object pool with an overlay of fasthttp connection pool.
  • WebSocket reverse proxy.

Get started

HTTP (with balancer option)

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)
	}
}

Websocket

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)
	}
}

Usages

Contrast

References

Thanks

JetBrains