Use clousures for the http handlers

This commit is contained in:
Las Zenow 2012-08-15 13:58:16 +02:00
parent f1eab1bebc
commit 3db6231762
3 changed files with 54 additions and 48 deletions

View file

@ -31,38 +31,40 @@ type searchData struct {
Prev string Prev string
} }
func searchHandler(coll *mgo.Collection, w http.ResponseWriter, r *http.Request) { func searchHandler(coll *mgo.Collection) func(http.ResponseWriter, *http.Request) {
err := r.ParseForm() return func(w http.ResponseWriter, r *http.Request) {
if err != nil { err := r.ParseForm()
http.Error(w, err.Error(), http.StatusInternalServerError) if err != nil {
return http.Error(w, err.Error(), http.StatusInternalServerError)
} return
req := strings.Join(r.Form["q"], " ")
var res []Book
coll.Find(buildQuery(req)).All(&res)
page := 0
if len(r.Form["p"]) != 0 {
page, err = strconv.Atoi(r.Form["p"][0])
if err != nil || len(res) < ITEMS_PAGE*page {
page = 0
} }
} req := strings.Join(r.Form["q"], " ")
var res []Book
coll.Find(buildQuery(req)).All(&res)
var data searchData page := 0
data.Search = req if len(r.Form["p"]) != 0 {
data.Found = len(res) page, err = strconv.Atoi(r.Form["p"][0])
if len(res) > ITEMS_PAGE*(page+1) { if err != nil || len(res) < ITEMS_PAGE*page {
data.Books = res[ITEMS_PAGE*page:ITEMS_PAGE*(page+1)] page = 0
} else { }
data.Books = res[ITEMS_PAGE*page:] }
var data searchData
data.Search = req
data.Found = len(res)
if len(res) > ITEMS_PAGE*(page+1) {
data.Books = res[ITEMS_PAGE*page:ITEMS_PAGE*(page+1)]
} else {
data.Books = res[ITEMS_PAGE*page:]
}
data.Page = page+1
if len(res) > (page+1)*ITEMS_PAGE {
data.Next = "/search/?q=" + req + "&p=" + strconv.Itoa(page+1)
}
if page > 0 {
data.Prev = "/search/?q=" + req + "&p=" + strconv.Itoa(page-1)
}
loadTemplate(w, "search", data)
} }
data.Page = page+1
if len(res) > (page+1)*ITEMS_PAGE {
data.Next = "/search/?q=" + req + "&p=" + strconv.Itoa(page+1)
}
if page > 0 {
data.Prev = "/search/?q=" + req + "&p=" + strconv.Itoa(page-1)
}
loadTemplate(w, "search", data)
} }

View file

@ -16,10 +16,12 @@ func aboutHandler(w http.ResponseWriter, r *http.Request) {
loadTemplate(w, "about", nil) loadTemplate(w, "about", nil)
} }
func bookHandler(coll *mgo.Collection, w http.ResponseWriter, r *http.Request) { func bookHandler(coll *mgo.Collection) func(http.ResponseWriter, *http.Request) {
var book Book return func(w http.ResponseWriter, r *http.Request) {
coll.Find(bson.M{"title": r.URL.Path[len("/book/"):]}).One(&book) var book Book
loadTemplate(w, "book", book) coll.Find(bson.M{"title": r.URL.Path[len("/book/"):]}).One(&book)
loadTemplate(w, "book", book)
}
} }
@ -37,9 +39,9 @@ func main() {
coll := session.DB(DB_NAME).C(BOOKS_COLL) coll := session.DB(DB_NAME).C(BOOKS_COLL)
num, _ := coll.Count() num, _ := coll.Count()
http.HandleFunc("/book/", func(w http.ResponseWriter, r *http.Request) { bookHandler(coll, w, r) }) http.HandleFunc("/book/", bookHandler(coll))
http.HandleFunc("/search/", func(w http.ResponseWriter, r *http.Request) { searchHandler(coll, w, r) }) http.HandleFunc("/search/", searchHandler(coll))
http.HandleFunc("/upload/", func(w http.ResponseWriter, r *http.Request) { uploadHandler(coll, w, r) }) http.HandleFunc("/upload/", uploadHandler(coll))
http.HandleFunc("/about/", aboutHandler) http.HandleFunc("/about/", aboutHandler)
fileHandler("/img/") fileHandler("/img/")
fileHandler("/cover/") fileHandler("/cover/")

View file

@ -42,16 +42,18 @@ func storeFile(r *http.Request) error {
return nil return nil
} }
func uploadHandler(coll *mgo.Collection, w http.ResponseWriter, r *http.Request) { func uploadHandler(coll *mgo.Collection) func(http.ResponseWriter, *http.Request) {
status := "" return func(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" { status := ""
err := storeFile(r) if r.Method == "POST" {
if err != nil { err := storeFile(r)
http.Error(w, err.Error(), http.StatusInternalServerError) if err != nil {
return http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
status = "Upload successful."
} }
status = "Upload successful."
}
loadTemplate(w, "upload", status) loadTemplate(w, "upload", status)
}
} }