From 474ed89ddafa7961c254a22767209c534675a54c Mon Sep 17 00:00:00 2001 From: Sky Johnson Date: Tue, 25 Mar 2025 12:13:26 -0500 Subject: [PATCH] error pages --- core/http/server.go | 46 +++++++++++++++++++++++++++++++++++------- core/runner/sandbox.go | 1 + moonshark.go | 10 ++++++++- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/core/http/server.go b/core/http/server.go index a9f9755..9580d44 100644 --- a/core/http/server.go +++ b/core/http/server.go @@ -10,6 +10,7 @@ import ( "git.sharkk.net/Sky/Moonshark/core/logger" "git.sharkk.net/Sky/Moonshark/core/routers" "git.sharkk.net/Sky/Moonshark/core/runner" + "git.sharkk.net/Sky/Moonshark/core/utils" ) // Server handles HTTP requests using Lua and static file routers @@ -20,10 +21,15 @@ type Server struct { logger *logger.Logger httpServer *http.Server loggingEnabled bool + debugMode bool // Controls whether to show error details + errorConfig utils.ErrorPageConfig } // New creates a new HTTP server with optimized connection settings -func New(luaRouter *routers.LuaRouter, staticRouter *routers.StaticRouter, runner *runner.LuaRunner, log *logger.Logger, loggingEnabled bool) *Server { +func New(luaRouter *routers.LuaRouter, staticRouter *routers.StaticRouter, + runner *runner.LuaRunner, log *logger.Logger, + loggingEnabled bool, debugMode bool, overrideDir string) *Server { + server := &Server{ luaRouter: luaRouter, staticRouter: staticRouter, @@ -31,6 +37,11 @@ func New(luaRouter *routers.LuaRouter, staticRouter *routers.StaticRouter, runne logger: log, httpServer: &http.Server{}, loggingEnabled: loggingEnabled, + debugMode: debugMode, + errorConfig: utils.ErrorPageConfig{ + OverrideDir: overrideDir, + DebugMode: debugMode, + }, } server.httpServer.Handler = server @@ -99,8 +110,17 @@ func (s *Server) handleRequest(w http.ResponseWriter, r *http.Request) { return } - // No route found - http.NotFound(w, r) + // No route found - 404 Not Found + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusNotFound) + w.Write([]byte(utils.NotFoundPage(s.errorConfig, r.URL.Path))) +} + +// HandleMethodNotAllowed responds with a 405 Method Not Allowed error +func (s *Server) HandleMethodNotAllowed(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusMethodNotAllowed) + w.Write([]byte(utils.MethodNotAllowedPage(s.errorConfig, r.URL.Path))) } // handleLuaRoute executes a Lua route @@ -135,9 +155,13 @@ func (s *Server) handleLuaRoute(w http.ResponseWriter, r *http.Request, bytecode ctx.Set("params", paramMap) } - // Query parameters will be parsed lazily via metatable in Lua - // Instead of parsing for every request, we'll pass the raw URL - ctx.Set("rawQuery", r.URL.RawQuery) + // Parse query parameters only if present + queryMap := QueryToLua(r) + if queryMap == nil { + ctx.Set("query", make(map[string]any)) + } else { + ctx.Set("query", queryMap) + } // Add form data for POST/PUT/PATCH only when needed if r.Method == http.MethodPost || r.Method == http.MethodPut || r.Method == http.MethodPatch { @@ -150,7 +174,15 @@ func (s *Server) handleLuaRoute(w http.ResponseWriter, r *http.Request, bytecode result, err := s.luaRunner.Run(bytecode, ctx, scriptPath) if err != nil { s.logger.Error("Error executing Lua route: %v", err) - http.Error(w, "Internal Server Error", http.StatusInternalServerError) + + // Set content type to HTML + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusInternalServerError) + + // Generate error page with error message + errorMsg := err.Error() + errorHTML := utils.InternalErrorPage(s.errorConfig, r.URL.Path, errorMsg) + w.Write([]byte(errorHTML)) return } diff --git a/core/runner/sandbox.go b/core/runner/sandbox.go index ccacc79..c13b464 100644 --- a/core/runner/sandbox.go +++ b/core/runner/sandbox.go @@ -60,6 +60,7 @@ func (s *Sandbox) Setup(state *luajit.State) error { } -- Basic functions + base.print = print base.tonumber = tonumber base.tostring = tostring base.type = type diff --git a/moonshark.go b/moonshark.go index e7b6286..78379e1 100644 --- a/moonshark.go +++ b/moonshark.go @@ -132,8 +132,14 @@ func main() { port := cfg.GetInt("port", 3117) routesDir := cfg.GetString("routes_dir", "./routes") staticDir := cfg.GetString("static_dir", "./static") + overrideDir := cfg.GetString("override_dir", "./override") bufferSize := cfg.GetInt("buffer_size", 20) + if err := utils.EnsureDir(overrideDir); err != nil { + log.Warning("Override directory doesn't exist, and could not create it: %v", err) + overrideDir = "" // Disable overrides if directory can't be created + } + // Get library directories var libDirs []string libDirsConfig := cfg.GetStringArray("lib_dirs") @@ -215,8 +221,10 @@ func main() { log.Info("HTTP logging is disabled") } + debugMode := cfg.GetBool("debug", false) + // Create HTTP server - server := http.New(luaRouter, staticRouter, luaRunner, log, httpLoggingEnabled) + server := http.New(luaRouter, staticRouter, luaRunner, log, httpLoggingEnabled, debugMode, overrideDir) // Handle graceful shutdown stop := make(chan os.Signal, 1)