add more carrier
This commit is contained in:
parent
b0d6f3bd2f
commit
4b1619b105
@ -26,12 +26,14 @@ import (
|
||||
)
|
||||
|
||||
type respCarrier struct {
|
||||
Resp *http.Response
|
||||
bytes []byte
|
||||
}
|
||||
|
||||
func (r *respCarrier) SetHttpResponse(resp *http.Response) {
|
||||
r.Resp = resp
|
||||
func (r *respCarrier) SetBytes(bytes []byte) {
|
||||
r.bytes = bytes
|
||||
}
|
||||
func (r *respCarrier) String() string {
|
||||
return string(r.bytes)
|
||||
}
|
||||
|
||||
func TestOption_WithEnableCookie(t *testing.T) {
|
||||
|
||||
@ -37,7 +37,7 @@ type HttpResponseCarrier interface {
|
||||
|
||||
// HttpBodyCarrier If value implement HttpBodyCarrier. http.Response.Body will pass to SetReader
|
||||
type HttpBodyCarrier interface {
|
||||
SetReader(r *io.ReadCloser)
|
||||
SetReader(r io.ReadCloser)
|
||||
}
|
||||
|
||||
// HttpBytesCarrier If value implement HttpBytesCarrier.
|
||||
@ -80,52 +80,54 @@ func (c *Client) customReq(req *BeegoHTTPRequest, opts []BeegoHttpRequestOption)
|
||||
|
||||
// handleResponse try to parse body to meaningful value
|
||||
func (c *Client) handleResponse(value interface{}, req *BeegoHTTPRequest) error {
|
||||
// send request
|
||||
resp, err := req.Response()
|
||||
err := c.handleCarrier(value, req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch carrier := value.(type) {
|
||||
case HttpResponseCarrier:
|
||||
return req.ToValue(value)
|
||||
}
|
||||
|
||||
// handleCarrier set http data to value
|
||||
func (c *Client) handleCarrier(value interface{}, req *BeegoHTTPRequest) error {
|
||||
resp, err := req.Response()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if value == nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if carrier, ok := value.(HttpResponseCarrier); ok {
|
||||
b, err := req.Bytes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
resp.Body = ioutil.NopCloser(bytes.NewReader(b))
|
||||
carrier.SetHttpResponse(resp)
|
||||
fallthrough
|
||||
case HttpBodyCarrier:
|
||||
}
|
||||
if carrier, ok := value.(HttpBodyCarrier); ok {
|
||||
b, err := req.Bytes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
reader := ioutil.NopCloser(bytes.NewReader(b))
|
||||
carrier.SetReader(&reader)
|
||||
fallthrough
|
||||
case HttpBytesCarrier:
|
||||
carrier.SetReader(reader)
|
||||
}
|
||||
if carrier, ok := value.(HttpBytesCarrier); ok {
|
||||
b, err := req.Bytes()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
carrier.SetBytes(b)
|
||||
fallthrough
|
||||
case HttpStatusCarrier:
|
||||
resp, err := req.Response()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if carrier, ok := value.(HttpStatusCarrier); ok {
|
||||
carrier.SetStatusCode(resp.StatusCode)
|
||||
fallthrough
|
||||
case HttpHeadersCarrier:
|
||||
resp, err := req.Response()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
if carrier, ok := value.(HttpHeadersCarrier); ok {
|
||||
carrier.SetHeader(resp.Header)
|
||||
}
|
||||
|
||||
return req.ToValue(value)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Get Send a GET request and try to give its result value
|
||||
|
||||
@ -16,6 +16,8 @@ package httplib
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
@ -29,13 +31,40 @@ func TestNewClient(t *testing.T) {
|
||||
assert.Equal(t, true, client.Setting.EnableCookie)
|
||||
}
|
||||
|
||||
type slideSshowResponse struct {
|
||||
Resp *http.Response
|
||||
bytes []byte
|
||||
type slideShowResponse struct {
|
||||
Resp *http.Response
|
||||
bytes []byte
|
||||
StatusCode int
|
||||
Body io.ReadCloser
|
||||
Header map[string][]string
|
||||
|
||||
Slideshow slideshow `json:"slideshow" yaml:"slideshow"`
|
||||
}
|
||||
|
||||
func (r *slideShowResponse) SetHttpResponse(resp *http.Response) {
|
||||
r.Resp = resp
|
||||
}
|
||||
|
||||
func (r *slideShowResponse) SetBytes(bytes []byte) {
|
||||
r.bytes = bytes
|
||||
}
|
||||
|
||||
func (r *slideShowResponse) SetReader(reader io.ReadCloser) {
|
||||
r.Body = reader
|
||||
}
|
||||
|
||||
func (r *slideShowResponse) SetStatusCode(status int) {
|
||||
r.StatusCode = status
|
||||
}
|
||||
|
||||
func (r *slideShowResponse) SetHeader(header map[string][]string) {
|
||||
r.Header = header
|
||||
}
|
||||
|
||||
func (r *slideShowResponse) String() string {
|
||||
return string(r.bytes)
|
||||
}
|
||||
|
||||
type slideshow struct {
|
||||
XMLName xml.Name `xml:"slideshow"`
|
||||
|
||||
@ -51,8 +80,32 @@ type slide struct {
|
||||
Title string `json:"title" yaml:"title" xml:"title"`
|
||||
}
|
||||
|
||||
func (s *slideSshowResponse) SetHttpResponse(resp *http.Response) {
|
||||
s.Resp = resp
|
||||
func TestClient_handleCarrier(t *testing.T) {
|
||||
v := "beego"
|
||||
client, err := NewClient("test", "http://httpbin.org/",
|
||||
WithUserAgent(v))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var s = &slideShowResponse{}
|
||||
err = client.Get(s, "/json")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer s.Body.Close()
|
||||
|
||||
assert.NotNil(t, s.Resp)
|
||||
assert.NotNil(t, s.Body)
|
||||
assert.Equal(t, "429", s.Header["Content-Length"][0])
|
||||
assert.Equal(t, 200, s.StatusCode)
|
||||
|
||||
b, err := ioutil.ReadAll(s.Body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
assert.Equal(t, 429, len(b))
|
||||
assert.Equal(t, s.String(), string(b))
|
||||
}
|
||||
|
||||
func TestClient_Get(t *testing.T) {
|
||||
@ -62,7 +115,7 @@ func TestClient_Get(t *testing.T) {
|
||||
}
|
||||
|
||||
// json
|
||||
var s *slideSshowResponse
|
||||
var s *slideShowResponse
|
||||
err = client.Get(&s, "/json")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -99,7 +152,7 @@ func TestClient_Post(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var resp = &slideSshowResponse{}
|
||||
var resp = &slideShowResponse{}
|
||||
err = client.Get(resp, "/json")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -120,7 +173,7 @@ func TestClient_Put(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var resp = &slideSshowResponse{}
|
||||
var resp = &slideShowResponse{}
|
||||
err = client.Get(resp, "/json")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -141,7 +194,7 @@ func TestClient_Delete(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var resp = &slideSshowResponse{}
|
||||
var resp = &slideShowResponse{}
|
||||
err = client.Delete(resp, "/delete")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@ -156,7 +209,7 @@ func TestClient_Head(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
var resp = &slideSshowResponse{}
|
||||
var resp = &slideShowResponse{}
|
||||
err = client.Head(resp, "")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user