// DownloadFile GETs the given URL to a local file func (c *Client) DownloadFile(file string, u *url.URL, param *Download) error { var err error if param == nil { param = &DefaultDownload } fh, err := os.Create(file) if err != nil { return err } defer fh.Close() req, err := http.NewRequest(param.Method, u.String(), nil) if err != nil { return err } res, err := c.Client.Do(req) if err != nil { return err } defer res.Body.Close() switch res.StatusCode { case http.StatusOK: default: err = errors.New(res.Status) } if err != nil { return err } var r io.Reader = res.Body if param.Progress != nil { pr := progress.NewReader(param.Progress, res.Body, res.ContentLength) r = pr // Mark progress reader as done when returning from this function. defer func() { pr.Done(err) }() } _, err = io.Copy(fh, r) if err != nil { return err } // Assign error before returning so that it gets picked up by the deferred // function marking the progress reader as done. err = fh.Close() if err != nil { return err } return nil }
// DownloadFile GETs the given URL to a local file func (c *Client) DownloadFile(file string, u *url.URL, param *Download) error { var err error if param == nil { param = &DefaultDownload } rc, contentLength, err := c.Download(u, param) if err != nil { return err } defer rc.Close() var r io.Reader = rc fh, err := os.Create(file) if err != nil { return err } defer fh.Close() if param.Progress != nil { pr := progress.NewReader(param.Progress, r, contentLength) r = pr // Mark progress reader as done when returning from this function. defer func() { pr.Done(err) }() } _, err = io.Copy(fh, r) if err != nil { return err } // Assign error before returning so that it gets picked up by the deferred // function marking the progress reader as done. err = fh.Close() if err != nil { return err } return nil }
// Upload PUTs the local file to the given URL func (c *Client) Upload(f io.Reader, u *url.URL, param *Upload) error { var err error if param.Progress != nil { pr := progress.NewReader(param.Progress, f, param.ContentLength) f = pr // Mark progress reader as done when returning from this function. defer func() { pr.Done(err) }() } req, err := http.NewRequest(param.Method, u.String(), f) if err != nil { return err } req.ContentLength = param.ContentLength req.Header.Set("Content-Type", param.Type) for k, v := range param.Headers { req.Header.Add(k, v) } if param.Ticket != nil { req.AddCookie(param.Ticket) } res, err := c.Client.Do(req) if err != nil { return err } switch res.StatusCode { case http.StatusOK: case http.StatusCreated: default: err = errors.New(res.Status) } return err }