diff --git a/internal/reader/parser/format.go b/internal/reader/parser/format.go index 5c39a439..5a815a59 100644 --- a/internal/reader/parser/format.go +++ b/internal/reader/parser/format.go @@ -22,6 +22,9 @@ const ( // DetectFeedFormat tries to guess the feed format from input data. func DetectFeedFormat(r io.ReadSeeker) (string, string) { + r.Seek(0, io.SeekStart) + defer r.Seek(0, io.SeekStart) + if isJSON, err := detectJSONFormat(r); err == nil && isJSON { return FormatJSON, "" } @@ -70,6 +73,10 @@ func detectJSONFormat(r io.ReadSeeker) (bool, error) { return false, err } + if len(buffer) < n { + panic("unreachable") // bounds check hint to compiler + } + // Check each byte in the buffer for i := range n { ch := buffer[i] diff --git a/internal/reader/parser/parser.go b/internal/reader/parser/parser.go index d95ea001..6b269717 100644 --- a/internal/reader/parser/parser.go +++ b/internal/reader/parser/parser.go @@ -18,20 +18,15 @@ var ErrFeedFormatNotDetected = errors.New("parser: unable to detect feed format" // ParseFeed analyzes the input data and returns a normalized feed object. func ParseFeed(baseURL string, r io.ReadSeeker) (*model.Feed, error) { - r.Seek(0, io.SeekStart) format, version := DetectFeedFormat(r) switch format { case FormatAtom: - r.Seek(0, io.SeekStart) return atom.Parse(baseURL, r, version) case FormatRSS: - r.Seek(0, io.SeekStart) return rss.Parse(baseURL, r) case FormatJSON: - r.Seek(0, io.SeekStart) return json.Parse(baseURL, r) case FormatRDF: - r.Seek(0, io.SeekStart) return rdf.Parse(baseURL, r) default: return nil, ErrFeedFormatNotDetected