// genericHandler returns a handler that responds with generic file for // the requester. func genericHandler(srv server.Server) ContextHandler { fn := func(ctx context.Context, w http.ResponseWriter, req *http.Request) { group, err := groupFromContext(ctx) if err != nil || group.Profile == "" { http.NotFound(w, req) return } profile, err := srv.ProfileGet(ctx, &pb.ProfileGetRequest{Id: group.Profile}) if err != nil || profile.GenericId == "" { http.NotFound(w, req) return } contents, err := srv.GenericGet(ctx, profile.GenericId) if err != nil { http.NotFound(w, req) return } // collect data for rendering data := make(map[string]interface{}) if group.Metadata != nil { err = json.Unmarshal(group.Metadata, &data) if err != nil { log.Errorf("error unmarshalling metadata: %v", err) http.NotFound(w, req) return } } data["query"] = req.URL.RawQuery for key, value := range group.Selector { data[strings.ToLower(key)] = value } // render the template of a generic config with data var buf bytes.Buffer err = renderTemplate(&buf, data, contents) if err != nil { http.NotFound(w, req) return } config := buf.String() http.ServeContent(w, req, "", time.Time{}, strings.NewReader(config)) } return ContextHandlerFunc(fn) }
// genericHandler returns a handler that responds with generic file for // the requester. func (s *Server) genericHandler(core server.Server) ContextHandler { fn := func(ctx context.Context, w http.ResponseWriter, req *http.Request) { group, err := groupFromContext(ctx) if err != nil { s.logger.WithFields(logrus.Fields{ "labels": labelsFromRequest(nil, req), }).Infof("No matching group") http.NotFound(w, req) return } profile, err := core.ProfileGet(ctx, &pb.ProfileGetRequest{Id: group.Profile}) if err != nil { s.logger.WithFields(logrus.Fields{ "labels": labelsFromRequest(nil, req), "group": group.Id, "group_name": group.Name, }).Infof("No profile named: %s", group.Profile) http.NotFound(w, req) return } contents, err := core.GenericGet(ctx, profile.GenericId) if err != nil { s.logger.WithFields(logrus.Fields{ "labels": labelsFromRequest(nil, req), "group": group.Id, "group_name": group.Name, "profile": group.Profile, }).Infof("No generic template named: %s", profile.GenericId) http.NotFound(w, req) return } // match was successful s.logger.WithFields(logrus.Fields{ "labels": labelsFromRequest(nil, req), "group": group.Id, "profile": profile.Id, }).Debug("Matched a generic template") // collect data for rendering data := make(map[string]interface{}) if group.Metadata != nil { err = json.Unmarshal(group.Metadata, &data) if err != nil { s.logger.Errorf("error unmarshalling metadata: %v", err) http.NotFound(w, req) return } } data["query"] = req.URL.RawQuery for key, value := range group.Selector { data[strings.ToLower(key)] = value } // render the template of a generic config with data var buf bytes.Buffer err = s.renderTemplate(&buf, data, contents) if err != nil { http.NotFound(w, req) return } config := buf.String() http.ServeContent(w, req, "", time.Time{}, strings.NewReader(config)) } return ContextHandlerFunc(fn) }