Files
mps/_examples/reverse-proxy/main.go
2023-09-01 09:57:41 +08:00

65 lines
1.5 KiB
Go

package main
import (
"errors"
"log"
"net/http"
"net/url"
"os"
"os/signal"
"syscall"
"github.com/telanflow/mps"
"github.com/telanflow/mps/middleware"
)
// A simple reverse proxy server
func main() {
targetURL, _ := url.Parse("https://www.google.com")
quitSignChan := make(chan os.Signal)
// reverse proxy server
proxy := mps.NewReverseHandler()
proxy.UseFunc(middleware.SingleHostReverseProxy(targetURL))
reqGroup := proxy.OnRequest()
reqGroup.DoFunc(func(req *http.Request, ctx *mps.Context) (*http.Request, *http.Response) {
log.Printf("[INFO] req -- %s %s", req.Method, req.Host)
return req, nil
})
respGroup := proxy.OnResponse()
respGroup.DoFunc(func(resp *http.Response, err error, ctx *mps.Context) (*http.Response, error) {
if err != nil {
log.Printf("[ERRO] resp -- %s %v", ctx.Request.Method, err)
return nil, err
}
log.Printf("[INFO] resp -- %d", resp.StatusCode)
return resp, err
})
// started proxy server
srv := http.Server{
Addr: "localhost:8080",
Handler: proxy,
}
go func() {
log.Printf("ReverseProxy started listen: http://%s", srv.Addr)
err := srv.ListenAndServe()
if errors.Is(err, http.ErrServerClosed) {
return
}
if err != nil {
quitSignChan <- syscall.SIGKILL
log.Fatalf("ReverseProxy start fail: %v", err)
}
}()
// quit signal
signal.Notify(quitSignChan, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT)
<-quitSignChan
_ = srv.Close()
log.Fatal("ReverseProxy server stop!")
}