diff --git a/go.mod b/go.mod index 2a1dfdd0..2e84fe1e 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/codeshelldev/secured-signal-api -go 1.25.1 +go 1.25.3 require go.uber.org/zap v1.27.0 @@ -17,5 +17,5 @@ require ( github.com/mitchellh/reflectwalk v1.0.2 // indirect go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/sys v0.36.0 // indirect + golang.org/x/sys v0.37.0 // indirect ) diff --git a/go.sum b/go.sum index cd5ee27b..5d68b7cf 100644 --- a/go.sum +++ b/go.sum @@ -36,8 +36,8 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internals/proxy/middlewares/aliases.go b/internals/proxy/middlewares/aliases.go index 287b09fa..3337501c 100644 --- a/internals/proxy/middlewares/aliases.go +++ b/internals/proxy/middlewares/aliases.go @@ -12,13 +12,12 @@ import ( request "github.com/codeshelldev/secured-signal-api/utils/request" ) -type AliasMiddleware struct { - Next http.Handler +var Aliases Middleware = Middleware{ + Name: "Aliases", + Use: aliasesHandler, } -func (data AliasMiddleware) Use() http.Handler { - next := data.Next - +func aliasesHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { settings := getSettingsByReq(req) diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 47b545d6..202c0ecd 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -11,27 +11,12 @@ import ( log "github.com/codeshelldev/secured-signal-api/utils/logger" ) -type AuthMiddleware struct { - Next http.Handler +var Auth Middleware = Middleware{ + Name: "Auth", + Use: authHandler, } -func getAuthType(str string) authType { - switch str { - case "Bearer": - return Bearer - case "Basic": - return Basic - default: - return None - } -} - -func isValidToken(tokens []string, match string) bool { - return slices.Contains(tokens, match) -} - -func (data AuthMiddleware) Use() http.Handler { - next := data.Next +func authHandler(next http.Handler) http.Handler { tokens := config.ENV.API_TOKENS return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { @@ -109,3 +94,18 @@ func (data AuthMiddleware) Use() http.Handler { next.ServeHTTP(w, req) }) } + +func getAuthType(str string) authType { + switch str { + case "Bearer": + return Bearer + case "Basic": + return Basic + default: + return None + } +} + +func isValidToken(tokens []string, match string) bool { + return slices.Contains(tokens, match) +} \ No newline at end of file diff --git a/internals/proxy/middlewares/endpoints.go b/internals/proxy/middlewares/endpoints.go index de1fa97c..24ef2c3e 100644 --- a/internals/proxy/middlewares/endpoints.go +++ b/internals/proxy/middlewares/endpoints.go @@ -8,13 +8,12 @@ import ( log "github.com/codeshelldev/secured-signal-api/utils/logger" ) -type EndpointsMiddleware struct { - Next http.Handler +var Endpoints Middleware = Middleware{ + Name: "Endpoints", + Use: endpointsHandler, } -func (data EndpointsMiddleware) Use() http.Handler { - next := data.Next - +func endpointsHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { settings := getSettingsByReq(req) diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index 151aac2f..017bdd3a 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -6,13 +6,12 @@ import ( log "github.com/codeshelldev/secured-signal-api/utils/logger" ) -type LogMiddleware struct { - Next http.Handler +var Logging Middleware = Middleware{ + Name: "Logging", + Use: loggingHandler, } -func (data LogMiddleware) Use() http.Handler { - next := data.Next - +func loggingHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { log.Info(req.Method, " ", req.URL.Path, " ", req.URL.RawQuery) diff --git a/internals/proxy/middlewares/message.go b/internals/proxy/middlewares/message.go index f9ac9b8c..5925402e 100644 --- a/internals/proxy/middlewares/message.go +++ b/internals/proxy/middlewares/message.go @@ -10,13 +10,12 @@ import ( request "github.com/codeshelldev/secured-signal-api/utils/request" ) -type MessageMiddleware struct { - Next http.Handler +var Message Middleware = Middleware{ + Name: "Message", + Use: messageHandler, } -func (data MessageMiddleware) Use() http.Handler { - next := data.Next - +func messageHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { settings := getSettingsByReq(req) diff --git a/internals/proxy/middlewares/middleware.go b/internals/proxy/middlewares/middleware.go new file mode 100644 index 00000000..fe0af218 --- /dev/null +++ b/internals/proxy/middlewares/middleware.go @@ -0,0 +1,38 @@ +package middlewares + +import ( + "net/http" + + "github.com/codeshelldev/secured-signal-api/utils/logger" +) + +type Middleware struct { + Name string + Use func(http.Handler) http.Handler +} + +type Chain struct { + middlewares []Middleware +} + +func NewChain() *Chain { + return &Chain{} +} + +func (chain *Chain) Use(middleware Middleware) *Chain { + chain.middlewares = append(chain.middlewares, middleware) + + logger.Debug("Registered ", middleware.Name) + + return chain +} + +func (chain *Chain) Then(final http.Handler) http.Handler { + handler := final + + for i := len(chain.middlewares) - 1; i >= 0; i-- { + handler = chain.middlewares[i].Use(handler) + } + + return handler +} \ No newline at end of file diff --git a/internals/proxy/middlewares/server.go b/internals/proxy/middlewares/server.go index fab44b06..84af5737 100644 --- a/internals/proxy/middlewares/server.go +++ b/internals/proxy/middlewares/server.go @@ -6,18 +6,19 @@ import ( "github.com/codeshelldev/secured-signal-api/utils/config" ) -type ServeMiddleware struct { - Next http.Handler +var Server Middleware = Middleware{ + Name: "Server", + Use: serverHandler, } -func (data ServeMiddleware) Use() http.Handler { +func serverHandler(next http.Handler) http.Handler { mux := http.NewServeMux() mux.HandleFunc("/favicon.ico", func(w http.ResponseWriter, req *http.Request) { http.ServeFile(w, req, config.ENV.FAVICON_PATH) }) - mux.Handle("/", data.Next) + mux.Handle("/", next) return mux } diff --git a/internals/proxy/middlewares/template.go b/internals/proxy/middlewares/template.go index 3f006476..ecb5de79 100644 --- a/internals/proxy/middlewares/template.go +++ b/internals/proxy/middlewares/template.go @@ -17,13 +17,12 @@ import ( templating "github.com/codeshelldev/secured-signal-api/utils/templating" ) -type TemplateMiddleware struct { - Next http.Handler +var Template Middleware = Middleware{ + Name: "Template", + Use: templateHandler, } -func (data TemplateMiddleware) Use() http.Handler { - next := data.Next - +func templateHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { variables := getSettingsByReq(req).VARIABLES diff --git a/internals/proxy/middlewares/types/types.go b/internals/proxy/middlewares/types/types.go index 689ee4e5..582268ee 100644 --- a/internals/proxy/middlewares/types/types.go +++ b/internals/proxy/middlewares/types/types.go @@ -1,7 +1,7 @@ // Pretty useless, but go requires separate package // since import cycles are not allowed -package middlewareTypes +package types type DataAlias struct { Alias string `koanf:"alias"` diff --git a/internals/proxy/proxy.go b/internals/proxy/proxy.go index e99c01c4..88129889 100644 --- a/internals/proxy/proxy.go +++ b/internals/proxy/proxy.go @@ -1,14 +1,44 @@ package proxy import ( + "net/http" "net/http/httputil" "net/url" + + m "github.com/codeshelldev/secured-signal-api/internals/proxy/middlewares" ) -func Create(targetUrl string) *httputil.ReverseProxy { +type Proxy struct { + Use func() *httputil.ReverseProxy +} + +func Create(targetUrl string) Proxy { url, _ := url.Parse(targetUrl) proxy := httputil.NewSingleHostReverseProxy(url) - return proxy + director := proxy.Director + + proxy.Director = func(req *http.Request) { + director(req) + + req.Header.Add("X-Forwarded-Host", req.Host) + req.Host = url.Host + } + + return Proxy{Use: func() *httputil.ReverseProxy {return proxy}} } + +func (proxy Proxy) Init() http.Handler { + handler := m.NewChain(). + Use(m.Logging). + Use(m.Server). + Use(m.Auth). + Use(m.Endpoints). + Use(m.Template). + Use(m.Aliases). + Use(m.Message). + Then(proxy.Use()) + + return handler +} \ No newline at end of file diff --git a/main.go b/main.go index f13d7ce7..c46e5738 100644 --- a/main.go +++ b/main.go @@ -2,17 +2,15 @@ package main import ( "net/http" - "net/http/httputil" "os" - proxy "github.com/codeshelldev/secured-signal-api/internals/proxy" - middlewares "github.com/codeshelldev/secured-signal-api/internals/proxy/middlewares" + reverseProxy "github.com/codeshelldev/secured-signal-api/internals/proxy" config "github.com/codeshelldev/secured-signal-api/utils/config" docker "github.com/codeshelldev/secured-signal-api/utils/docker" log "github.com/codeshelldev/secured-signal-api/utils/logger" ) -var proxy_last *httputil.ReverseProxy +var proxy reverseProxy.Proxy var ENV *config.ENV_ @@ -33,35 +31,9 @@ func main() { log.Info("Initialized Logger with Level of ", log.Level()) - proxy_last = proxy.Create(ENV.API_URL) + proxy = reverseProxy.Create(ENV.API_URL) - mesg_m6 := middlewares.MessageMiddleware{ - Next: proxy_last, - } - - alias_m5 := middlewares.AliasMiddleware{ - Next: mesg_m6.Use(), - } - - temp_m4 := middlewares.TemplateMiddleware{ - Next: alias_m5.Use(), - } - - endp_m3 := middlewares.EndpointsMiddleware{ - Next: temp_m4.Use(), - } - - auth_m2 := middlewares.AuthMiddleware{ - Next: endp_m3.Use(), - } - - serv_m1 := middlewares.ServeMiddleware{ - Next: auth_m2.Use(), - } - - log_m0 := middlewares.LogMiddleware{ - Next: serv_m1.Use(), - } + handler := proxy.Init() log.Info("Initialized Middlewares") @@ -71,7 +43,7 @@ func main() { server := &http.Server{ Addr: addr, - Handler: log_m0.Use(), + Handler: handler, } stop := docker.Run(func() {