Change html templating style
This commit is contained in:
parent
583d6abb84
commit
a7e7ac33ee
61
main.go
61
main.go
@ -32,24 +32,38 @@ const appVersion = "1.0.1"
|
||||
|
||||
var src = rand.NewSource(time.Now().UnixNano())
|
||||
var pool = cache.New(240*time.Hour, 1*time.Hour)
|
||||
var okTmpl = template.Must(template.ParseFiles("templates/ok.html"))
|
||||
var indexTmpl = template.Must(template.ParseFiles("templates/index.html"))
|
||||
var returnTmpl = template.Must(template.ParseFiles("templates/returnPage.html"))
|
||||
var notFoundTmpl = template.Must(template.ParseFiles("templates/404.html"))
|
||||
var badRequestTmpl = template.Must(template.ParseFiles("templates/400.html"))
|
||||
var internalErrorTmpl = template.Must(template.ParseFiles("templates/500.html"))
|
||||
var templates *template.Template
|
||||
var allFiles []string
|
||||
|
||||
func init() {
|
||||
files, err := ioutil.ReadDir("templates")
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
for _, file := range files {
|
||||
filename := file.Name()
|
||||
if strings.HasSuffix(filename, ".html") {
|
||||
allFiles = append(allFiles, "templates/"+filename)
|
||||
}
|
||||
}
|
||||
templates, err = template.ParseFiles(allFiles...)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
}
|
||||
|
||||
func index(w http.ResponseWriter, r *http.Request) {
|
||||
indexTmpl.Execute(w, indexTmpl)
|
||||
t := templates.Lookup("index.html")
|
||||
t.Execute(w, nil)
|
||||
}
|
||||
|
||||
// get executes the GET command
|
||||
func get(key string) (string, bool) {
|
||||
value, status := pool.Get(key)
|
||||
if status {
|
||||
return value.(string), status
|
||||
if !status {
|
||||
return "", status
|
||||
}
|
||||
return "", false
|
||||
return value.(string), status
|
||||
}
|
||||
|
||||
// set executes the redis SET command
|
||||
@ -63,6 +77,7 @@ func set(key, suffix string) {
|
||||
func redirect(w http.ResponseWriter, r *http.Request, path string) {
|
||||
vals := mux.Vars(r)
|
||||
key := vals["key"]
|
||||
t := templates.Lookup("404.html")
|
||||
if path != "" {
|
||||
key = strings.Replace(key, path, "", 1)
|
||||
}
|
||||
@ -71,7 +86,7 @@ func redirect(w http.ResponseWriter, r *http.Request, path string) {
|
||||
key, status := get(key)
|
||||
if !status {
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
notFoundTmpl.Execute(w, nil)
|
||||
t.Execute(w, nil)
|
||||
return
|
||||
}
|
||||
u, _ := url.Parse(key)
|
||||
@ -79,10 +94,6 @@ func redirect(w http.ResponseWriter, r *http.Request, path string) {
|
||||
u.Scheme = "https"
|
||||
}
|
||||
http.Redirect(w, r, u.String(), http.StatusFound)
|
||||
} else {
|
||||
w.WriteHeader(http.StatusNotFound)
|
||||
notFoundTmpl.Execute(w, notFoundTmpl)
|
||||
}
|
||||
}
|
||||
|
||||
// shortner reads url from a POST request, validates the url, generate a
|
||||
@ -91,9 +102,11 @@ func redirect(w http.ResponseWriter, r *http.Request, path string) {
|
||||
// then if writes the kv pair suffix, url to the database and return the
|
||||
// shortened url to the user
|
||||
func shortner(w http.ResponseWriter, r *http.Request, proto, domain, hostSuf, path string, urlSize int) {
|
||||
ret := templates.Lookup("returnPage.html")
|
||||
badR := templates.Lookup("400.html")
|
||||
if !govalidator.IsURL(r.FormValue("url")) {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
badRequestTmpl.Execute(w, nil)
|
||||
badR.Execute(w, nil)
|
||||
return
|
||||
}
|
||||
u, _ := url.Parse(r.FormValue("url"))
|
||||
@ -108,7 +121,7 @@ func shortner(w http.ResponseWriter, r *http.Request, proto, domain, hostSuf, pa
|
||||
}
|
||||
set(u.String(), suffix)
|
||||
shortend := proto + "://" + domain + hostSuf + path + suffix
|
||||
returnTmpl.Execute(w, shortend)
|
||||
ret.Execute(w, shortend)
|
||||
}
|
||||
|
||||
// randStringBytesMaskImprSrc Generate random string of n size
|
||||
@ -132,9 +145,10 @@ func randStringBytesMaskImprSrc(n int) string {
|
||||
// internalError receives a http.ResponseWriter, msg and error and
|
||||
// return a internal error page with http code 500 to the user
|
||||
func internalError(w http.ResponseWriter, msg string, err error) {
|
||||
t := templates.Lookup("500.html")
|
||||
log.Println(err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
internalErrorTmpl.Execute(w, msg+err.Error())
|
||||
t.Execute(w, msg+err.Error())
|
||||
}
|
||||
|
||||
// itemsCount returns the number of kv pairs on the in meomry database
|
||||
@ -163,6 +177,7 @@ func itemsDump(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// itemsFromFile loads kv pairs from the dumpFile json to the in memory database
|
||||
func itemsFromFile(w http.ResponseWriter, r *http.Request, dumpFile string) {
|
||||
t := templates.Lookup("ok.html")
|
||||
jsonFile, err := ioutil.ReadFile(dumpFile)
|
||||
var dumpObj map[string]cache.Item
|
||||
json.Unmarshal([]byte(jsonFile), &dumpObj)
|
||||
@ -170,12 +185,13 @@ func itemsFromFile(w http.ResponseWriter, r *http.Request, dumpFile string) {
|
||||
internalError(w, "Cannot open file "+dumpFile+": ", err)
|
||||
} else {
|
||||
pool = cache.NewFrom(240*time.Hour, 1*time.Hour, dumpObj)
|
||||
okTmpl.Execute(w, "Imported "+strconv.Itoa(len(dumpObj))+" items to the DB")
|
||||
t.Execute(w, "Imported "+strconv.Itoa(len(dumpObj))+" items to the DB")
|
||||
}
|
||||
}
|
||||
|
||||
// itemsFromPost loads kv pairs from a json POST to the in memory database
|
||||
func itemsFromPost(w http.ResponseWriter, r *http.Request) {
|
||||
t := templates.Lookup("ok.html")
|
||||
decoder := json.NewDecoder(r.Body)
|
||||
var dumpObj map[string]cache.Item
|
||||
err := decoder.Decode(&dumpObj)
|
||||
@ -183,12 +199,13 @@ func itemsFromPost(w http.ResponseWriter, r *http.Request) {
|
||||
internalError(w, "Cannot parse JSON: ", err)
|
||||
} else {
|
||||
pool = cache.NewFrom(240*time.Hour, 1*time.Hour, dumpObj)
|
||||
okTmpl.Execute(w, "Imported "+strconv.Itoa(len(dumpObj))+" items to the DB")
|
||||
t.Execute(w, "Imported "+strconv.Itoa(len(dumpObj))+" items to the DB")
|
||||
}
|
||||
}
|
||||
|
||||
// itemsDumpToFile dumps the kv pairs from the in memory database to the dumpFile
|
||||
func itemsDumpToFile(w http.ResponseWriter, r *http.Request, dumpFile string) {
|
||||
t := templates.Lookup("ok.html")
|
||||
dumpObj, _ := json.Marshal(
|
||||
pool.Items(),
|
||||
)
|
||||
@ -196,7 +213,7 @@ func itemsDumpToFile(w http.ResponseWriter, r *http.Request, dumpFile string) {
|
||||
if err != nil {
|
||||
internalError(w, "Failed to open json file: ", err)
|
||||
} else {
|
||||
okTmpl.Execute(w, "Dump writen to: "+dumpFile)
|
||||
t.Execute(w, "Dump writen to: "+dumpFile)
|
||||
}
|
||||
}
|
||||
|
||||
@ -220,7 +237,7 @@ func main() {
|
||||
}
|
||||
|
||||
if *port > 65535 || *port < 1 {
|
||||
|
||||
log.Fatalln("Invalid port number")
|
||||
}
|
||||
if *path != "" && !strings.HasSuffix(*path, "/") {
|
||||
*path = *path + "/"
|
||||
|
Loading…
x
Reference in New Issue
Block a user