func (c *client) Send(req cmds.Request) (cmds.Response, error) { // save user-provided encoding var previousUserProvidedEncoding string if encopt := req.Option(cmds.EncShort); encopt != nil { var err error previousUserProvidedEncoding, _, err = encopt.String() if err != nil { return nil, err } } // override with json to send to server req.SetOption(cmds.EncShort, cmds.JSON) query, err := getQuery(req) if err != nil { return nil, err } var fileReader *MultiFileReader if req.Files() != nil { fileReader = NewMultiFileReader(req.Files(), true) } path := strings.Join(req.Path(), "/") url := fmt.Sprintf(ApiUrlFormat, c.serverAddress, ApiPath, path, query) httpReq, err := http.NewRequest("POST", url, fileReader) if err != nil { return nil, err } // TODO extract string consts? if fileReader != nil { httpReq.Header.Set("Content-Type", "multipart/form-data; boundary="+fileReader.Boundary()) httpReq.Header.Set("Content-Disposition", "form-data: name=\"files\"") } else { httpReq.Header.Set("Content-Type", "application/octet-stream") } version := config.CurrentVersionNumber httpReq.Header.Set("User-Agent", fmt.Sprintf("/go-ipfs/%s/", version)) httpRes, err := http.DefaultClient.Do(httpReq) if err != nil { return nil, err } // using the overridden JSON encoding in request res, err := getResponse(httpRes, req) if err != nil { return nil, err } if len(previousUserProvidedEncoding) > 0 { // reset to user provided encoding after sending request // NB: if user has provided an encoding but it is the empty string, // still leave it as JSON. req.SetOption(cmds.EncShort, previousUserProvidedEncoding) } return res, nil }