add more carrier

This commit is contained in:
holooooo 2021-05-22 14:58:40 +08:00
parent b0d6f3bd2f
commit 4b1619b105
3 changed files with 94 additions and 37 deletions

View File

@ -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) {

View File

@ -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

View File

@ -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)