From effc017810e5f1ba1a1c354eb2471a53fd661658 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Sat, 22 Nov 2014 13:07:00 +0100 Subject: [PATCH] Simplified URL parsing and un-escape URIs. This avoids subsequent string-joins in various handlers and generally unifies URL handling. Also, it fixes handling of URLs containing (escaped) spaces. --- server/graph.go | 5 ++--- server/server.go | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/server/graph.go b/server/graph.go index 11b55b8..9406f76 100644 --- a/server/graph.go +++ b/server/graph.go @@ -33,7 +33,6 @@ import ( "fmt" "io" "net/http" - "strings" "time" "code.google.com/p/plotinum/plot" @@ -46,12 +45,12 @@ import ( ) func (s *Server) graph(w http.ResponseWriter, req request) { - if len(req.args) < 2 { + if len(req.args) != 2 { s.internal(w, fmt.Errorf("Missing host/metric information")) } host := proto.EscapeString(req.args[0]) - metric := proto.EscapeString(strings.Join(req.args[1:], "/")) + metric := proto.EscapeString(req.args[1]) res, err := s.query(fmt.Sprintf("TIMESERIES %s.%s", host, metric)) if err != nil { s.internal(w, fmt.Errorf("Failed to retrieve graph data: %v", err)) diff --git a/server/server.go b/server/server.go index b7cd37a..a8e34d9 100644 --- a/server/server.go +++ b/server/server.go @@ -34,6 +34,7 @@ import ( "io" "log" "net/http" + "net/url" "path/filepath" "strings" @@ -145,11 +146,19 @@ var content = map[string]func(request, *Server) (*page, error){ // ServeHTTP implements the http.Handler interface and serves // the SysDB user interface. func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - path := r.URL.Path + path := r.RequestURI if len(path) > 0 && path[0] == '/' { path = path[1:] } - fields := strings.Split(path, "/") + var fields []string + for _, f := range strings.Split(path, "/") { + f, err := url.QueryUnescape(f) + if err != nil { + s.err(w, http.StatusBadRequest, fmt.Errorf("Error: %v", err)) + return + } + fields = append(fields, f) + } req := request{ r: r, @@ -251,11 +260,11 @@ func fetch(req request, s *Server) (*page, error) { } q = fmt.Sprintf("FETCH host %s", proto.EscapeString(req.args[0])) case "service", "metric": - if len(req.args) < 2 { + if len(req.args) != 2 { return nil, fmt.Errorf("%s not found", strings.Title(req.cmd)) } host := proto.EscapeString(req.args[0]) - name := proto.EscapeString(strings.Join(req.args[1:], "/")) + name := proto.EscapeString(req.args[1]) q = fmt.Sprintf("FETCH %s %s.%s", req.cmd, host, name) default: panic("Unknown request: fetch(" + req.cmd + ")") -- 2.30.2