func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx := route.Context(r) name := strings.Trim(route.Param(ctx, "filepath"), "/") if name == "" { name = "index.html" } file, err := GetFile(StaticFiles, name) if err != nil { if err != io.EOF { log.Warn("Could not get file: ", err) } w.WriteHeader(http.StatusNotFound) return } contentType := http.DetectContentType(file) if strings.Contains(contentType, "text/plain") || strings.Contains(contentType, "application/octet-stream") { parts := strings.Split(name, ".") contentType = mimeMap[parts[len(parts)-1]] } w.Header().Set("Content-Type", contentType) w.Header().Set("Cache-Control", "public, max-age=259200") w.Write(file) }
func (h *Handler) consoles(w http.ResponseWriter, r *http.Request) { ctx := route.Context(r) name := route.Param(ctx, "filepath") file, err := http.Dir(h.options.ConsoleTemplatesPath).Open(name) if err != nil { http.Error(w, err.Error(), http.StatusNotFound) return } text, err := ioutil.ReadAll(file) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Provide URL parameters as a map for easy use. Advanced users may have need for // parameters beyond the first, so provide RawParams. rawParams, err := url.ParseQuery(r.URL.RawQuery) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } params := map[string]string{} for k, v := range rawParams { params[k] = v[0] } data := struct { RawParams url.Values Params map[string]string Path string }{ RawParams: rawParams, Params: params, Path: strings.TrimLeft(name, "/"), } tmpl := template.NewTemplateExpander(string(text), "__console_"+name, data, model.Now(), h.queryEngine, h.options.ExternalURL.Path) filenames, err := filepath.Glob(h.options.ConsoleLibrariesPath + "/*.lib") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } result, err := tmpl.ExpandHTML(filenames) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } io.WriteString(w, result) }