From 8e5dfb96dca08ff8bd5b2f7ad47dd22ac2f799c5 Mon Sep 17 00:00:00 2001 From: mo khan Date: Tue, 4 Mar 2025 14:35:24 -0700 Subject: feat: add API gateway to reverse proxy requests in front of two different services --- cmd/gtwy/main.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) (limited to 'cmd') diff --git a/cmd/gtwy/main.go b/cmd/gtwy/main.go index eb6a1b5..986741b 100644 --- a/cmd/gtwy/main.go +++ b/cmd/gtwy/main.go @@ -1,7 +1,51 @@ package main -import "fmt" +import ( + "fmt" + "log" + "net/http" + "net/http/httputil" + "strings" + "time" +) + +func NewProxy(from, to string) http.Handler { + director := func(r *http.Request) { + log.Printf("%v (from: %v to: %v)\n", r.URL, from, to) + r.URL.Scheme = "http" + r.Host = to + r.URL.Host = to + r.URL.Path = strings.TrimPrefix(r.URL.Path, strings.TrimSuffix(from, "/*")) + r.URL.RawPath = strings.TrimPrefix(r.URL.RawPath, strings.TrimSuffix(from, "/*")) + } + return &httputil.ReverseProxy{ + Director: director, + Transport: http.DefaultTransport, + FlushInterval: -1, + ErrorLog: nil, + ModifyResponse: func(r *http.Response) error { + r.Header.Add("Via", fmt.Sprintf("%v gateway", r.Proto)) + return nil + }, + ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) { + log.Println(err) + }, + } +} func main() { - fmt.Println("hello, world!") + mux := http.NewServeMux() + mux.Handle("/idp/", NewProxy("/idp", "localhost:8282")) + mux.Handle("/sp/", NewProxy("/sp", "localhost:8283")) + + srv := &http.Server{ + Addr: ":8080", + Handler: mux, + ReadHeaderTimeout: 10 * time.Second, + ReadTimeout: 30 * time.Second, + WriteTimeout: 2 * time.Minute, + IdleTimeout: 5 * time.Minute, + ErrorLog: log.Default(), + } + log.Fatal(srv.ListenAndServe()) } -- cgit v1.2.3