Пример #1
0
func FetchTag(w http.ResponseWriter, r *http.Request, cfg config.Configuration, ctx model.Context) {
	var err error
	params := mux.Vars(r)
	t := model.Tag{}
	err = t.SetTag(params["tag"])
	if err != nil {
		ctx.Log.Println(err)
		http.Error(w, "Invalid tag", 400)
		return
	}

	t.SetTagDir(cfg.Filedir)
	t.CalculateExpiration(cfg.Expiration)
	if t.TagDirExists() {
		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
		}

		err = t.StatInfo()
		if err != nil {
			ctx.Log.Println(err)
			http.Error(w, "Internal Server Error", 500)
			return
		}

		err = t.List(cfg.Baseurl)
		if err != nil {
			ctx.Log.Println(err)
			http.Error(w, "Error reading the tag contents.", 404)
			return
		}
	}

	//t.GenerateLinks(cfg.Baseurl)

	headers := make(map[string]string)
	headers["Cache-Control"] = "max-age=1"

	var status = 200

	if r.Header.Get("Content-Type") == "application/zip" || r.FormValue("o") == "zip" {
		headers["Content-Type"] = "application/zip"

		// Generate a map of paths to add to the zip response
		var paths []string
		for _, f := range t.Files {
			path := filepath.Join(f.TagDir, f.Filename)
			paths = append(paths, path)
		}
		output.ZIPresponse(w, status, t.Tag, headers, paths, ctx)
		return
	}

	if r.Header.Get("Content-Type") == "application/json" {
		headers["Content-Type"] = "application/json"
		output.JSONresponse(w, status, headers, t, ctx)
		return
	} else {
		output.HTMLresponse(w, "viewtag", status, headers, t, ctx)
		return
	}
}