diff options
Diffstat (limited to 'weed/util/http_util.go')
| -rw-r--r-- | weed/util/http_util.go | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/weed/util/http_util.go b/weed/util/http_util.go new file mode 100644 index 000000000..a54fc8779 --- /dev/null +++ b/weed/util/http_util.go @@ -0,0 +1,163 @@ +package util + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strings" + + "github.com/chrislusf/seaweedfs/weed/security" +) + +var ( + client *http.Client + Transport *http.Transport +) + +func init() { + Transport = &http.Transport{ + MaxIdleConnsPerHost: 1024, + } + client = &http.Client{Transport: Transport} +} + +func PostBytes(url string, body []byte) ([]byte, error) { + r, err := client.Post(url, "application/octet-stream", bytes.NewReader(body)) + if err != nil { + return nil, fmt.Errorf("Post to %s: %v", url, err) + } + defer r.Body.Close() + b, err := ioutil.ReadAll(r.Body) + if err != nil { + return nil, fmt.Errorf("Read response body: %v", err) + } + return b, nil +} + +func Post(url string, values url.Values) ([]byte, error) { + r, err := client.PostForm(url, values) + if err != nil { + return nil, err + } + defer r.Body.Close() + b, err := ioutil.ReadAll(r.Body) + if err != nil { + return nil, err + } + return b, nil +} + +func Get(url string) ([]byte, error) { + r, err := client.Get(url) + if err != nil { + return nil, err + } + defer r.Body.Close() + b, err := ioutil.ReadAll(r.Body) + if r.StatusCode != 200 { + return nil, fmt.Errorf("%s: %s", url, r.Status) + } + if err != nil { + return nil, err + } + return b, nil +} + +func Delete(url string, jwt security.EncodedJwt) error { + req, err := http.NewRequest("DELETE", url, nil) + if jwt != "" { + req.Header.Set("Authorization", "BEARER "+string(jwt)) + } + if err != nil { + return err + } + resp, e := client.Do(req) + if e != nil { + return e + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + switch resp.StatusCode { + case http.StatusNotFound, http.StatusAccepted, http.StatusOK: + return nil + } + m := make(map[string]interface{}) + if e := json.Unmarshal(body, m); e == nil { + if s, ok := m["error"].(string); ok { + return errors.New(s) + } + } + return errors.New(string(body)) +} + +func GetBufferStream(url string, values url.Values, allocatedBytes []byte, eachBuffer func([]byte)) error { + r, err := client.PostForm(url, values) + if err != nil { + return err + } + defer r.Body.Close() + if r.StatusCode != 200 { + return fmt.Errorf("%s: %s", url, r.Status) + } + bufferSize := len(allocatedBytes) + for { + n, err := r.Body.Read(allocatedBytes) + if n == bufferSize { + eachBuffer(allocatedBytes) + } + if err != nil { + if err == io.EOF { + return nil + } + return err + } + } + return nil +} + +func GetUrlStream(url string, values url.Values, readFn func(io.Reader) error) error { + r, err := client.PostForm(url, values) + if err != nil { + return err + } + defer r.Body.Close() + if r.StatusCode != 200 { + return fmt.Errorf("%s: %s", url, r.Status) + } + return readFn(r.Body) +} + +func DownloadUrl(fileUrl string) (filename string, rc io.ReadCloser, e error) { + response, err := client.Get(fileUrl) + if err != nil { + return "", nil, err + } + contentDisposition := response.Header["Content-Disposition"] + if len(contentDisposition) > 0 { + if strings.HasPrefix(contentDisposition[0], "filename=") { + filename = contentDisposition[0][len("filename="):] + filename = strings.Trim(filename, "\"") + } + } + rc = response.Body + return +} + +func Do(req *http.Request) (resp *http.Response, err error) { + return client.Do(req) +} + +func NormalizeUrl(url string) string { + if strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") { + return url + } + return "http://" + url +} |
