func (c *Client) doFollowingRedirects(ireq *Request) (r *Response, err os.Error) { // TODO: if/when we add cookie support, the redirected request shouldn't // necessarily supply the same cookies as the original. var base *url.URL redirectChecker := c.CheckRedirect if redirectChecker == nil { redirectChecker = defaultCheckRedirect } var via []*Request if ireq.URL == nil { return nil, os.NewError("http: nil Request.URL") } req := ireq urlStr := "" // next relative or absolute URL to fetch (after first request) for redirect := 0; ; redirect++ { if redirect != 0 { req = new(Request) req.Method = ireq.Method req.Header = make(Header) req.URL, err = base.Parse(urlStr) if err != nil { break } if len(via) > 0 { // Add the Referer header. lastReq := via[len(via)-1] if lastReq.URL.Scheme != "https" { req.Header.Set("Referer", lastReq.URL.String()) } err = redirectChecker(req, via) if err != nil { break } } } urlStr = req.URL.String() if r, err = send(req, c.Transport); err != nil { break } if shouldRedirect(r.StatusCode) { r.Body.Close() if urlStr = r.Header.Get("Location"); urlStr == "" { err = os.NewError(fmt.Sprintf("%d response missing Location header", r.StatusCode)) break } base = req.URL via = append(via, req) continue } return } method := ireq.Method err = &url.Error{method[0:1] + strings.ToLower(method[1:]), urlStr, err} return }
// Assumes no custom headers are sent so only needs access to a URL. // If you plan on sending x-amz-* headers with a query string authorization // you can use Signature(secret, StringToSign(url, headers, expires)) instead // Returns an url.URL struct constructed from the Raw URL with the AWS // query parameters appended at the end. // Assumes any fragments are not included in url.Raw func URL(url *url.URL, key, secret, method, expires string) (*url.URL, os.Error) { sig := Signature(secret, StringToSign(method, url, http.Header{}, expires)) raw := url.Raw parts := strings.SplitN(raw, "?", 2) params := parts[1:] params = append(params, "AWSAccessKeyId="+key) params = append(params, "Expires="+expires) params = append(params, "Signature="+sig) signed := strings.Join(append(parts[:1], strings.Join(params, "&")), "?") return url.Parse(signed) }
func getNewUrl(url *url.URL) *url.URL { urlBackend, _ := url.Parse("http://127.0.0.1") url.Scheme = urlBackend.Scheme url.Host = urlBackend.Host return url }