diff --git a/server/server.go b/server/server.go index c4f85e9..6e53252 100644 --- a/server/server.go +++ b/server/server.go @@ -17,16 +17,18 @@ import ( ) type Server struct { - addr string - newFeedHandler func(string, string, string, time.Duration) - getFeedHandler func(string, int) (string, error) + addr string + newFeedHandler func(string, string, string, time.Duration) + getFeedHandler func(string, int) (string, error) + getFeedItemHandler func(string) (string, error) } -func New(addr string, newFeedHandler func(string, string, string, time.Duration), getFeedHandler func(string, int) (string, error)) (*Server, error) { +func New(addr string, newFeedHandler func(string, string, string, time.Duration), getFeedHandler func(string, int) (string, error), getFeedItemHandler func(string) (string, error)) (*Server, error) { return &Server{ - addr: addr, - newFeedHandler: newFeedHandler, - getFeedHandler: getFeedHandler, + addr: addr, + newFeedHandler: newFeedHandler, + getFeedHandler: getFeedHandler, + getFeedItemHandler: getFeedItemHandler, }, nil } @@ -85,7 +87,11 @@ func (s *Server) api(w http.ResponseWriter, r *http.Request) { func (s *Server) feed(w http.ResponseWriter, r *http.Request) { switch r.Method { case "GET": - s.getFeed(w, r) + if advance(r) == "item" { + s.getFeedItem(w, r) + } else { + s.getFeed(w, r) + } case "POST": s.newFeed(w, r) case "PUT": @@ -129,6 +135,22 @@ func (s *Server) newFeed(w http.ResponseWriter, r *http.Request) { s.newFeedHandler(newFeedBody.URL, newFeedBody.ItemFilter, newFeedBody.ContentFilter, interval) } +func (s *Server) getFeedItem(w http.ResponseWriter, r *http.Request) { + url, err := url.ParseQuery(r.URL.RawQuery) + if err != nil { + logger.Logf("cannot get feed item to read: %v", err) + s.mybad(w, r) + return + } + feedBody, err := s.getFeedItemHandler(url.Get("url")) + if err != nil { + logger.Logf("cannot get feed item %s: %v", url.Get("url"), err) + s.mybad(w, r) + return + } + fmt.Fprintln(w, feedBody) +} + func (s *Server) getFeed(w http.ResponseWriter, r *http.Request) { url, err := url.ParseQuery(r.URL.RawQuery) if err != nil { @@ -136,7 +158,6 @@ func (s *Server) getFeed(w http.ResponseWriter, r *http.Request) { s.mybad(w, r) return } - defer r.Body.Close() limit := 20 if url.Get("limit") != "" { limit, err = strconv.Atoi(url.Get("limit"))