Prepare and execute the request for this Command.
(cmd Command)
| 471 | |
| 472 | // Prepare and execute the request for this Command. |
| 473 | func (f *Fetcher) doRequest(cmd Command) (*http.Response, error) { |
| 474 | req, err := http.NewRequest(cmd.Method(), cmd.URL().String(), nil) |
| 475 | if err != nil { |
| 476 | return nil, err |
| 477 | } |
| 478 | // If the Command implements some other recognized interfaces, set |
| 479 | // the request accordingly (see cmd.go for the list of interfaces). |
| 480 | // First, the Header values. |
| 481 | if hd, ok := cmd.(HeaderProvider); ok { |
| 482 | for k, v := range hd.Header() { |
| 483 | req.Header[k] = v |
| 484 | } |
| 485 | } |
| 486 | // BasicAuth has higher priority than an Authorization header set by |
| 487 | // a HeaderProvider. |
| 488 | if ba, ok := cmd.(BasicAuthProvider); ok { |
| 489 | req.SetBasicAuth(ba.BasicAuth()) |
| 490 | } |
| 491 | // Cookies are added to the request, even if some cookies were set |
| 492 | // by a HeaderProvider. |
| 493 | if ck, ok := cmd.(CookiesProvider); ok { |
| 494 | for _, c := range ck.Cookies() { |
| 495 | req.AddCookie(c) |
| 496 | } |
| 497 | } |
| 498 | // For the body of the request, ReaderProvider has higher priority |
| 499 | // than ValuesProvider. |
| 500 | if rd, ok := cmd.(ReaderProvider); ok { |
| 501 | rdr := rd.Reader() |
| 502 | rc, ok := rdr.(io.ReadCloser) |
| 503 | if !ok { |
| 504 | rc = ioutil.NopCloser(rdr) |
| 505 | } |
| 506 | req.Body = rc |
| 507 | } else if val, ok := cmd.(ValuesProvider); ok { |
| 508 | v := val.Values() |
| 509 | req.Body = ioutil.NopCloser(strings.NewReader(v.Encode())) |
| 510 | if req.Header.Get("Content-Type") == "" { |
| 511 | req.Header.Set("Content-Type", "application/x-www-form-urlencoded") |
| 512 | } |
| 513 | } |
| 514 | // If there was no User-Agent implicitly set by the HeaderProvider, |
| 515 | // set it to the default value. |
| 516 | if req.Header.Get("User-Agent") == "" { |
| 517 | req.Header.Set("User-Agent", f.UserAgent) |
| 518 | } |
| 519 | // Do the request. |
| 520 | res, err := f.HttpClient.Do(req) |
| 521 | if err != nil { |
| 522 | return nil, err |
| 523 | } |
| 524 | return res, nil |
| 525 | } |