选择性地遵循Go中的重定向

时间:2015-01-07 08:09:23

标签: go

我正在尝试编写一个解析链接缩短程序的最终URL等的推特阅读器,但是为了获得手动定义的主机模式列表,我还提供了一个URL。这样做的原因是我不希望最终得到付费专区网址,而是之前的那个。

据我所知,这是基于默认的RoundTripper编写我自己的客户端,因为从自定义CheckRedirect函数返回错误会中止客户端而不会产生响应。< / p>

有没有办法使用默认client并记录自定义checkRedirect函数中的网址/特定网址列表?

1 个答案:

答案 0 :(得分:3)

如果您的自定义Response产生错误(如评论中所述),客户端请求 实际上仍会返回上一个有效CheckResponse

http://golang.org/pkg/net/http/#Client

  

如果CheckRedirect返回错误,则客户端的Get方法返回先前的Response和CheckRedirect的错误(包含在url.Error中),而不是发出Request req。

如果您维护“已知”付费专区网址列表,则可以使用自定义CheckResponse类型(error类型中的Paywalled中止付费专区重定向(package main import ( "errors" "fmt" "net/http" "net/url" ) var Paywalled = errors.New("next redirect would hit a paywall") var badHosts = map[string]error{ "registration.ft.com": Paywalled, } var client = &http.Client{ CheckRedirect: func(req *http.Request, via []*http.Request) error { // N.B.: when used in production, also check for redirect loops return badHosts[req.URL.Host] }, } func main() { resp, err := client.Get("http://on.ft.com/14pQBYE") // ignore non-nil err if it's a `Paywalled` wrapped in url.Error if e, ok := err.(*url.Error); (ok && e.Err != Paywalled) || (!ok && err != nil) { fmt.Println("error: ", err) return } resp.Body.Close() fmt.Println(resp.Request.URL) } ) 。 您的错误处理代码稍后必须将该错误类型视为特殊(非错误)情况。

示例:

{{1}}