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 (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 addFileReader(w *multipart.Writer, f *File) error { part, err := w.CreateFormFile(f.ParamName, f.Name) if err != nil { return err } _, err = io.Copy(part, f.Reader) return err }
// Add a file to a multipart writer. func addFormFileFromData(writer *multipart.Writer, name, path string, data []byte) error { part, err := writer.CreateFormFile(name, filepath.Base(path)) if err != nil { return err } _, err = part.Write(data) return err }
// writeMultiPartFiles writes the given files as parts of a multipart message // using the given writer. func writeMultiPartFiles(writer *multipart.Writer, files map[string][]byte) error { for fileName, fileContent := range files { fw, err := writer.CreateFormFile(fileName, fileName) if err != nil { return err } io.Copy(fw, bytes.NewBuffer(fileContent)) } return nil }
func (n *GitLabClient) createArtifactsForm(mpw *multipart.Writer, reader io.Reader, baseName string) error { wr, err := mpw.CreateFormFile("file", baseName) if err != nil { return err } _, err = io.Copy(wr, reader) if err != nil { return err } return nil }
func writeMPBody(fname string, mw *multipart.Writer) error { fw, _ := mw.CreateFormFile("files[]", filepath.Base(fname)) f, err := os.Open(fname) if err != nil { return err } defer f.Close() _, err = io.Copy(fw, f) if err != nil { return err } return nil }
func addFile(w *multipart.Writer, fieldName, path string) error { file, err := os.Open(path) if err != nil { return err } defer file.Close() part, err := w.CreateFormFile(fieldName, filepath.Base(path)) if err != nil { return err } _, err = io.Copy(part, file) return err }
// addFile adds a file to this multipart form func addFile(w *multipart.Writer, filePath string) error { f, err := os.Open(filePath) if err != nil { return err } fw, err := w.CreateFormFile("file", filePath) if err != nil { return err } _, err = io.Copy(fw, f) if err != nil { return err } return nil }
func CreateFileForm(bodyWriter *multipart.Writer, fkey, fp string) error { fileWriter, err := bodyWriter.CreateFormFile(fkey, fp) if err != nil { return err } fh, err := os.Open(fp) if err != nil { return err } defer fh.Close() _, err = io.Copy(fileWriter, fh) if err != nil { return err } return nil }
func addFormFile(writer *multipart.Writer, name string, reader io.Reader) error { items := strings.Split(name, ":") fieldname := items[0] filename := items[1] part, err := writer.CreateFormFile(fieldname, filename) if err != nil { return err } _, err = io.Copy(part, reader) 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() }
func gradeRun( ctx *common.Context, client *http.Client, run *common.Run, multipartWriter *multipart.Writer, ) (*runner.RunResult, error) { ctx.EventCollector.Add(ctx.EventFactory.NewEvent( "grade", common.EventBegin, common.Arg{"id", run.AttemptID}, common.Arg{"input", run.InputHash}, common.Arg{"language", run.Language}, )) defer func() { ctx.EventCollector.Add(ctx.EventFactory.NewEvent( "grade", common.EventEnd, )) }() // Make sure no other I/O is being made while we grade this run. ioLockEvent := ctx.EventFactory.NewCompleteEvent("I/O lock") ioLock.Lock() defer ioLock.Unlock() ctx.EventCollector.Add(ioLockEvent) inputEvent := ctx.EventFactory.NewCompleteEvent("input") input, err := inputManager.Add( run.InputHash, runner.NewRunnerInputFactory(client, &ctx.Config), ) if err != nil { return nil, err } defer input.Release(input) ctx.EventCollector.Add(inputEvent) // Send the header as soon as possible to avoid a timeout. filesWriter, err := multipartWriter.CreateFormFile("file", "files.zip") if err != nil { return nil, err } return runner.Grade(ctx, filesWriter, run, input, &minijail) }
func (h *baseUploadHandler) write(mpw *multipart.Writer) error { logf("Uploading base of %s...", h.filepath) var diff *FileDiff for _, d := range h.op.patch { if d.Path == h.filepath { diff = d break } } if diff == nil { return fmt.Errorf("file %s is not part of patch", h.filepath) } fields := map[string]string{ "filename": h.filepath, "status": string(diff.Op), "is_binary": "false", "is_current": "false", "checksum": h.op.baseMD5[h.filepath], } //"file_too_large": "1", if err := writeFields(mpw, fields); err != nil { return err } data, err := mpw.CreateFormFile("data", h.filepath) if err != nil { return err } if diff.Op == Added { return nil } base, err := h.op.delta.Base(h.filepath) if err != nil { return err } _, err = io.Copy(data, base) base.Close() return err }
func addFile(mpart *multipart.Writer, param, filename, data string) error { if len(data) == 0 { return nil } part, err := mpart.CreateFormFile(param, filename) if err != nil { return err } gz := gzip.NewWriter(part) if _, err := gz.Write([]byte(data)); err != nil { return err } if err := gz.Close(); err != nil { return err } return nil }
func loadFileToWriter(file string, key string, writer *multipart.Writer) { f, err := os.Open(file) if err != nil { OutputError("Error opening file " + file + "\n") os.Exit(2) } defer f.Close() fw, err := writer.CreateFormFile(key, file) if err != nil { OutputError("Error reading file " + file + "\n") os.Exit(2) } if _, err = io.Copy(fw, f); err != nil { OutputError("Error opening file " + file + " to buffer\n") os.Exit(2) } }
func WriteFormFile(bw *multipart.Writer, filename string) error { fileWriter, err := bw.CreateFormFile("file", filename) if err != nil { return err } // open file handle fh, err := os.Open(filename) if err != nil { return err } //iocopy _, err = io.Copy(fileWriter, fh) if err != nil { return err } return nil }
// streamingUpload streams a file via a pipe through a multipart.Writer. // Generally one should use newStreamingUpload instead of calling this directly. func streamingUpload(file *os.File, fileName string, postBodyWriter *multipart.Writer, w *io.PipeWriter) { defer GinkgoRecover() defer file.Close() defer w.Close() // Set up the form file fileWriter, err := postBodyWriter.CreateFormFile("file", fileName) if err != nil { Failf("Unable to to write file at %s to buffer. Error: %s", fileName, err) } // Copy kubectl binary into the file writer if _, err := io.Copy(fileWriter, file); err != nil { Failf("Unable to to copy file at %s into the file writer. Error: %s", fileName, err) } // Nothing more should be written to this instance of the postBodyWriter if err := postBodyWriter.Close(); err != nil { Failf("Unable to close the writer for file upload. Error: %s", err) } }
func writePluginToWriter(pw io.WriteCloser, bufin []*bufio.Reader, writer *multipart.Writer, pluginPaths []string, errChan chan error) { for i, pluginPath := range pluginPaths { part, err := writer.CreateFormFile("snap-plugins", pluginPath) if err != nil { errChan <- err return } if CompressUpload { cpart := gzip.NewWriter(part) _, err := bufin[i].WriteTo(cpart) if err != nil { errChan <- err return } err = cpart.Close() if err != nil { errChan <- err return } } else { _, err := bufin[i].WriteTo(part) if err != nil { errChan <- err return } } } err := writer.Close() if err != nil { errChan <- err return } err = pw.Close() if err != nil { errChan <- err return } errChan <- nil }
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 }
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 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() } }
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 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 }
// 向微博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 (h *uploadHandler) write(mpw *multipart.Writer) error { op := h.op issue := op.issue if issue.Id == 0 { logf("Uploading delta to new issue...") } else { logf("Uploading delta to issue %d...", issue.Id) } hashes, err := h.baseHashes() if err != nil { return fmt.Errorf("computing base hashes: %v", err) } fields := map[string]string{"base_hashes": hashes} //"send_mail": "1", //"separate_patches": "1", if issue.Id > 0 { fields["issue"] = strconv.Itoa(issue.Id) } if issue.Subject == "" { fields["subject"] = "-" } else { fields["subject"] = issue.Subject } if issue.Description != "" { fields["description"] = issue.Description } if issue.User != "" { fields["user"] = issue.User } var reviewers, cc []string if len(issue.ReviewerMails) > 0 { reviewers = append(reviewers, issue.ReviewerMails...) } if len(issue.ReviewerNicks) > 0 { reviewers = append(reviewers, issue.ReviewerNicks...) } if len(reviewers) > 0 { fields["reviewers"] = strings.Join(reviewers, ", ") } if len(issue.CcMails) > 0 { cc = append(cc, issue.CcMails...) } if len(issue.CcNicks) > 0 { cc = append(cc, issue.CcNicks...) } if len(cc) > 0 { fields["cc"] = strings.Join(cc, ", ") } if issue.Private { fields["private"] = "1" } if issue.Closed { fields["closed"] = "1" } baseURL := issue.BaseURL if baseURL == "" { baseURL = op.delta.BaseURL() } if baseURL != "" { fields["base"] = baseURL } if op.delta.SendBases() { fields["content_upload"] = "1" } if h.sendMail { fields["send_mail"] = "1" } if err := writeFields(mpw, fields); err != nil { return err } data, err := mpw.CreateFormFile("data", "data.diff") if err != nil { return err } for _, diff := range op.patch { _, err = data.Write([]byte("Index: " + diff.Path + "\n")) if err != nil { return err } // XXX Skip original Index: line from text. _, err = data.Write(diff.Text) if err != nil { return err } _, err = data.Write([]byte{'\n'}) if err != nil { return err } } return nil }