From 246a48359c1dab3b60bb86f1db6d5eb3120d0da3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Fri, 6 Nov 2020 17:39:10 -0800 Subject: [PATCH] Do not follow redirects when trying known feed URLs Some websites redirects unknown URLs to the home page. As result, the list of known URLs is returned to the subscription list. We don't want the user to choose between invalid feed URLs. --- http/client/client.go | 22 +++++++++++++++++++--- reader/subscription/finder.go | 7 +++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/http/client/client.go b/http/client/client.go index eb889d8e..adbfc369 100644 --- a/http/client/client.go +++ b/http/client/client.go @@ -52,7 +52,8 @@ type Client struct { requestPassword string requestUserAgent string - useProxy bool + useProxy bool + doNotFollowRedirects bool ClientTimeout int ClientMaxBodySize int64 @@ -124,12 +125,18 @@ func (c *Client) WithCacheHeaders(etagHeader, lastModifiedHeader string) *Client return c } -// WithProxy enable proxy for the current HTTP request. +// WithProxy enables proxy for the current HTTP request. func (c *Client) WithProxy() *Client { c.useProxy = true return c } +// WithoutRedirects disables HTTP redirects. +func (c *Client) WithoutRedirects() *Client { + c.doNotFollowRedirects = true + return c +} + // WithUserAgent defines the User-Agent header to use for HTTP requests. func (c *Client) WithUserAgent(userAgent string) *Client { if userAgent != "" { @@ -266,7 +273,10 @@ func (c *Client) buildRequest(method string, body io.Reader) (*http.Request, err } func (c *Client) buildClient() http.Client { - client := http.Client{Timeout: time.Duration(c.ClientTimeout) * time.Second} + client := http.Client{ + Timeout: time.Duration(c.ClientTimeout) * time.Second, + } + transport := &http.Transport{ Proxy: http.ProxyFromEnvironment, DialContext: (&net.Dialer{ @@ -284,6 +294,12 @@ func (c *Client) buildClient() http.Client { IdleConnTimeout: 10 * time.Second, } + if c.doNotFollowRedirects { + client.CheckRedirect = func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + } + } + if c.useProxy && c.ClientProxyURL != "" { proxyURL, err := url.Parse(c.ClientProxyURL) if err != nil { diff --git a/reader/subscription/finder.go b/reader/subscription/finder.go index db5e22c6..f9b7413b 100644 --- a/reader/subscription/finder.go +++ b/reader/subscription/finder.go @@ -156,9 +156,16 @@ func tryWellKnownUrls(websiteURL, userAgent, username, password string) (Subscri if err != nil { continue } + clt := client.NewClientWithConfig(fullURL, config.Opts) clt.WithCredentials(username, password) clt.WithUserAgent(userAgent) + + // Some websites redirects unknown URLs to the home page. + // As result, the list of known URLs is returned to the subscription list. + // We don't want the user to choose between invalid feed URLs. + clt.WithoutRedirects() + response, err := clt.Get() if err != nil { continue