From ae037fddccfd39f0ac7bd28534c1061abe08b798 Mon Sep 17 00:00:00 2001 From: Muhammad Ilham Date: Wed, 1 Sep 2021 15:07:46 +0700 Subject: [PATCH] feat(#432): Implement Easier Adding of Multiple Value HTTP Header Implement easier adding of multiple value HTTP Header with function `SetMultiValueHeaders` --- request.go | 26 ++++++++++++++++++++++++++ request_test.go | 12 ++++++++++++ 2 files changed, 38 insertions(+) diff --git a/request.go b/request.go index 41709cf9..51acabf4 100644 --- a/request.go +++ b/request.go @@ -117,6 +117,32 @@ func (r *Request) SetHeaders(headers map[string]string) *Request { return r } +// SetMultiValueHeaders sets multiple headers fields and its values is list of strings at one go in the current request. +// +// For Example: To set `Accept` as `text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8` +// +// client.R(). +// SetMultiValueHeaders(map[string][]string{ +// "Accept": []string{"text/html", "application/xhtml+xml", "application/xml;q=0.9", "image/webp", "*/*;q=0.8"}, +// }) +// Also you can override header value, which was set at client instance level. +func (r *Request) SetMultiValueHeaders(headers map[string][]string) *Request { + for key, values := range headers { + var headerValue string + + if len(values) > 1 { + headerValue = strings.Join(values, ", ") + } + + if len(values) == 1 { + headerValue = values[0] + } + + r.SetHeader(key, headerValue) + } + return r +} + // SetHeaderVerbatim method is to set a single header field and its value verbatim in the current request. // // For Example: To set `all_lowercase` and `UPPERCASE` as `available`. diff --git a/request_test.go b/request_test.go index 368463ac..ff557aa9 100644 --- a/request_test.go +++ b/request_test.go @@ -1371,6 +1371,18 @@ func TestSetHeaderVerbatim(t *testing.T) { assertEqual(t, "value_standard", r.Header.Get("Header-Lowercase")) } +func TestSetHeaderMultipleValue(t *testing.T) { + ts := createPostServer(t) + defer ts.Close() + + r := dclr(). + SetMultiValueHeaders(map[string][]string{ + "Content": []string{"text/*", "text/html", "*"}, + "Authorization": []string{"Bearer xyz"}, + }) + assertEqual(t, "text/*, text/html, *", r.Header.Get("content")) +} + func TestOutputFileWithBaseDirAndRelativePath(t *testing.T) { ts := createGetServer(t) defer ts.Close()