github.com/lingyao2333/mo-zero@v1.4.1/rest/httpc/responses.go (about)

     1  package httpc
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"net/http"
     7  	"strings"
     8  
     9  	"github.com/lingyao2333/mo-zero/core/mapping"
    10  	"github.com/lingyao2333/mo-zero/rest/internal/encoding"
    11  	"github.com/lingyao2333/mo-zero/rest/internal/header"
    12  )
    13  
    14  // Parse parses the response.
    15  func Parse(resp *http.Response, val interface{}) error {
    16  	if err := ParseHeaders(resp, val); err != nil {
    17  		return err
    18  	}
    19  
    20  	return ParseJsonBody(resp, val)
    21  }
    22  
    23  // ParseHeaders parses the response headers.
    24  func ParseHeaders(resp *http.Response, val interface{}) error {
    25  	return encoding.ParseHeaders(resp.Header, val)
    26  }
    27  
    28  // ParseJsonBody parses the response body, which should be in json content type.
    29  func ParseJsonBody(resp *http.Response, val interface{}) error {
    30  	defer resp.Body.Close()
    31  
    32  	if isContentTypeJson(resp) {
    33  		if resp.ContentLength > 0 {
    34  			return mapping.UnmarshalJsonReader(resp.Body, val)
    35  		}
    36  
    37  		var buf bytes.Buffer
    38  		if _, err := io.Copy(&buf, resp.Body); err != nil {
    39  			return err
    40  		}
    41  
    42  		if buf.Len() > 0 {
    43  			return mapping.UnmarshalJsonReader(&buf, val)
    44  		}
    45  	}
    46  
    47  	return mapping.UnmarshalJsonMap(nil, val)
    48  }
    49  
    50  func isContentTypeJson(r *http.Response) bool {
    51  	return strings.Contains(r.Header.Get(header.ContentType), header.ApplicationJson)
    52  }