mirror of
https://github.com/telanflow/mps.git
synced 2025-09-26 20:41:25 +08:00
65 lines
1.5 KiB
Go
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!")
|
|
}
|