diff --git a/internal/server/handlers.go b/internal/server/handlers.go index 59a9720..b69f192 100644 --- a/internal/server/handlers.go +++ b/internal/server/handlers.go @@ -7,7 +7,6 @@ import ( "errors" "net" "net/http" - "net/url" "runtime" "sort" "strconv" @@ -736,21 +735,18 @@ func (s *Server) handleASDetailJSON() http.HandlerFunc { // handlePrefixDetailJSON returns prefix details as JSON func (s *Server) handlePrefixDetailJSON() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - // Get wildcard parameter (everything after /prefix/) - prefixParam := chi.URLParam(r, "*") - if prefixParam == "" { - writeJSONError(w, http.StatusBadRequest, "Prefix parameter is required") + // Get prefix and length from URL params + prefixParam := chi.URLParam(r, "prefix") + lenParam := chi.URLParam(r, "len") + + if prefixParam == "" || lenParam == "" { + writeJSONError(w, http.StatusBadRequest, "Prefix and length parameters are required") return } - // URL decode the prefix parameter - prefix, err := url.QueryUnescape(prefixParam) - if err != nil { - writeJSONError(w, http.StatusBadRequest, "Invalid prefix parameter") - - return - } + // Combine prefix and length into CIDR notation + prefix := prefixParam + "/" + lenParam routes, err := s.db.GetPrefixDetailsContext(r.Context(), prefix) if err != nil { @@ -903,21 +899,18 @@ func (s *Server) handleASDetail() http.HandlerFunc { // handlePrefixDetail returns a handler that serves the prefix detail HTML page func (s *Server) handlePrefixDetail() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - // Get wildcard parameter (everything after /prefix/) - prefixParam := chi.URLParam(r, "*") - if prefixParam == "" { - http.Error(w, "Prefix parameter is required", http.StatusBadRequest) + // Get prefix and length from URL params + prefixParam := chi.URLParam(r, "prefix") + lenParam := chi.URLParam(r, "len") + + if prefixParam == "" || lenParam == "" { + http.Error(w, "Prefix and length parameters are required", http.StatusBadRequest) return } - // URL decode the prefix parameter - prefix, err := url.QueryUnescape(prefixParam) - if err != nil { - http.Error(w, "Invalid prefix parameter", http.StatusBadRequest) - - return - } + // Combine prefix and length into CIDR notation + prefix := prefixParam + "/" + lenParam routes, err := s.db.GetPrefixDetailsContext(r.Context(), prefix) if err != nil { diff --git a/internal/server/routes.go b/internal/server/routes.go index 4d110f4..a5e37a7 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -28,7 +28,7 @@ func (s *Server) setupRoutes() { // AS and prefix detail pages r.Get("/as/{asn}", s.handleASDetail()) - r.Get("/prefix/*", s.handlePrefixDetail()) + r.Get("/prefix/{prefix}/{len}", s.handlePrefixDetail()) r.Get("/prefixlength/{length}", s.handlePrefixLength()) r.Get("/prefixlength6/{length}", s.handlePrefixLength6()) @@ -45,7 +45,7 @@ func (s *Server) setupRoutes() { r.Get("/stats", s.handleStats()) r.Get("/ip/{ip}", s.handleIPLookup()) r.Get("/as/{asn}", s.handleASDetailJSON()) - r.Get("/prefix/*", s.handlePrefixDetailJSON()) + r.Get("/prefix/{prefix}/{len}", s.handlePrefixDetailJSON()) }) s.router = r diff --git a/internal/templates/as_detail.html b/internal/templates/as_detail.html index 6470587..15ade24 100644 --- a/internal/templates/as_detail.html +++ b/internal/templates/as_detail.html @@ -182,7 +182,7 @@
{{range .IPv4Prefixes}}