From 682f69746e7bebda27326de98bfd63718cb3fac1 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Tue, 9 Oct 2018 18:29:17 -0600 Subject: [PATCH] Add get endpoint for url via query param --- server/server.go | 57 +++++++++++++++++++++++++++++++++---------- server/server_test.go | 2 +- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/server/server.go b/server/server.go index ade17e7..c4f85e9 100644 --- a/server/server.go +++ b/server/server.go @@ -2,12 +2,15 @@ package server import ( "encoding/json" + "fmt" + "local1/logger" "net/http" "net/url" "os" "os/signal" "path" "regexp" + "strconv" "strings" "syscall" "time" @@ -15,13 +18,15 @@ import ( type Server struct { addr string - newItemHandler func(string, string, string, time.Duration) + newFeedHandler func(string, string, string, time.Duration) + getFeedHandler func(string, int) (string, error) } -func New(addr string, newItemHandler func(string, string, string, time.Duration)) (*Server, error) { +func New(addr string, newFeedHandler func(string, string, string, time.Duration), getFeedHandler func(string, int) (string, error)) (*Server, error) { return &Server{ addr: addr, - newItemHandler: newItemHandler, + newFeedHandler: newFeedHandler, + getFeedHandler: getFeedHandler, }, nil } @@ -80,18 +85,19 @@ 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) case "POST": - s.newItem(w, r) + s.newFeed(w, r) case "PUT": - s.newItem(w, r) + s.newFeed(w, r) default: s.notFound(w, r) } } -func (s *Server) newItem(w http.ResponseWriter, r *http.Request) { +func (s *Server) newFeed(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() - newItemBody := struct { + newFeedBody := struct { URL string `json:"url"` Refresh string `json:"refresh"` ItemFilter string `json:"items"` @@ -99,28 +105,53 @@ func (s *Server) newItem(w http.ResponseWriter, r *http.Request) { }{ Refresh: "3h", } - if err := json.NewDecoder(r.Body).Decode(&newItemBody); err != nil { + if err := json.NewDecoder(r.Body).Decode(&newFeedBody); err != nil { s.bad(w, r) return } - interval, err := time.ParseDuration(newItemBody.Refresh) + interval, err := time.ParseDuration(newFeedBody.Refresh) if err != nil { s.bad(w, r) return } - if !validURL(newItemBody.URL) { + if !validURL(newFeedBody.URL) { s.bad(w, r) return } - if _, err := regexp.Compile(newItemBody.ItemFilter); err != nil { + if _, err := regexp.Compile(newFeedBody.ItemFilter); err != nil { s.bad(w, r) return } - if _, err := regexp.Compile(newItemBody.ContentFilter); err != nil { + if _, err := regexp.Compile(newFeedBody.ContentFilter); err != nil { s.bad(w, r) return } - s.newItemHandler(newItemBody.URL, newItemBody.ItemFilter, newItemBody.ContentFilter, interval) + s.newFeedHandler(newFeedBody.URL, newFeedBody.ItemFilter, newFeedBody.ContentFilter, interval) +} + +func (s *Server) getFeed(w http.ResponseWriter, r *http.Request) { + url, err := url.ParseQuery(r.URL.RawQuery) + if err != nil { + logger.Logf("cannot get feed to read: %v", err) + s.mybad(w, r) + return + } + defer r.Body.Close() + limit := 20 + if url.Get("limit") != "" { + limit, err = strconv.Atoi(url.Get("limit")) + if err != nil { + s.bad(w, r) + return + } + } + feedBody, err := s.getFeedHandler(url.Get("url"), limit) + if err != nil { + logger.Logf("cannot get feed %s: %v", url.Get("url"), err) + s.mybad(w, r) + return + } + fmt.Fprintln(w, feedBody) } func validURL(loc string) bool { diff --git a/server/server_test.go b/server/server_test.go index 8761966..8574d24 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -19,7 +19,7 @@ func Test_Server(t *testing.T) { for _, _ = range cases { var err error - s, err := New(testPort, func(string, string, string, time.Duration) {}) + s, err := New(testPort, func(string, string, string, time.Duration) {}, func(string, int) (string, error) { return "", nil }) if err != nil { t.Errorf("failed to create server: %v", err) }