diff --git a/app/rest/api/rss.go b/app/rest/api/rss.go index d5779776..430f75c1 100644 --- a/app/rest/api/rss.go +++ b/app/rest/api/rss.go @@ -7,7 +7,6 @@ import ( "time" "github.com/go-chi/chi" - "github.com/go-chi/render" "github.com/gorilla/feeds" "github.com/umputun/remark/app/rest" @@ -52,9 +51,8 @@ func (s *Rest) rssPostCommentsCtrl(w http.ResponseWriter, r *http.Request) { } w.Header().Set("Content-Type", "application/xml; charset=utf-8") - if status, ok := r.Context().Value(render.StatusCtxKey).(int); ok { - w.WriteHeader(status) - } + w.WriteHeader(http.StatusOK) + if _, err := w.Write(data); err != nil { log.Printf("[WARN] failed to send response to %s, %s", r.RemoteAddr, err) } @@ -80,14 +78,12 @@ func (s *Rest) rssSiteCommentsCtrl(w http.ResponseWriter, r *http.Request) { }) if err != nil { - rest.SendErrorJSON(w, r, http.StatusInternalServerError, err, "can't get last comments") + rest.SendErrorJSON(w, r, http.StatusBadRequest, err, "can't get last comments") return } w.Header().Set("Content-Type", "application/xml; charset=utf-8") - if status, ok := r.Context().Value(render.StatusCtxKey).(int); ok { - w.WriteHeader(status) - } + w.WriteHeader(http.StatusOK) if _, err := w.Write(data); err != nil { log.Printf("[WARN] failed to send response to %s, %s", r.RemoteAddr, err) } diff --git a/app/rest/api/rss_test.go b/app/rest/api/rss_test.go index 9e5302b3..afc2c566 100644 --- a/app/rest/api/rss_test.go +++ b/app/rest/api/rss_test.go @@ -47,6 +47,9 @@ func TestServer_RssPost(t *testing.T) { expected, res = cleanRssFormatting(expected, res) assert.Equal(t, expected, res) + + res, code = get(t, ts.URL+"/api/v1/rss/post?site=radio-t-bad&url=https://radio-t.com/blah1") + assert.Equal(t, 400, code) } func TestServer_RssSite(t *testing.T) { @@ -98,6 +101,9 @@ func TestServer_RssSite(t *testing.T) { expected, res = cleanRssFormatting(expected, res) assert.Equal(t, expected, res) + + _, code = get(t, ts.URL+"/api/v1/rss/site?site=bad-radio-t") + assert.Equal(t, 400, code) } func TestServer_RssWithReply(t *testing.T) { diff --git a/app/rest/cache/cache.go b/app/rest/cache/cache.go index 5a426577..c32ce04b 100644 --- a/app/rest/cache/cache.go +++ b/app/rest/cache/cache.go @@ -18,10 +18,11 @@ type LoadingCache interface { Flush(scopes ...string) } -// Key makes full key from primary key ans scopes +// Key makes full key from primary key and scopes func Key(key string, scopes ...string) string { return strings.Join(scopes, "$$") + "@@" + key } + func parseKey(fullKey string) (key string, scopes []string, err error) { elems := strings.Split(fullKey, "@@") if len(elems) != 2 { @@ -44,7 +45,7 @@ type loadingCache struct { maxKeys int maxValueSize int - activeKeys map[string]struct{} + activeKeys map[string]struct{} // keep all current cached keys lock sync.Mutex } @@ -65,6 +66,7 @@ func NewLoadingCache(options ...Option) LoadingCache { } res.bytesCache = cache.New(res.defaultExpiration, res.cleanupInterval) + // OnEvicted called automatically for expired and manually deleted res.bytesCache.OnEvicted(func(key string, _ interface{}) { res.withLock(func() { delete(res.activeKeys, key) }) })