Skip to content

Commit 8fac68a

Browse files
committed
Allow User-Agent header to be overwritten
This commit allows users to overwrite the `User-Agent` header. It will still default to: ``` "elastic/"+Version+" ("+runtime.GOOS+"-"+runtime.GOARCH+")" ``` Close #1438
1 parent f8c60b0 commit 8fac68a

File tree

5 files changed

+69
-18
lines changed

5 files changed

+69
-18
lines changed

client.go

+14-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"net/http/httputil"
1515
"net/url"
1616
"os"
17+
"runtime"
1718
"strings"
1819
"sync"
1920
"time"
@@ -983,6 +984,10 @@ func (c *Client) sniffNode(ctx context.Context, url string) []*conn {
983984
}
984985
c.mu.RUnlock()
985986

987+
if req.Header.Get("User-Agent") == "" {
988+
req.Header.Add("User-Agent", "elastic/"+Version+" ("+runtime.GOOS+"-"+runtime.GOARCH+")")
989+
}
990+
986991
res, err := c.c.Do((*http.Request)(req).WithContext(ctx))
987992
if err != nil {
988993
return nodes
@@ -1126,6 +1131,9 @@ func (c *Client) healthcheck(parentCtx context.Context, timeout time.Duration, f
11261131
}
11271132
}
11281133
}
1134+
if req.Header.Get("User-Agent") == "" {
1135+
req.Header.Add("User-Agent", "elastic/"+Version+" ("+runtime.GOOS+"-"+runtime.GOARCH+")")
1136+
}
11291137
res, err := c.c.Do((*http.Request)(req).WithContext(ctx))
11301138
if res != nil {
11311139
status = res.StatusCode
@@ -1387,11 +1395,9 @@ func (c *Client) PerformRequest(ctx context.Context, opt PerformRequestOptions)
13871395
if opt.ContentType != "" {
13881396
req.Header.Set("Content-Type", opt.ContentType)
13891397
}
1390-
if len(opt.Headers) > 0 {
1391-
for key, value := range opt.Headers {
1392-
for _, v := range value {
1393-
req.Header.Add(key, v)
1394-
}
1398+
for key, value := range opt.Headers {
1399+
for _, v := range value {
1400+
req.Header.Add(key, v)
13951401
}
13961402
}
13971403
if len(defaultHeaders) > 0 {
@@ -1401,6 +1407,9 @@ func (c *Client) PerformRequest(ctx context.Context, opt PerformRequestOptions)
14011407
}
14021408
}
14031409
}
1410+
if req.Header.Get("User-Agent") == "" {
1411+
req.Header.Set("User-Agent", "elastic/"+Version+" ("+runtime.GOOS+"-"+runtime.GOARCH+")")
1412+
}
14041413

14051414
// Set body
14061415
if opt.Body != nil {

client_test.go

+42-4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"net/url"
1818
"reflect"
1919
"regexp"
20+
"runtime"
2021
"strings"
2122
"sync"
2223
"testing"
@@ -1716,7 +1717,40 @@ func TestPerformRequestWithCustomHTTPHeadersOnClient(t *testing.T) {
17161717
}
17171718
// Request-level headers have preference
17181719
if want, have := "123456", res.Header.Get("X-Opaque-Id"); want != have {
1719-
t.Fatalf("want response header X-Opaque-Id=%q, have %q", want, have)
1720+
t.Fatalf("want X-Opaque-Id=%q, have %q", want, have)
1721+
}
1722+
}
1723+
1724+
func TestPerformRequestSetsDefaultUserAgent(t *testing.T) {
1725+
var req *http.Request
1726+
h := func(r *http.Request) (*http.Response, error) {
1727+
req = new(http.Request)
1728+
*req = *r
1729+
return &http.Response{Request: r, StatusCode: http.StatusOK, Body: http.NoBody}, nil
1730+
}
1731+
tr := &failingTransport{path: "/", fail: h}
1732+
httpClient := &http.Client{Transport: tr}
1733+
1734+
client, err := NewClient(SetHttpClient(httpClient), SetSniff(false), SetHealthcheck(false))
1735+
if err != nil {
1736+
t.Fatal(err)
1737+
}
1738+
res, err := client.PerformRequest(context.TODO(), PerformRequestOptions{
1739+
Method: "GET",
1740+
Path: "/",
1741+
Params: url.Values{
1742+
"pretty": []string{"true"},
1743+
},
1744+
})
1745+
if err != nil {
1746+
t.Fatal(err)
1747+
}
1748+
if res == nil {
1749+
t.Fatal("expected response to be != nil")
1750+
}
1751+
// Have a default for User-Agent
1752+
if want, have := "elastic/"+Version+" ("+runtime.GOOS+"-"+runtime.GOARCH+")", req.Header.Get("User-Agent"); want != have {
1753+
t.Fatalf("want User-Agent=%q, have %q", want, have)
17201754
}
17211755
}
17221756

@@ -1732,6 +1766,7 @@ func TestPerformRequestWithCustomHTTPHeadersPriority(t *testing.T) {
17321766

17331767
client, err := NewClient(SetHttpClient(httpClient), SetHeaders(http.Header{
17341768
"Custom-Id": []string{"olivere"},
1769+
"User-Agent": []string{"My user agent"},
17351770
"X-Opaque-Id": []string{"sandra"}, // <- will be overridden by request-level header
17361771
}), SetSniff(false), SetHealthcheck(false))
17371772
if err != nil {
@@ -1758,13 +1793,16 @@ func TestPerformRequestWithCustomHTTPHeadersPriority(t *testing.T) {
17581793
t.Fatal("expected to record HTTP request")
17591794
}
17601795
if want, have := "123456", req.Header.Get("X-Opaque-Id"); want != have {
1761-
t.Fatalf("want HTTP header X-Opaque-Id=%q, have %q", want, have)
1796+
t.Fatalf("want X-Opaque-Id=%q, have %q", want, have)
17621797
}
17631798
if want, have := "olivere", req.Header.Get("Custom-Id"); want != have {
1764-
t.Fatalf("want HTTP header Custom-Id=%q, have %q", want, have)
1799+
t.Fatalf("want Custom-Id=%q, have %q", want, have)
1800+
}
1801+
if want, have := "My user agent", req.Header.Get("User-Agent"); want != have {
1802+
t.Fatalf("want User-Agent=%q, have %q", want, have)
17651803
}
17661804
if want, have := "somewhat", req.Header.Get("X-Somewhat"); want != have {
1767-
t.Fatalf("want HTTP header X-Somewhat=%q, have %q", want, have)
1805+
t.Fatalf("want X-Somewhat=%q, have %q", want, have)
17681806
}
17691807
}
17701808

ping.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"fmt"
1111
"net/http"
1212
"net/url"
13+
"runtime"
1314
"strings"
1415
)
1516

@@ -160,11 +161,9 @@ func (s *PingService) Do(ctx context.Context) (*PingResult, int, error) {
160161
if err != nil {
161162
return nil, 0, err
162163
}
163-
if len(s.headers) > 0 {
164-
for key, values := range s.headers {
165-
for _, v := range values {
166-
req.Header.Add(key, v)
167-
}
164+
for key, values := range s.headers {
165+
for _, v := range values {
166+
req.Header.Add(key, v)
168167
}
169168
}
170169
if len(defaultHeaders) > 0 {
@@ -179,6 +178,10 @@ func (s *PingService) Do(ctx context.Context) (*PingResult, int, error) {
179178
req.SetBasicAuth(basicAuthUsername, basicAuthPassword)
180179
}
181180

181+
if req.Header.Get("User-Agent") == "" {
182+
req.Header.Add("User-Agent", "elastic/"+Version+" ("+runtime.GOOS+"-"+runtime.GOARCH+")")
183+
}
184+
182185
res, err := s.client.c.Do((*http.Request)(req).WithContext(ctx))
183186
if err != nil {
184187
return nil, 0, err

request.go

-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"io"
1212
"io/ioutil"
1313
"net/http"
14-
"runtime"
1514
"strings"
1615
)
1716

@@ -24,7 +23,6 @@ func NewRequest(method, url string) (*Request, error) {
2423
if err != nil {
2524
return nil, err
2625
}
27-
req.Header.Add("User-Agent", "elastic/"+Version+" ("+runtime.GOOS+"-"+runtime.GOARCH+")")
2826
req.Header.Add("Accept", "application/json")
2927
req.Header.Set("Content-Type", "application/json")
3028
return (*Request)(req), nil

request_test.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ func TestRequestSetContentType(t *testing.T) {
1414
t.Fatal(err)
1515
}
1616
if want, have := "application/json", req.Header.Get("Content-Type"); want != have {
17-
t.Fatalf("want %q, have %q", want, have)
17+
t.Fatalf("want Content-Type=%q, have %q", want, have)
1818
}
1919
req.Header.Set("Content-Type", "application/x-ndjson")
2020
if want, have := "application/x-ndjson", req.Header.Get("Content-Type"); want != have {
21-
t.Fatalf("want %q, have %q", want, have)
21+
t.Fatalf("want Content-Type=%q, have %q", want, have)
22+
}
23+
if want, have := "", req.Header.Get("User-Agent"); want != have {
24+
t.Fatalf("want User-Agent=%q, have %q", want, have)
2225
}
2326
}
2427

0 commit comments

Comments
 (0)