yeqown / fasthttp-reverse-proxy

reverse http / websocket proxy based on fasthttp
MIT License
213 stars 56 forks source link
fasthttp go http-proxy lib reverse-proxy websocket-proxy

fasthttp-reverse-proxy

Go Report Card GoReportCard

reverse http proxy handler based on fasthttp.

Features

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