// PostMultipartP posts a multipart message in the MIME internet format with a callback function with a string stating the upload Progress. func (c *Client) PostMultipartP(path string, files map[string][]byte, params Params, out interface{}, callback func(s string)) error { body := &bytes.Buffer{} writer := multipart.NewWriter(body) for name, source := range files { part, err := writer.CreateFormFile(name, "source.tgz") if err != nil { return err } _, err = io.Copy(part, bytes.NewReader(source)) if err != nil { return err } } for name, value := range params { writer.WriteField(name, value) } err := writer.Close() if err != nil { return err } var bodyReader io.Reader bodyReader = body var bar *pb.ProgressBar if callback != nil { bar = pb.New(body.Len()).SetUnits(pb.U_BYTES) bar.NotPrint = true bar.ShowBar = false bar.Callback = callback bar.Start() bodyReader = bar.NewProxyReader(body) } req, err := c.request("POST", path, bodyReader) if err != nil { return err } req.SetBasicAuth("convox", string(c.Password)) req.Header.Set("Content-Type", writer.FormDataContentType()) res, err := c.client().Do(req) if err != nil { return err } defer res.Body.Close() if err := responseError(res); err != nil { return err } data, err := ioutil.ReadAll(res.Body) if err != nil { return err } if out != nil { err = json.Unmarshal(data, out) if err != nil { return err } } if callback != nil { bar.Finish() } return nil }