Compare commits

..

10 Commits
v0.0.1 ... main

Author SHA1 Message Date
64787c7cb0 refactored HTTP header handling 2025-02-13 16:23:51 +01:00
b68c93e092 implemented RemoveAllHeaders 2025-02-13 16:20:22 +01:00
767b660a22 fixed HTTP auth header name 2025-02-12 13:22:24 +01:00
6142a1100c remove old auth header on Auth() call 2025-02-11 12:45:20 +01:00
9babe85048 RemoveQuery implemented 2025-02-11 12:38:33 +01:00
b59185d56c RemoveHeaders implemented 2025-02-11 12:30:35 +01:00
1c3a45729b fixed status check 2025-02-02 20:06:45 +01:00
f5ff99a2a8 ParseJsonResponse returns error based on status code 2025-02-02 20:02:13 +01:00
d144bb5a47 Update go.mod 2024-12-16 19:43:10 +01:00
Milarin
0b3e33c392 removed err value 2024-09-11 19:19:00 +02:00
5 changed files with 83 additions and 10 deletions

23
do.go
View File

@ -2,6 +2,7 @@ package ezhttp
import ( import (
"encoding/json" "encoding/json"
"fmt"
"io" "io"
"net/http" "net/http"
) )
@ -10,10 +11,28 @@ func Do(req *http.Request) (*http.Response, error) {
return http.DefaultClient.Do(req) return http.DefaultClient.Do(req)
} }
func ParseJsonResponse[T any](r io.Reader) (*T, error) { func ParseJsonResponse[T any](resp *http.Response) (*T, error) {
if resp.StatusCode/100 != 2 {
return nil, fmt.Errorf(
"request '%s' returned status code %s\nOutput: %s",
resp.Request.URL.String(),
resp.Status,
ReadAllString(resp.Body),
)
}
res := new(T) res := new(T)
if err := json.NewDecoder(r).Decode(res); err != nil { if err := json.NewDecoder(resp.Body).Decode(res); err != nil {
return nil, err return nil, err
} }
return res, nil return res, nil
} }
func ReadAllString(r io.Reader) string {
data, err := io.ReadAll(r)
if err != nil {
return fmt.Errorf("could not read response body: %w", err).Error()
}
return string(data)
}

2
go.mod
View File

@ -1,3 +1,3 @@
module git.milar.in/milarin/ezhttp module git.tordarus.net/tordarus/ezhttp
go 1.23.0 go 1.23.0

View File

@ -15,7 +15,7 @@ type ValueProvider[T any] func() T
type AuthProvider ValueProvider[string] type AuthProvider ValueProvider[string]
type RequestBodyProvider func() (io.Reader, string) type RequestBodyProvider func() (io.Reader, string)
func Request(mods ...RequestModifier) (*http.Request, error) { func Request(mods ...RequestModifier) *http.Request {
r := NewRequestBuilder() r := NewRequestBuilder()
for _, mod := range mods { for _, mod := range mods {
r = mod(r) r = mod(r)
@ -92,6 +92,17 @@ func Query(keyValuePairs ...string) RequestModifier {
} }
} }
func RemoveQuery(keys ...string) RequestModifier {
return func(r *RequestBuilder) *RequestBuilder {
q := r.URL.Query()
for _, key := range keys {
q.Del(key)
}
r.URL.RawQuery = q.Encode()
return r
}
}
func QueryMap(query map[string]string) RequestModifier { func QueryMap(query map[string]string) RequestModifier {
return func(r *RequestBuilder) *RequestBuilder { return func(r *RequestBuilder) *RequestBuilder {
q := r.URL.Query() q := r.URL.Query()
@ -110,7 +121,7 @@ func Method(method string) RequestModifier {
} }
} }
func Headers(keyValuePairs ...string) RequestModifier { func AddHeaders(keyValuePairs ...string) RequestModifier {
if len(keyValuePairs)%2 != 0 { if len(keyValuePairs)%2 != 0 {
panic("keyValuePairs must have an even length") panic("keyValuePairs must have an even length")
} }
@ -123,7 +134,30 @@ func Headers(keyValuePairs ...string) RequestModifier {
} }
} }
func HeadersMap(headers map[string]string) RequestModifier { func RemoveHeaders(headers ...string) RequestModifier {
return func(r *RequestBuilder) *RequestBuilder {
for _, header := range headers {
r.Header.Del(header)
}
return r
}
}
func RemoveAllHeaders() RequestModifier {
return func(r *RequestBuilder) *RequestBuilder {
r.Header = make(http.Header)
return r
}
}
func Headers(keyValuePairs ...string) RequestModifier {
return chainMods(
RemoveAllHeaders(),
AddHeaders(keyValuePairs...),
)
}
func AddHeadersMap(headers map[string]string) RequestModifier {
return func(r *RequestBuilder) *RequestBuilder { return func(r *RequestBuilder) *RequestBuilder {
for key, value := range headers { for key, value := range headers {
r.Header.Add(key, value) r.Header.Add(key, value)
@ -132,8 +166,18 @@ func HeadersMap(headers map[string]string) RequestModifier {
} }
} }
func HeadersMap(headers map[string]string) RequestModifier {
return chainMods(
RemoveAllHeaders(),
AddHeadersMap(headers),
)
}
func Auth(auth AuthProvider) RequestModifier { func Auth(auth AuthProvider) RequestModifier {
return Headers("Authentication", auth()) return chainMods(
RemoveHeaders("Authorization"),
AddHeaders("Authorization", auth()),
)
} }
func Basic(username, password string) AuthProvider { func Basic(username, password string) AuthProvider {

View File

@ -30,12 +30,12 @@ func NewRequestBuilderFromRequest(r *http.Request) *RequestBuilder {
} }
} }
func (b *RequestBuilder) Build() (*http.Request, error) { func (b *RequestBuilder) Build() *http.Request {
r, err := http.NewRequest(b.Method, b.URL.String(), b.Body) r, err := http.NewRequest(b.Method, b.URL.String(), b.Body)
if err != nil { if err != nil {
return nil, err return nil
} }
r.Header = b.Header r.Header = b.Header
return r, nil return r
} }

10
utils.go Normal file
View File

@ -0,0 +1,10 @@
package ezhttp
func chainMods(mods ...RequestModifier) RequestModifier {
return func(r *RequestBuilder) *RequestBuilder {
for _, mod := range mods {
r = mod(r)
}
return r
}
}