From ce8d4cc80ba908022f0bbaf796b9025cfb68956e Mon Sep 17 00:00:00 2001 From: Unknwon Date: Tue, 18 Nov 2014 15:13:08 -0500 Subject: [PATCH] #634 --- .gopmfile | 2 +- models/publickey.go | 1 + modules/httplib/httplib.go | 58 +++++++++++++++++---------------- modules/httplib/httplib_test.go | 40 ++++++++++++++--------- 4 files changed, 57 insertions(+), 44 deletions(-) diff --git a/.gopmfile b/.gopmfile index a350578d6..c9441c18e 100644 --- a/.gopmfile +++ b/.gopmfile @@ -13,7 +13,7 @@ github.com/codegangsta/cli = commit:7381bc4e62 github.com/go-sql-driver/mysql = commit:8111ee3ec3 github.com/go-xorm/core = commit:3e0fa232ab github.com/go-xorm/xorm = commit:58d33844ce -github.com/gogits/go-gogs-client = commit:a5c3262f5e +github.com/gogits/go-gogs-client = commit:3b1d86c3a8 github.com/gogits/oauth2 = commit:99cbec870a github.com/lib/pq = commit:b021d0ef20 github.com/macaron-contrib/binding = commit:0e23661e7d diff --git a/models/publickey.go b/models/publickey.go index f379e1218..29c12c6e3 100644 --- a/models/publickey.go +++ b/models/publickey.go @@ -108,6 +108,7 @@ var ( // CheckPublicKeyString checks if the given public key string is recognized by SSH. func CheckPublicKeyString(content string) (bool, error) { + content = strings.TrimRight(content, "\n\r") if strings.ContainsAny(content, "\n\r") { return false, errors.New("only a single line with a single key please") } diff --git a/modules/httplib/httplib.go b/modules/httplib/httplib.go index 5f592168d..171dfe013 100644 --- a/modules/httplib/httplib.go +++ b/modules/httplib/httplib.go @@ -5,7 +5,7 @@ package httplib -// NOTE: last sync c07b1d8 on Aug 23, 2014. +// NOTE: last sync 57e62e5 on Oct 29, 2014. import ( "bytes" @@ -14,6 +14,7 @@ import ( "encoding/xml" "io" "io/ioutil" + "log" "mime/multipart" "net" "net/http" @@ -252,35 +253,36 @@ func (b *BeegoHttpRequest) getResponse() (*http.Response, error) { } else { b.url = b.url + "?" + paramBody } - } else if b.req.Method == "POST" && b.req.Body == nil && len(paramBody) > 0 { + } else if b.req.Method == "POST" && b.req.Body == nil { if len(b.files) > 0 { - bodyBuf := &bytes.Buffer{} - bodyWriter := multipart.NewWriter(bodyBuf) - for formname, filename := range b.files { - fileWriter, err := bodyWriter.CreateFormFile(formname, filename) - if err != nil { - return nil, err + pr, pw := io.Pipe() + bodyWriter := multipart.NewWriter(pw) + go func() { + for formname, filename := range b.files { + fileWriter, err := bodyWriter.CreateFormFile(formname, filename) + if err != nil { + log.Fatal(err) + } + fh, err := os.Open(filename) + if err != nil { + log.Fatal(err) + } + //iocopy + _, err = io.Copy(fileWriter, fh) + fh.Close() + if err != nil { + log.Fatal(err) + } } - fh, err := os.Open(filename) - if err != nil { - return nil, err + for k, v := range b.params { + bodyWriter.WriteField(k, v) } - //iocopy - _, err = io.Copy(fileWriter, fh) - fh.Close() - if err != nil { - return nil, err - } - } - for k, v := range b.params { - bodyWriter.WriteField(k, v) - } - contentType := bodyWriter.FormDataContentType() - bodyWriter.Close() - b.Header("Content-Type", contentType) - b.req.Body = ioutil.NopCloser(bodyBuf) - b.req.ContentLength = int64(bodyBuf.Len()) - } else { + bodyWriter.Close() + pw.Close() + }() + b.Header("Content-Type", bodyWriter.FormDataContentType()) + b.req.Body = ioutil.NopCloser(pr) + } else if len(paramBody) > 0 { b.Header("Content-Type", "application/x-www-form-urlencoded") b.Body(paramBody) } @@ -332,7 +334,7 @@ func (b *BeegoHttpRequest) getResponse() (*http.Response, error) { Jar: jar, } - if b.setting.UserAgent != "" { + if len(b.setting.UserAgent) > 0 && len(b.req.Header.Get("User-Agent")) == 0 { b.req.Header.Set("User-Agent", b.setting.UserAgent) } diff --git a/modules/httplib/httplib_test.go b/modules/httplib/httplib_test.go index 8a529c53a..e3f6b5d40 100644 --- a/modules/httplib/httplib_test.go +++ b/modules/httplib/httplib_test.go @@ -57,23 +57,23 @@ func TestSimplePost(t *testing.T) { } } -func TestPostFile(t *testing.T) { - v := "smallfish" - req := Post("http://httpbin.org/post") - req.Param("username", v) - req.PostFile("uploadfile", "httplib_test.go") +// func TestPostFile(t *testing.T) { +// v := "smallfish" +// req := Post("http://httpbin.org/post") +// req.Param("username", v) +// req.PostFile("uploadfile", "httplib_test.go") - str, err := req.String() - if err != nil { - t.Fatal(err) - } - t.Log(str) +// str, err := req.String() +// if err != nil { +// t.Fatal(err) +// } +// t.Log(str) - n := strings.Index(str, v) - if n == -1 { - t.Fatal(v + " not found in post") - } -} +// n := strings.Index(str, v) +// if n == -1 { +// t.Fatal(v + " not found in post") +// } +// } func TestSimplePut(t *testing.T) { str, err := Put("http://httpbin.org/put").String() @@ -194,3 +194,13 @@ func TestToFile(t *testing.T) { t.Fatal(err) } } + +func TestHeader(t *testing.T) { + req := Get("http://httpbin.org/headers") + req.Header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36") + str, err := req.String() + if err != nil { + t.Fatal(err) + } + t.Log(str) +}