func (fm *FeedManager) requestFeedContent(f content.Feed) { if f == nil { fm.logger.Infoln("No feed provided") return } data := f.Data() fm.logger.Infoln("Requesting feed content for " + f.String()) resp, err := fm.client.Get(data.Link) if err != nil { data.UpdateError = err.Error() } else if resp.StatusCode != http.StatusOK { defer func() { // Drain the body so that the connection can be reused io.Copy(ioutil.Discard, resp.Body) resp.Body.Close() }() data.UpdateError = httpStatusPrefix + strconv.Itoa(resp.StatusCode) } else { defer resp.Body.Close() data.UpdateError = "" buf := util.BufferPool.GetBuffer() defer util.BufferPool.Put(buf) if _, err := buf.ReadFrom(resp.Body); err == nil { hash := md5.Sum(buf.Bytes()) if b, ok := fm.lastUpdateHash[data.Id]; ok && bytes.Equal(b[:], hash[:]) { fm.logger.Infof("Content of feed %s is the same as the previous update\n", f) return } fm.lastUpdateHash[data.Id] = hash if pf, err := parser.ParseFeed(buf.Bytes(), parser.ParseRss2, parser.ParseAtom, parser.ParseRss1); err == nil { f.Refresh(fm.processParserFeed(pf)) } else { data.UpdateError = err.Error() } } else { data.UpdateError = err.Error() } } if data.UpdateError != "" { fm.logger.Printf("Error updating feed '%s': %s\n", f, data.UpdateError) } f.Data(data) select { case <-fm.done: return default: fm.updateFeed(f) } }