func sendSnapFile(snapPath string, snapFile *os.File, pw *io.PipeWriter, mw *multipart.Writer, action *actionData) { defer snapFile.Close() if action.SnapOptions == nil { action.SnapOptions = &SnapOptions{} } errs := []error{ mw.WriteField("action", action.Action), mw.WriteField("name", action.Name), mw.WriteField("snap-path", action.SnapPath), mw.WriteField("channel", action.Channel), mw.WriteField("devmode", strconv.FormatBool(action.DevMode)), } for _, err := range errs { if err != nil { pw.CloseWithError(err) return } } fw, err := mw.CreateFormFile("snap", filepath.Base(snapPath)) if err != nil { pw.CloseWithError(err) return } _, err = io.Copy(fw, snapFile) if err != nil { pw.CloseWithError(err) return } mw.Close() pw.Close() }
func Write(w *multipart.Writer, params map[string][]string) error { for key, param1 := range params { param := param1[0] if len(param) > 0 && param[0] == '@' { file := param[1:] fw, err := w.CreateFormFile(key, file) if err != nil { log.Println("CreateFormFile failed:", err) return err } fd, err := os.Open(file) if err != nil { log.Println("Open file failed:", err) return err } else { _, err = io.Copy(fw, fd) fd.Close() if err != nil { log.Println("Copy file failed:", err) return err } } } else { err := w.WriteField(key, param) if err != nil { return err } } } return nil }
func SendMediaRequest(client *twittergo.Client, reqUrl string, params map[string]string, media []byte) (mediaResp twittergo.MediaResponse, err error) { var ( req *http.Request resp *twittergo.APIResponse body io.ReadWriter = bytes.NewBufferString("") mp *multipart.Writer writer io.Writer contentType string ) mp = multipart.NewWriter(body) for key, value := range params { mp.WriteField(key, value) } if media != nil { if writer, err = mp.CreateFormField("media"); err != nil { return } writer.Write(media) } contentType = fmt.Sprintf("multipart/form-data;boundary=%v", mp.Boundary()) mp.Close() if req, err = http.NewRequest("POST", reqUrl, body); err != nil { return } req.Header.Set("Content-Type", contentType) if resp, err = client.SendRequest(req); err != nil { return } err = resp.Parse(&mediaResp) return }
func (r Client) PostWithMultiPartData(req_url string, headers map[string][]string, params map[string][]string, body io.Reader, filename string) (resp *http.Response, err error) { var buffer *bytes.Buffer = new(bytes.Buffer) var writer *multipart.Writer = multipart.NewWriter(buffer) for k, v := range params { for _, field := range v { err1 := writer.WriteField(k, field) if err1 != nil { err = err1 return } } } w, err := writer.CreateFormFile("file", filename) if err != nil { return } _, err = io.Copy(w, body) if err != nil { return } err = writer.Close() if err != nil { return } if headers == nil { headers = make(map[string][]string) } headers["Content-Type"] = []string{writer.FormDataContentType()} return r.Post(req_url, headers, buffer, int64(buffer.Len())) }
func writeField(w multipart.Writer, fieldName string, fieldVal string) error { if err := w.WriteField(fieldName, fieldVal); err != nil { message := "Can not write field " + fieldName + " into the request. Reason: " + err.Error() logging.Logger().Warn(message) return errors.New(message) } return nil }
func writeFields(mpw *multipart.Writer, fields map[string]string) error { for k, v := range fields { err := mpw.WriteField(k, v) if err != nil { return err } } return nil }
func (a *BuyActivity) encodeChunkedFirstTransmission(log bitwrk.Logger, mwriter *multipart.Writer) (err error) { part, err := mwriter.CreateFormFile("a32chunks", "a32chunks.bin") if err != nil { return } log.Printf("Sending work chunk hashes to seller [%v].", *a.tx.WorkerURL) err = cafs.WriteChunkHashes(a.workFile, part) if err != nil { return } log.Printf("Sending buyer's secret to seller.") err = mwriter.WriteField("buyersecret", a.buyerSecret.String()) if err != nil { return } return mwriter.Close() }
/* * extra.CheckCrc: * 0: 不进行crc32校验 * 1: 以writeMultipart自动生成crc32的值,进行校验 * 2: 以extra.Crc32的值,进行校验 * other: 和2一样, 以 extra.Crc32的值,进行校验 */ func writeMultipart(writer *multipart.Writer, uptoken, key string, hasKey bool, extra *PutExtra) (err error) { if extra == nil { extra = &PutExtra{} } //token if err = writer.WriteField("token", uptoken); err != nil { return } //key if hasKey { if err = writer.WriteField("key", key); err != nil { return } } // extra.Params if extra.Params != nil { for k, v := range extra.Params { err = writer.WriteField(k, v) if err != nil { return } } } //extra.CheckCrc if extra.CheckCrc != 0 { err = writer.WriteField("crc32", strconv.FormatInt(int64(extra.Crc32), 10)) if err != nil { return } } //file head := make(textproto.MIMEHeader) // default the filename is same as key , but "" var fileName = key if fileName == "" { fileName = "filename" } head.Set("Content-Disposition", fmt.Sprintf(`form-data; name="file"; filename="%s"`, escapeQuotes(fileName))) if extra.MimeType != "" { head.Set("Content-Type", extra.MimeType) } _, err = writer.CreatePart(head) return err }
func GetBody() (body io.ReadWriter, header string, err error) { var ( mp *multipart.Writer media []byte writer io.Writer ) body = bytes.NewBufferString("") mp = multipart.NewWriter(body) media, err = ioutil.ReadFile("tweet_media/media.png") if err != nil { return } mp.WriteField("status", fmt.Sprintf("Hello %v!", time.Now())) writer, err = mp.CreateFormFile("media[]", "media.png") if err != nil { return } writer.Write(media) header = fmt.Sprintf("multipart/form-data;boundary=%v", mp.Boundary()) mp.Close() return }
//Coverts map to a multipart form func marshalMap(writer *multipart.Writer, m map[string]interface{}) error { if m == nil { return nil } for k, v := range m { switch v.(type) { case uint64: writer.WriteField(k, strconv.FormatUint(v.(uint64), 10)) case int64: writer.WriteField(k, strconv.FormatInt(v.(int64), 10)) case int: writer.WriteField(k, strconv.Itoa(v.(int))) case string: writer.WriteField(k, v.(string)) default: return errors.New("Unrecognizable type to marshal") } } return nil }
func AddPremiumToHTTPWriter(writer *multipart.Writer) { // If you're not PRO, you can't do this, get out if !CURRENT_USER.IsPro { return } OutputMessage("\n" + term.Green + "Setting pro user attributes..." + term.Reset + "\n") publish_date, disable_comments, hide_stats, unlisted := GetPremiumInput() if publish_date != "" { writer.WriteField("publish_date", publish_date) } if disable_comments { writer.WriteField("disable_comments", "1") } if hide_stats { writer.WriteField("hide_stats", "1") } if unlisted { writer.WriteField("unlisted", "1") } }
func PostFile(req_url, path, filename string, start, end, filesize int, params map[string]string) (body string, err error) { var buffer *bytes.Buffer = bytes.NewBuffer(make([]byte, 0)) var writer *multipart.Writer = multipart.NewWriter(buffer) for k, v := range params { err = writer.WriteField(k, v) if err != nil { return } } var file *os.File if file, err = os.OpenFile(path, os.O_RDONLY, 0644); err != nil { return } defer file.Close() w, err := writer.CreateFormFile("file", filename) if err != nil { return } var size = end - start + 1 if size == filesize { _, err = io.Copy(w, file) if err != nil { return } } else { var section []byte = make([]byte, size) var n int n, err = file.ReadAt(section, int64(start)) if err != nil || n != size { return } var buf *bytes.Buffer = bytes.NewBuffer(make([]byte, 0)) buf.Write(section) _, err = io.Copy(w, buf) if err != nil { return } } writer.Close() var client *http.Client = new(http.Client) var req *http.Request req, err = http.NewRequest("POST", req_url, buffer) if err != nil { return } req.Header.Set("Content-Type", writer.FormDataContentType()) req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:17.0) Gecko/20100101 Firefox/17.0") var resp *http.Response resp, err = client.Do(req) if err != nil { return } defer resp.Body.Close() resp_body, err := ioutil.ReadAll(resp.Body) body = string(resp_body) if resp.StatusCode != 200 { err = errors.New(fmt.Sprintf("%d", resp.StatusCode)) return } return }
func (douban *Douban) post(requestUrl string, accessToken string, params Params, picReader io.Reader, picFormat string, response interface{}) error { var urlBuffer bytes.Buffer urlBuffer.WriteString(requestUrl) var bodyBuffer bytes.Buffer var writer *multipart.Writer if picReader == nil { body := url.Values{} for k, v := range params { value := fmt.Sprint(v) body.Add(k, value) } bodyBuffer = *bytes.NewBufferString(body.Encode()) } else { writer = multipart.NewWriter(&bodyBuffer) picWriter, err := writer.CreateFormFile("image", "image."+picFormat) if err != nil { return err } _, e := io.Copy(picWriter, picReader) if e != nil { return e } for k, v := range params { value := fmt.Sprint(v) if k != "" && value != "" { writer.WriteField(k, value) } } writer.Close() } // log.Printf("URL: %s\n", urlBuffer.String()) // log.Printf("Body: %#v\n", bodyBuffer) req, err := http.NewRequest("POST", urlBuffer.String(), &bodyBuffer) if err != nil { return err } req.Header.Add("Authorization", accessToken) if picReader == nil { req.Header.Add("Content-Type", "application/x-www-form-urlencoded") } else { req.Header.Add("Content-Type", writer.FormDataContentType()) } // log.Printf("Header: %#V\n", req.Header) resp, err := douban.httpClient.Do(req) if err != nil { return err } defer resp.Body.Close() respContent, err := ioutil.ReadAll(resp.Body) if err != nil { return err } if resp.StatusCode != 200 { doubanError := DoubanError{} err := json.Unmarshal(respContent, &doubanError) if err != nil { return err } else { return &doubanError } } //log.Printf("==================================\n================================\n%s\n", respContent) return json.Unmarshal(respContent, &response) }
func TestHTTPAPI(t *testing.T) { // get volume // upload // uploads // delete // deletes var ( client http.Client s *Store z *Zookeeper w *multipart.Writer f *os.File bw io.Writer req *http.Request resp *http.Response body []byte err error buf = &bytes.Buffer{} tr = &testRet{} file = "./test/store_api.idx" bfile = "./test/block_api_1" ifile = "./test/block_api_1.idx" ) os.Remove(file) os.Remove(bfile) os.Remove(ifile) defer os.Remove(file) defer os.Remove(bfile) defer os.Remove(ifile) t.Log("NewStore()") if z, err = NewZookeeper([]string{"localhost:2181"}, time.Second*1, "/rack/test-api/"); err != nil { t.Errorf("NewZookeeper() error(%v)", err) t.FailNow() } z.DelVolume(1) if s, err = NewStore(z, file); err != nil { t.Errorf("NewStore() error(%v)", err) t.FailNow() } defer s.Close() StartAdmin(s, "localhost:6064") time.Sleep(1 * time.Second) t.Log("AddFreeVolume()") buf.Reset() buf.WriteString("n=1&bdir=./test/&idir=./test/") if resp, err = http.Post("http://localhost:6064/add_free_volume", "application/x-www-form-urlencoded", buf); err != nil { t.Errorf("http.Post() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } t.Logf("%s", body) if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.FailNow() } t.Log("AddVolume()") buf.Reset() buf.WriteString("vid=1") if resp, err = http.Post("http://localhost:6064/add_volume", "application/x-www-form-urlencoded", buf); err != nil { t.Errorf("http.Post() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } t.Logf("%s", body) if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.FailNow() } StartApi(s, "localhost:6062") time.Sleep(1 * time.Second) t.Log("Upload") buf.Reset() w = multipart.NewWriter(buf) if bw, err = w.CreateFormFile("file", "./test/1.jpg"); err != nil { t.Errorf("w.CreateFormFile() error(%v)", err) t.FailNow() } if f, err = os.Open("./test/1.jpg"); err != nil { t.Errorf("os.Open() error(%v)", err) t.FailNow() } defer f.Close() if _, err = io.Copy(bw, f); err != nil { t.Errorf("io.Copy() error(%v)", err) t.FailNow() } if err = w.WriteField("vid", "1"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } if err = w.WriteField("key", "15"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } if err = w.WriteField("cookie", "15"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } w.Close() if req, err = http.NewRequest("POST", "http://localhost:6062/upload", buf); err != nil { t.Errorf("http..NewRequest() error(%v)", err) t.FailNow() } req.Header.Set("Content-Type", w.FormDataContentType()) if resp, err = client.Do(req); err != nil { t.Errorf("client.Do() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.Errorf("ret: %d", tr.Ret) t.FailNow() } t.Log("Uploads") buf.Reset() w = multipart.NewWriter(buf) if err = w.WriteField("vid", "1"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } for i := 1; i < 10; i++ { if bw, err = w.CreateFormFile("file", "./test/"+strconv.Itoa(i)+".jpg"); err != nil { t.Errorf("w.CreateFormFile() error(%v)", err) t.FailNow() } if f, err = os.Open("./test/" + strconv.Itoa(i) + ".jpg"); err != nil { t.Errorf("os.Open() error(%v)", err) t.FailNow() } defer f.Close() if _, err = io.Copy(bw, f); err != nil { t.Errorf("io.Copy() error(%v)", err) t.FailNow() } if err = w.WriteField("keys", strconv.Itoa(20+i)); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } if err = w.WriteField("cookies", strconv.Itoa(20+i)); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } } w.Close() if req, err = http.NewRequest("POST", "http://localhost:6062/uploads", buf); err != nil { t.Errorf("http..NewRequest() error(%v)", err) t.FailNow() } req.Header.Set("Content-Type", w.FormDataContentType()) if resp, err = client.Do(req); err != nil { t.Errorf("client.Do() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.Errorf("ret: %d", tr.Ret) t.FailNow() } // t.Log("Get") t.Log("Delete") buf.Reset() buf.WriteString("vid=1&key=21") if resp, err = http.Post("http://localhost:6062/del", "application/x-www-form-urlencoded", buf); err != nil { t.Errorf("http.Post() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } t.Logf("%s", body) if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.FailNow() } t.Log("Deletes") buf.Reset() buf.WriteString("vid=1&keys=21&keys=22") if resp, err = http.Post("http://localhost:6062/dels", "application/x-www-form-urlencoded", buf); err != nil { t.Errorf("http.Post() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } t.Logf("%s", body) if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.FailNow() } }
// 向微博API服务器发送POST请求 // // 输入参数的含义请见Upload函数注释。当reader == nil时使用query string模式,否则使用multipart。 func (weibo *Weibo) sendPostHttpRequest(uri string, token string, params Params, reader io.Reader, imageFormat string, response interface{}) error { // 生成POST请求URI requestUri := fmt.Sprintf("%s?access_token=%s", uri, token) // 生成POST内容 var bodyBuffer bytes.Buffer var writer *multipart.Writer if reader == nil { // reader为nil时无文件上传,因此POST body为简单的query string模式 pb := url.Values{} pb.Add("access_token", token) for k, v := range params { value := fmt.Sprint(v) if k != "" && value != "" { pb.Add(k, value) } } bodyBuffer = *bytes.NewBufferString(pb.Encode()) } else { // 否则POST body使用multipart模式 writer = multipart.NewWriter(&bodyBuffer) imagePartWriter, _ := writer.CreateFormFile("pic", "image."+imageFormat) io.Copy(imagePartWriter, reader) for k, v := range params { value := fmt.Sprint(v) if k != "" && value != "" { writer.WriteField(k, value) } } writer.Close() } // 生成POST请求 req, err := http.NewRequest("POST", requestUri, &bodyBuffer) if err != nil { return err } if reader == nil { // reader为nil时使用一般的内容类型 req.Header.Set("Content-Type", "application/x-www-form-urlencoded") } else { // 否则使用带boundary的multipart类型 req.Header.Set("Content-Type", writer.FormDataContentType()) } // 发送请求 resp, err := weibo.httpClient.Do(req) if err != nil { return err } defer resp.Body.Close() // 解析API服务器返回内容 bytes, _ := ioutil.ReadAll(resp.Body) if resp.StatusCode == 200 { err := json.Unmarshal(bytes, &response) if err != nil { return err } return nil } else { var weiboErr WeiboError err := json.Unmarshal(bytes, &weiboErr) if err != nil { return err } return weiboErr } return nil }
// Http params func Http(method, uri string, params url.Values, buf []byte, res interface{}) (err error) { var ( body []byte w *multipart.Writer bw io.Writer bufdata = &bytes.Buffer{} req *http.Request resp *http.Response ru string enc string ctype string ) enc = params.Encode() if enc != "" { ru = uri + "?" + enc } if method == "GET" { if req, err = http.NewRequest("GET", ru, nil); err != nil { return } } else { if buf == nil { if req, err = http.NewRequest("POST", uri, strings.NewReader(enc)); err != nil { return } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") } else { w = multipart.NewWriter(bufdata) if bw, err = w.CreateFormFile("file", "1.jpg"); err != nil { return } if _, err = bw.Write(buf); err != nil { return } for key, _ := range params { w.WriteField(key, params.Get(key)) } ctype = w.FormDataContentType() if err = w.Close(); err != nil { return } if req, err = http.NewRequest("POST", uri, bufdata); err != nil { return } req.Header.Set("Content-Type", ctype) } } td := _timer.Start(5*time.Second, func() { _canceler(req) }) if resp, err = _client.Do(req); err != nil { log.Errorf("_client.Do(%s) error(%v)", ru, err) return } td.Stop() defer resp.Body.Close() if res == nil { return } if resp.StatusCode != http.StatusOK { log.Errorf("_client.Do(%s) status: %d", ru, resp.StatusCode) return } if body, err = ioutil.ReadAll(resp.Body); err != nil { log.Errorf("ioutil.ReadAll(%s) uri(%s) error(%v)", body, ru, err) return } if err = json.Unmarshal(body, res); err != nil { log.Errorf("json.Unmarshal(%s) uri(%s) error(%v)", body, ru, err) } return }
func TestHTTPAPI(t *testing.T) { // get volume // upload // uploads // delete // deletes var ( client http.Client s *Store z *zk.Zookeeper w *multipart.Writer f *os.File bw io.Writer req *http.Request resp *http.Response body []byte err error buf = &bytes.Buffer{} tr = &testRet{} ) os.Remove(testConf.Store.VolumeIndex) os.Remove(testConf.Store.FreeVolumeIndex) os.Remove("./test/_free_block_1") os.Remove("./test/1_0") defer os.Remove(testConf.Store.VolumeIndex) defer os.Remove(testConf.Store.FreeVolumeIndex) defer os.Remove("./test/_free_block_1") defer os.Remove("./test/1_0") if z, err = zk.NewZookeeper(testConf); err != nil { t.Errorf("NewZookeeper() error(%v)", err) t.FailNow() } defer z.Close() z.DelVolume(1) defer z.DelVolume(1) if s, err = NewStore(testConf); err != nil { t.Errorf("NewStore() error(%v)", err) t.FailNow() } defer s.Close() StartAdmin("localhost:6064", s) time.Sleep(1 * time.Second) buf.Reset() buf.WriteString("n=1&bdir=./test/&idir=./test/") if resp, err = http.Post("http://localhost:6064/add_free_volume", "application/x-www-form-urlencoded", buf); err != nil { t.Errorf("http.Post() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.Errorf("add_free_volume: %d", tr.Ret) t.FailNow() } buf.Reset() buf.WriteString("vid=1") if resp, err = http.Post("http://localhost:6064/add_volume", "application/x-www-form-urlencoded", buf); err != nil { t.Errorf("http.Post() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.FailNow() } StartApi("localhost:6062", s, testConf) time.Sleep(1 * time.Second) buf.Reset() w = multipart.NewWriter(buf) if bw, err = w.CreateFormFile("file", "./test/1.jpg"); err != nil { t.Errorf("w.CreateFormFile() error(%v)", err) t.FailNow() } if f, err = os.Open("./test/1.jpg"); err != nil { t.Errorf("os.Open() error(%v)", err) t.FailNow() } defer f.Close() if _, err = io.Copy(bw, f); err != nil { t.Errorf("io.Copy() error(%v)", err) t.FailNow() } if err = w.WriteField("vid", "1"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } if err = w.WriteField("key", "15"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } if err = w.WriteField("cookie", "15"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } w.Close() if req, err = http.NewRequest("POST", "http://localhost:6062/upload", buf); err != nil { t.Errorf("http..NewRequest() error(%v)", err) t.FailNow() } req.Header.Set("Content-Type", w.FormDataContentType()) if resp, err = client.Do(req); err != nil { t.Errorf("client.Do() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.Errorf("ret: %d", tr.Ret) t.FailNow() } buf.Reset() w = multipart.NewWriter(buf) if err = w.WriteField("vid", "1"); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } for i := 1; i < 10; i++ { if bw, err = w.CreateFormFile("file", "./test/"+strconv.Itoa(i)+".jpg"); err != nil { t.Errorf("w.CreateFormFile() error(%v)", err) t.FailNow() } if f, err = os.Open("./test/" + strconv.Itoa(i) + ".jpg"); err != nil { t.Errorf("os.Open() error(%v)", err) t.FailNow() } defer f.Close() if _, err = io.Copy(bw, f); err != nil { t.Errorf("io.Copy() error(%v)", err) t.FailNow() } if err = w.WriteField("keys", strconv.Itoa(20+i)); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } if err = w.WriteField("cookies", strconv.Itoa(20+i)); err != nil { t.Errorf("w.WriteField() error(%v)", err) t.FailNow() } } w.Close() if req, err = http.NewRequest("POST", "http://localhost:6062/uploads", buf); err != nil { t.Errorf("http..NewRequest() error(%v)", err) t.FailNow() } req.Header.Set("Content-Type", w.FormDataContentType()) if resp, err = client.Do(req); err != nil { t.Errorf("client.Do() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.Errorf("uploads: %d", tr.Ret) t.FailNow() } buf.Reset() buf.WriteString("vid=1&key=21") if resp, err = http.Post("http://localhost:6062/del", "application/x-www-form-urlencoded", buf); err != nil { t.Errorf("http.Post() error(%v)", err) t.FailNow() } defer resp.Body.Close() if body, err = ioutil.ReadAll(resp.Body); err != nil { t.Errorf("ioutil.ReadAll() error(%v)", err) t.FailNow() } if err = json.Unmarshal(body, tr); err != nil { t.Errorf("json.Unmarshal() error(%v)", err) t.FailNow() } if tr.Ret != 1 { t.FailNow() } // TODO add get }
func BuildBasicHTTPWriter(writer *multipart.Writer, name string, desc string, tag_list []string, tracklist []mixcloud.Track) { // Add information name/description writer.WriteField("name", name) writer.WriteField("description", desc) // Add tags for i, tag := range tag_list { field_name := fmt.Sprintf("tags-%d-tag", i) writer.WriteField(field_name, tag) } // Add tracklist if tracklist != nil { var total_duration int = 0 for i, track := range tracklist { artist_field_name := fmt.Sprintf("sections-%d-artist", i) song_field_name := fmt.Sprintf("sections-%d-song", i) duration_field_name := fmt.Sprintf("sections-%d-start_time", i) total_duration += track.Duration writer.WriteField(artist_field_name, track.Artist) writer.WriteField(song_field_name, track.Song) writer.WriteField(duration_field_name, fmt.Sprintf("%d", total_duration)) } } }