ekzyis/server/server.go

65 lines
1.3 KiB
Go

package main
import (
"fmt"
"log"
"net/http"
"strconv"
sn "github.com/ekzyis/snappy"
)
func main() {
bindAddr := "127.0.0.1:1337"
http.HandleFunc("/api/content_meta", HandleContentMeta)
log.Printf("server running on %s\n", bindAddr)
http.ListenAndServe(bindAddr, logRequest(http.DefaultServeMux))
}
func logRequest(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s %s\n", r.RemoteAddr, r.Method, r.URL)
handler.ServeHTTP(w, r)
})
}
func HandleContentMeta(w http.ResponseWriter, r *http.Request) {
var (
// stacker.news item id
qid = r.URL.Query().Get("sn_id")
c = sn.NewClient()
item *sn.Item
id int
err error
)
w.Header().Add("Access-Control-Allow-Origin", "*")
w.Header().Add("Access-Control-Allow-Methods", "GET")
w.Header().Add("Access-Control-Allow-Headers", "*")
if r.Method == "OPTIONS" {
return
}
if qid == "" {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprint(w, "sn_id query param required\n")
return
}
if id, err = strconv.Atoi(qid); err != nil {
w.WriteHeader(http.StatusBadRequest)
fmt.Fprint(w, "sn_id must be numeric\n")
return
}
if item, err = c.Item(id); err != nil {
w.WriteHeader(http.StatusInternalServerError)
fmt.Println(err)
return
}
contentMeta(item).Render(r.Context(), w)
}