From 7ca9415322f5efae55f8c874261b46dd2fe1c273 Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Mon, 22 Mar 2021 21:12:58 +0000 Subject: [PATCH] feed refactoring --- src/feed/feed.go | 47 ++++++++++++++++++++++++------------------- src/feed/feed_test.go | 4 ++-- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/feed/feed.go b/src/feed/feed.go index f43a82a..65d5a80 100644 --- a/src/feed/feed.go +++ b/src/feed/feed.go @@ -1,6 +1,7 @@ package feed import ( + "bytes" "encoding/xml" "errors" "fmt" @@ -12,42 +13,46 @@ var UnknownFormat = errors.New("unknown feed format") type processor func(r io.Reader) (*Feed, error) -func detect(lookup string) (string, processor) { +func sniff(lookup string) (string, processor) { lookup = strings.TrimSpace(lookup) - if lookup[0] == '{' { - return "json", ParseJSON - } - decoder := xml.NewDecoder(strings.NewReader(lookup)) - for { - token, _ := decoder.Token() - if token == nil { - break - } - if el, ok := token.(xml.StartElement); ok { - switch el.Name.Local { - case "rss": - return "rss", ParseRSS - case "RDF": - return "rss", ParseRDF - case "feed": - return "atom", ParseAtom + switch lookup[0] { + case '<': + decoder := xml.NewDecoder(strings.NewReader(lookup)) + for { + token, _ := decoder.Token() + if token == nil { + break + } + if el, ok := token.(xml.StartElement); ok { + switch el.Name.Local { + case "rss": + return "rss", ParseRSS + case "RDF": + return "rss", ParseRDF + case "feed": + return "atom", ParseAtom + } } } + case '{': + return "json", ParseJSON } return "", nil } func Parse(r io.Reader) (*Feed, error) { - var x [1024]byte - numread, err := r.Read(x[:]) + chunk := make([]byte, 64) + numread, err := r.Read(chunk) fmt.Println(numread, err) if err != nil { return nil, fmt.Errorf("Failed to read: %s", err) } - _, callback := detect(string(x[:])) + _, callback := sniff(string(chunk)) if callback == nil { return nil, UnknownFormat } + + r = io.MultiReader(bytes.NewReader(chunk), r) return callback(r) } diff --git a/src/feed/feed_test.go b/src/feed/feed_test.go index b605d06..1f77381 100644 --- a/src/feed/feed_test.go +++ b/src/feed/feed_test.go @@ -2,7 +2,7 @@ package feed import "testing" -func TestDetect(t *testing.T) { +func TestSniff(t *testing.T) { testcases := [][2]string{ { ``, @@ -26,7 +26,7 @@ func TestDetect(t *testing.T) { }, } for _, testcase := range testcases { - have, _ := detect(testcase[0]) + have, _ := sniff(testcase[0]) want := testcase[1] if want != have { t.Log(testcase[0])