func FetchFile(w http.ResponseWriter, r *http.Request, cfg config.Configuration, ctx model.Context) { // Query parameters u, err := url.Parse(r.RequestURI) if err != nil { ctx.Log.Println(err) } queryParams, err := url.ParseQuery(u.RawQuery) if err != nil { ctx.Log.Println(err) } // Request headers params := mux.Vars(r) f := model.File{} f.SetFilename(params["filename"]) if err != nil { ctx.Log.Println(err) http.Error(w, "Invalid filename specified. It contains illegal characters or is too short.", 400) return } err = f.SetTag(params["tag"]) if err != nil { ctx.Log.Println(err) http.Error(w, "Invalid tag specified. It contains illegal characters or is too short.", 400) return } f.SetTagDir(cfg.Filedir) t := model.Tag{} t.SetTag(f.Tag) t.SetTagDir(cfg.Filedir) t.CalculateExpiration(cfg.Expiration) expired, err := t.IsExpired(cfg.Expiration) if err != nil { ctx.Log.Println(err) http.Error(w, "Internal Server Error", 500) return } if expired { ctx.Log.Println("Expired: " + t.ExpirationReadable) http.Error(w, "This tag has expired.", 410) return } // Default path path := filepath.Join(f.TagDir, f.Filename) err = f.DetectMIME() if err != nil { ctx.Log.Println("Unable to detect MIME: ", err) } else { ctx.Log.Println("MIME detected: " + f.MIME) } if f.MediaType() == "image" { width, _ := strconv.Atoi(queryParams.Get("width")) height, _ := strconv.Atoi(queryParams.Get("height")) if (width > 0) || (height > 0) { ctx.Log.Println("Size requested: " + strconv.Itoa(width) + "x" + strconv.Itoa(height) + " px") if f.ImageExists(width, height) { path = f.ImagePath(width, height) } else { http.Error(w, "Image not found", 404) return } } } w.Header().Set("Vary", "Content-Type") w.Header().Set("Cache-Control", "s-maxage=3600") http.ServeFile(w, r, path) }