Skip to content

Commit

Permalink
👔 up: httpreq - add new util func MergeURLValues()
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Jun 25, 2023
1 parent db84b60 commit d2fc75f
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 0 deletions.
8 changes: 8 additions & 0 deletions netutil/httpreq/respx.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ type RespX struct {
CostTime int64
}

// WrapResp wrap http.Response to RespX
func WrapResp(hr *http.Response, err error) (*RespX, error) {
if err != nil {
return nil, err
}
return &RespX{Response: hr}, nil
}

// NewResp instance
func NewResp(hr *http.Response) *RespX {
return &RespX{Response: hr}
Expand Down
16 changes: 16 additions & 0 deletions netutil/httpreq/respx_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,19 @@ func TestRespX_String(t *testing.T) {
// fmt.Println(s)
assert.StrContains(t, s, `"hi"`)
}

func TestWrapResp(t *testing.T) {
rx, err := httpreq.WrapResp(httpreq.Get(testSrvAddr + "/get"))
assert.NoErr(t, err)
assert.NotNil(t, rx)
assert.Equal(t, 200, rx.StatusCode)
assert.True(t, rx.IsOk())
assert.True(t, rx.IsSuccessful())
assert.False(t, rx.IsFail())
assert.False(t, rx.IsEmptyBody())
assert.Equal(t, httpctype.JSON, rx.ContentType())

s := rx.String()
fmt.Println(s)
assert.StrContains(t, s, "GET")
}
51 changes: 51 additions & 0 deletions netutil/httpreq/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"net/url"
"strings"

"github.com/gookit/goutil/arrutil"
"github.com/gookit/goutil/netutil/httpctype"
"github.com/gookit/goutil/strutil"
)
Expand Down Expand Up @@ -96,8 +97,25 @@ func AddHeaders(req *http.Request, header http.Header) {
}
}

// SetHeaders sets the key, value pairs from the given http.Header to the
// request. Values for existing keys are overwritten.
func SetHeaders(req *http.Request, headers ...http.Header) {
for _, header := range headers {
for key, values := range header {
req.Header[key] = values
}
}
}

// AddHeaderMap to reqeust instance.
func AddHeaderMap(req *http.Request, headerMap map[string]string) {
for k, v := range headerMap {
req.Header.Add(k, v)
}
}

// SetHeaderMap to reqeust instance.
func SetHeaderMap(req *http.Request, headerMap map[string]string) {
for k, v := range headerMap {
req.Header.Set(k, v)
}
Expand Down Expand Up @@ -127,6 +145,7 @@ func MakeQuery(data any) url.Values {
// - url.Values
// - []byte
// - string
// - map[string][]string
// - map[string]string
// - map[string]any
func ToQueryValues(data any) url.Values {
Expand Down Expand Up @@ -162,6 +181,38 @@ func ToQueryValues(data any) url.Values {
return uv
}

// MergeURLValues merge url.Values by overwrite.
//
// values support: url.Values, map[string]string, map[string][]string
func MergeURLValues(uv url.Values, values ...any) url.Values {
if uv == nil {
uv = make(url.Values)
}

for _, v := range values {
switch tv := v.(type) {
case url.Values:
for k, vs := range tv {
uv[k] = vs
}
case map[string]any:
for k, v := range tv {
uv[k] = arrutil.AnyToStrings(v)
}
case map[string]string:
for k, v := range tv {
uv[k] = []string{v}
}
case map[string][]string:
for k, vs := range tv {
uv[k] = vs
}
}
}

return uv
}

// AppendQueryToURL appends the given query string to the given url.
func AppendQueryToURL(reqURL *url.URL, uv url.Values) error {
urlValues, err := url.ParseQuery(reqURL.RawQuery)
Expand Down
16 changes: 16 additions & 0 deletions netutil/httpreq/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package httpreq_test
import (
"io"
"net/http"
"net/url"
"strings"
"testing"

Expand Down Expand Up @@ -110,3 +111,18 @@ func TestResponseToString(t *testing.T) {
assert.StrContains(t, str, "Foo: Bar")
assert.StrContains(t, str, "foo...bar")
}

func TestMergeURLValues(t *testing.T) {
uv := url.Values{"key1": []string{"val1"}}
uv = httpreq.MergeURLValues(uv, url.Values{"key2": []string{"val2"}}, map[string]string{"key3": "val3"}, map[string][]string{
"key4": {"val4"},
})

assert.Eq(t, "val1", uv.Get("key1"))
assert.Eq(t, "val2", uv.Get("key2"))
assert.Eq(t, "val3", uv.Get("key3"))
assert.Eq(t, "val4", uv.Get("key4"))

uv = httpreq.MergeURLValues(nil, url.Values{"key2": []string{"val2"}})
assert.Eq(t, "val2", uv.Get("key2"))
}

0 comments on commit d2fc75f

Please sign in to comment.