From 5596b578f46f0c48bdb2c143b807c79cae31bc6e Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Tue, 6 Sep 2022 21:17:25 +0200 Subject: [PATCH] improved header parsing --- webmention.go | 28 +++++++++++++++++++--------- webmention_test.go | 17 +++++++++++++++++ 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/webmention.go b/webmention.go index c6992db..3602ffb 100644 --- a/webmention.go +++ b/webmention.go @@ -151,16 +151,26 @@ func (OwlHtmlParser) GetWebmentionEndpoint(resp *http.Response) (string, error) requestUrl := resp.Request.URL // Check link headers - for _, link := range resp.Header["Link"] { - if strings.Contains(link, "rel=\"webmention\"") || strings.Contains(link, "rel=webmention") { - link := strings.Split(link, ";")[0] - link = strings.Trim(link, "<>") - linkUrl, err := url.Parse(link) - if err != nil { - return "", err + for _, linkHeader := range resp.Header["Link"] { + linkHeaderParts := strings.Split(linkHeader, ",") + for _, linkHeaderPart := range linkHeaderParts { + linkHeaderPart = strings.TrimSpace(linkHeaderPart) + params := strings.Split(linkHeaderPart, ";") + if len(params) != 2 { + continue + } + for _, param := range params[1:] { + param = strings.TrimSpace(param) + if strings.Contains(param, "webmention") { + link := strings.Split(params[0], ";")[0] + link = strings.Trim(link, "<>") + linkUrl, err := url.Parse(link) + if err != nil { + return "", err + } + return requestUrl.ResolveReference(linkUrl).String(), nil + } } - return requestUrl.ResolveReference(linkUrl).String(), nil - } } diff --git a/webmention_test.go b/webmention_test.go index a96588e..4086ace 100644 --- a/webmention_test.go +++ b/webmention_test.go @@ -103,6 +103,23 @@ func TestGetWebmentionEndpointLinkHeader(t *testing.T) { } } +func TestGetWebmentionEndpointLinkHeaderCommas(t *testing.T) { + html := []byte("") + parser := &owl.OwlHtmlParser{} + resp := constructResponse(html) + resp.Header = http.Header{ + "Link": []string{"; rel=\"other\", ; rel=\"webmention\""}, + } + endpoint, err := parser.GetWebmentionEndpoint(resp) + + if err != nil { + t.Errorf("Unable to parse feed: %v", err) + } + if endpoint != "https://webmention.rocks/test/19/webmention" { + t.Errorf("Wrong endpoint. Expected %v, got %v", "https://webmention.rocks/test/19/webmention", endpoint) + } +} + func TestGetWebmentionEndpointRelativeLink(t *testing.T) { html := []byte("") parser := &owl.OwlHtmlParser{}