From 21d6e576bc3d0c3d18420ab37ff3dfc90d155530 Mon Sep 17 00:00:00 2001 From: Wito Chandra Date: Sun, 8 Nov 2020 17:57:28 +0700 Subject: [PATCH] support http head --- httpclient/client.go | 12 ++++++++++++ httpclient/client_test.go | 26 ++++++++++++++++++++++++++ hystrix/hystrix_client.go | 12 ++++++++++++ hystrix/hystrix_client_test.go | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+) diff --git a/httpclient/client.go b/httpclient/client.go index 5f03c5b..188e7aa 100644 --- a/httpclient/client.go +++ b/httpclient/client.go @@ -120,6 +120,18 @@ func (c *Client) Delete(url string, headers http.Header) (*http.Response, error) return c.Do(request) } +// Head makes a HTTP HEAD request with provided URL +func (c *Client) Head(url string, headers http.Header) (*http.Response, error) { + request, err := http.NewRequest(http.MethodHead, url, nil) + if err != nil { + return nil, errors.Wrap(err, "HEAD - request creation failed") + } + + request.Header = headers + + return c.Do(request) +} + // Do makes an HTTP request with the native `http.Do` interface func (c *Client) Do(request *http.Request) (*http.Response, error) { request.Close = true diff --git a/httpclient/client_test.go b/httpclient/client_test.go index dbca35d..7cbc6e0 100644 --- a/httpclient/client_test.go +++ b/httpclient/client_test.go @@ -131,6 +131,32 @@ func TestHTTPClientDeleteSuccess(t *testing.T) { assert.Equal(t, "{ \"response\": \"ok\" }", respBody(t, response)) } +func TestHTTPClientHeadSuccess(t *testing.T) { + client := NewClient(WithHTTPTimeout(10 * time.Millisecond)) + + dummyHandler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodHead, r.Method) + assert.Equal(t, "application/json", r.Header.Get("Content-Type")) + assert.Equal(t, "en", r.Header.Get("Accept-Language")) + + w.Header().Add("x-foo", "bar") + w.WriteHeader(http.StatusOK) + } + + server := httptest.NewServer(http.HandlerFunc(dummyHandler)) + defer server.Close() + + headers := http.Header{} + headers.Set("Content-Type", "application/json") + headers.Set("Accept-Language", "en") + + response, err := client.Head(server.URL, headers) + require.NoError(t, err, "should not have failed to make a HEAD request") + + assert.Equal(t, http.StatusOK, response.StatusCode) + assert.Equal(t, "bar", response.Header.Get("x-foo")) +} + func TestHTTPClientPutSuccess(t *testing.T) { client := NewClient(WithHTTPTimeout(10 * time.Millisecond)) diff --git a/hystrix/hystrix_client.go b/hystrix/hystrix_client.go index 01c0ca3..513b2a8 100644 --- a/hystrix/hystrix_client.go +++ b/hystrix/hystrix_client.go @@ -165,6 +165,18 @@ func (hhc *Client) Delete(url string, headers http.Header) (*http.Response, erro return hhc.Do(request) } +// Head makes a HTTP HEAD request with provided URL +func (hhc *Client) Head(url string, headers http.Header) (*http.Response, error) { + request, err := http.NewRequest(http.MethodHead, url, nil) + if err != nil { + return nil, errors.Wrap(err, "HEAD - request creation failed") + } + + request.Header = headers + + return hhc.Do(request) +} + // Do makes an HTTP request with the native `http.Do` interface func (hhc *Client) Do(request *http.Request) (*http.Response, error) { var response *http.Response diff --git a/hystrix/hystrix_client_test.go b/hystrix/hystrix_client_test.go index 65a7bbd..e49c92f 100644 --- a/hystrix/hystrix_client_test.go +++ b/hystrix/hystrix_client_test.go @@ -171,6 +171,40 @@ func TestHystrixHTTPClientDeleteSuccess(t *testing.T) { assert.Equal(t, "{ \"response\": \"ok\" }", respBody(t, response)) } +func TestHystrixHTTPClientHeadSuccess(t *testing.T) { + client := NewClient( + WithHTTPTimeout(10*time.Millisecond), + WithCommandName("head_command"), + WithHystrixTimeout(10*time.Millisecond), + WithMaxConcurrentRequests(100), + WithErrorPercentThreshold(10), + WithSleepWindow(100), + WithRequestVolumeThreshold(10), + ) + + dummyHandler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, http.MethodHead, r.Method) + assert.Equal(t, "application/json", r.Header.Get("Content-Type")) + assert.Equal(t, "en", r.Header.Get("Accept-Language")) + + w.Header().Add("x-foo", "bar") + w.WriteHeader(http.StatusOK) + } + + server := httptest.NewServer(http.HandlerFunc(dummyHandler)) + defer server.Close() + + headers := http.Header{} + headers.Set("Content-Type", "application/json") + headers.Set("Accept-Language", "en") + + response, err := client.Head(server.URL, headers) + require.NoError(t, err, "should not have failed to make a HEAD request") + + assert.Equal(t, http.StatusOK, response.StatusCode) + assert.Equal(t, "bar", response.Header.Get("x-foo")) +} + func TestHystrixHTTPClientPutSuccess(t *testing.T) { client := NewClient( WithHTTPTimeout(10*time.Millisecond),