Remember lease_seconds when set

This commit is contained in:
Peter Stuifzand 2018-07-07 17:56:28 +02:00
parent c6902909b1
commit 471ff2c564
2 changed files with 51 additions and 7 deletions

View File

@ -19,6 +19,7 @@ type HubBackend interface {
CreateFeed(url, channel string) (int64, error)
GetSecret(id int64) string
UpdateFeed(feedID int64, contentType string, body io.Reader) error
FeedSetLeaseSeconds(feedID int64, leaseSeconds int64) error
}
type incomingHandler struct {
@ -37,10 +38,31 @@ func (h *incomingHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
log.Println(r.URL.Query())
log.Println(r.PostForm)
// find feed
matches := urlRegex.FindStringSubmatch(r.URL.Path)
feed, err := strconv.ParseInt(matches[1], 10, 64)
if err != nil {
fmt.Fprint(w, err)
}
if r.Method == http.MethodGet {
values := r.URL.Query()
// check
if leaseStr := values.Get("hub.lease_seconds"); leaseStr != "" {
// update lease_seconds
leaseSeconds, err := strconv.ParseInt(leaseStr, 10, 64)
if err != nil {
http.Error(w, fmt.Sprintf("error in hub.lease_seconds format %q: %s", leaseSeconds, err), 400)
return
}
err = h.Backend.FeedSetLeaseSeconds(feed, leaseSeconds)
if err != nil {
http.Error(w, fmt.Sprintf("error in while setting hub.lease_seconds: %s", err), 400)
return
}
}
verify := values.Get("hub.challenge")
fmt.Fprint(w, verify)
@ -53,13 +75,6 @@ func (h *incomingHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return
}
// find feed
matches := urlRegex.FindStringSubmatch(r.URL.Path)
feed, err := strconv.ParseInt(matches[1], 10, 64)
if err != nil {
fmt.Fprint(w, err)
}
// find secret
secret := h.Backend.GetSecret(feed)
if secret == "" {

View File

@ -131,6 +131,35 @@ func (h *hubIncomingBackend) UpdateFeed(feedID int64, contentType string, body i
return err
}
func (h *hubIncomingBackend) FeedSetLeaseSeconds(feedID int64, leaseSeconds int64) error {
conn := pool.Get()
defer conn.Close()
log.Printf("updating feed %d lease_seconds", feedID)
args := redis.Args{}.Add(fmt.Sprintf("feed:%d", feedID), "lease_seconds", leaseSeconds)
conn.Do("HSET", args...)
return nil
}
func (h *hubIncomingBackend) run() error {
ticker := time.NewTicker(10 * time.Minute)
quit := make(chan struct{})
go func() {
for {
select {
case <-ticker.C:
case <-quit:
ticker.Stop()
return
}
}
}()
return nil
}
func newPool(addr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 3,