From 1a003dee61f04efa8405f70ae90b8ee00c9c6dc0 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Fri, 23 Jan 2026 17:38:30 +0100 Subject: [PATCH 1/5] add caching headers to tell the client to please not cache --- internals/proxy/proxy.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internals/proxy/proxy.go b/internals/proxy/proxy.go index 2f8409b2..a07415f5 100644 --- a/internals/proxy/proxy.go +++ b/internals/proxy/proxy.go @@ -31,6 +31,15 @@ func Create(targetUrl string) Proxy { } proxy := httputil.NewSingleHostReverseProxy(url) + proxy.ModifyResponse = func(res *http.Response) error { + res.Header.Set("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0, private, proxy-revalidate") + res.Header.Set("Pragma", "no-cache") + res.Header.Set("Expires", "0") + res.Header.Set("Vary", "*") + res.Header.Set("Referrer-Policy", "no-referrer") + + return nil + } w := &ioutils.InterceptWriter{ Writer: &bytes.Buffer{}, From a312bf34ddd5dcd803ce626ce9e49abeead23244 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:20:39 +0100 Subject: [PATCH 2/5] fix logger without tokenconfig --- internals/proxy/middlewares/log.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/internals/proxy/middlewares/log.go b/internals/proxy/middlewares/log.go index 18ddfe16..95557327 100644 --- a/internals/proxy/middlewares/log.go +++ b/internals/proxy/middlewares/log.go @@ -45,9 +45,13 @@ var InternalMiddlewareLogger Middleware = Middleware{ func middlewareLoggerHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - conf := getConfigByReq(req) + conf := getConfigWithoutDefaultByReq(req) - logLevel := conf.SERVICE.LOG_LEVEL + var logLevel string + + if conf != nil { + logLevel = conf.SERVICE.LOG_LEVEL + } l := logger.Get() From 0e3f7b130cd3f10a8839aad42913d9bb6a323ee9 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:20:56 +0100 Subject: [PATCH 3/5] add new helper func for ignoring defaults --- internals/proxy/middlewares/common.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/internals/proxy/middlewares/common.go b/internals/proxy/middlewares/common.go index cd497e20..a8e68804 100644 --- a/internals/proxy/middlewares/common.go +++ b/internals/proxy/middlewares/common.go @@ -43,10 +43,24 @@ func getConfigByReq(req *http.Request) *structure.CONFIG { return getConfig(getToken(req)) } -func getConfig(token string) *structure.CONFIG { +func getConfigWithoutDefaultByReq(req *http.Request) *structure.CONFIG { + return getConfigWithoutDefault(getToken(req)) +} + +func getConfigWithoutDefault(token string) *structure.CONFIG { conf, exists := config.ENV.CONFIGS[token] - if !exists || conf == nil { + if !exists { + return nil + } + + return conf +} + +func getConfig(token string) *structure.CONFIG { + conf := getConfigWithoutDefault(token) + + if conf == nil { conf = config.DEFAULT } From 20eb3b17f827ad0a6793f98a6319093efb47d5bd Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:21:07 +0100 Subject: [PATCH 4/5] print if no auth at all provided --- internals/proxy/middlewares/auth.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 91afc979..398d2933 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -282,5 +282,7 @@ func (chain *AuthChain) Eval(w http.ResponseWriter, req *http.Request, tokens [] } } + logger.Warn("Client failed to provide any auth") + return "", err } \ No newline at end of file From 2d06a5b48699159c7e7d38dd9d2df3272663ad7c Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Fri, 23 Jan 2026 19:21:20 +0100 Subject: [PATCH 5/5] add mockserver for local testing --- dev-env.sh | 41 +++++++++++++++++++++++- utils/mockserver/mockserver.go | 58 ++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 utils/mockserver/mockserver.go diff --git a/dev-env.sh b/dev-env.sh index dcd615a5..5a44c145 100644 --- a/dev-env.sh +++ b/dev-env.sh @@ -33,6 +33,10 @@ cecho() { # Get directory path DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +#=-----------------------------------=# +#= Environment Variables & Overrides =# +#=-----------------------------------=# + export DEFAULTS_PATH=$DIR/data/defaults.yml export FAVICON_PATH=$DIR/data/favicon.ico export CONFIG_PATH=$DIR/.dev/config.yml @@ -52,4 +56,39 @@ if [ -f "$DIR/dev.local.env" ]; then source "$DIR/dev.local.env" fi -cecho "${GREEN}Successfully loaded development environment!${END}" \ No newline at end of file +cecho "${GREEN}Successfully loaded development environment!${END}" + +#=-----------------------------------=# +#= Mock server =# +#=-----------------------------------=# + +MOCK_BIN="/tmp/mockserver-$MOCK_PORT" +MOCK_PID="/tmp/mockserver-$MOCK_PORT.pid" +MOCK_PORT="8881" + +# Kill mockserver if still running +if [ -f "$MOCK_PID" ]; then + OLD_PID=$(cat "$MOCK_PID") + if ps -p "$OLD_PID" > /dev/null 2>&1; then + cecho "${YELLOW}Stopping previous Mock server (PID $OLD_PID)${END}" + kill "$OLD_PID" + sleep 1 + fi +fi + +# Build mockserver +go build -o "$MOCK_BIN" utils/mockserver/mockserver.go + +set +m + +if ! nc -z 127.0.0.1 "$MOCK_PORT" >/dev/null 2>&1; then + $MOCK_BIN > "$DIR/.dev/mock.log" 2>&1 & + NEW_PID=$! + disown + + echo "$NEW_PID" > "$MOCK_PID" + + echo "Mock server started at http://127.0.0.1:$MOCK_PORT" +else + echo "There is already a Service running at http://127.0.0.1:$MOCK_PORT" +fi \ No newline at end of file diff --git a/utils/mockserver/mockserver.go b/utils/mockserver/mockserver.go new file mode 100644 index 00000000..18d0e604 --- /dev/null +++ b/utils/mockserver/mockserver.go @@ -0,0 +1,58 @@ +package main + +import ( + "fmt" + "net" + "net/http" + "os" + "strings" + + l "github.com/codeshelldev/gotl/pkg/logger" + "github.com/codeshelldev/gotl/pkg/request" +) + +func main() { + logLevel := os.Getenv("LOG_LEVEL") + + if strings.TrimSpace(logLevel) == "" { + logLevel = "info" + } + + port := os.Getenv("PORT") + + if strings.TrimSpace(port) == "" { + port = "8881" + } + + logger, err := l.NewWithDefaults(logLevel) + + http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + body, err := request.GetReqBody(req) + + if err != nil { + http.Error(w, "Bad Request: invalid body", http.StatusBadRequest) + return + } + + ip, _, _ := net.SplitHostPort(req.RemoteAddr) + + if body.Empty { + logger.Info(ip, " ", req.Method, " ", req.URL.Path, " ", req.URL.RawQuery) + } else { + logger.Info(ip, " ", req.Method, " ", req.URL.Path, " ", req.URL.RawQuery, body.Raw) + } + + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + + fmt.Fprint(w, `{"message":"Hello from mock endpoint"}`) + }) + + logger.Info("Mock server running at http://127.0.0.1:", port) + + err = http.ListenAndServe("127.0.0.1:" + port, nil) + + if err != nil { + logger.Fatal("Error starting Mock server: ", err.Error()) + } +}