aboutsummaryrefslogtreecommitdiff
path: root/weed/util/http_util.go
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2016-06-02 18:09:14 -0700
committerChris Lu <chris.lu@gmail.com>2016-06-02 18:09:14 -0700
commit5ce6bbf07672bf3f3c8d26cd2ce0e3e853a47c44 (patch)
tree2e4dd2ad0a618ab2b7cdebcdb9c503526c31e2e8 /weed/util/http_util.go
parentcaeffa3998adc060fa66c4cd77af971ff2d26c57 (diff)
downloadseaweedfs-5ce6bbf07672bf3f3c8d26cd2ce0e3e853a47c44.tar.xz
seaweedfs-5ce6bbf07672bf3f3c8d26cd2ce0e3e853a47c44.zip
directory structure change to work with glide
glide has its own requirements. My previous workaround caused me some code checkin errors. Need to fix this.
Diffstat (limited to 'weed/util/http_util.go')
-rw-r--r--weed/util/http_util.go163
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
+}