package client import ( "bytes" "encoding/json" "fmt" "io" "io/ioutil" "net/http" "net/url" ) // helper function to stream an http request func stream(client *http.Client, rawurl, method string, in, out interface{}) (io.ReadCloser, error) { uri, err := url.Parse(rawurl) if err != nil { return nil, err } // if we are posting or putting data, we need to // write it to the body of the request. var buf io.ReadWriter if in == nil { // nothing } else if rw, ok := in.(io.ReadWriter); ok { buf = rw } else if b, ok := in.([]byte); ok { buf = new(bytes.Buffer) buf.Write(b) } else { buf = new(bytes.Buffer) err := json.NewEncoder(buf).Encode(in) if err != nil { return nil, err } } // creates a new http request to bitbucket. req, err := http.NewRequest(method, uri.String(), buf) if err != nil { return nil, err } if in == nil { // nothing } else if _, ok := in.(io.ReadWriter); ok { req.Header.Set("Content-Type", "plain/text") } else { req.Header.Set("Content-Type", "application/json") } resp, err := client.Do(req) if err != nil { return nil, err } if resp.StatusCode > http.StatusPartialContent { defer resp.Body.Close() out, _ := ioutil.ReadAll(resp.Body) return nil, fmt.Errorf(string(out)) } return resp.Body, nil }