From 389f7b5a7764e3d0ca050d440393daadac8d176d Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Thu, 28 Nov 2019 18:22:38 +0000 Subject: web: move useragent to its own package --- web/useragent/user_agent.go | 43 ++++++++++++++++++++++++++++++++++++++++ web/useragent/user_agent_test.go | 12 +++++++++++ 2 files changed, 55 insertions(+) create mode 100644 web/useragent/user_agent.go create mode 100644 web/useragent/user_agent_test.go (limited to 'web/useragent') diff --git a/web/useragent/user_agent.go b/web/useragent/user_agent.go new file mode 100644 index 0000000..0f521c9 --- /dev/null +++ b/web/useragent/user_agent.go @@ -0,0 +1,43 @@ +package useragent + +import ( + "fmt" + "net/http" + "os" + "runtime" +) + +var ( + hostname = "" +) + +func init() { + name, _ := os.Hostname() + if name != "" { + hostname = name + } +} + +// GenUserAgent creates a unique User-Agent string for outgoing HTTP requests. +func GenUserAgent(prefix, infoURL string) string { + return fmt.Sprintf( + "%s (%s/%s/%s; %s; +%s) Hostname/%s", + prefix, runtime.Version(), runtime.GOOS, runtime.GOARCH, infoURL, + os.Args[0], hostname, + ) +} + +// Transport wraps a http transport with user agent information. +func Transport(prefix, infoURL string, rt http.RoundTripper) http.RoundTripper { + return userAgentTransport{prefix: prefix, rt: rt} +} + +type userAgentTransport struct { + prefix, infoURL string + rt http.RoundTripper +} + +func (uat userAgentTransport) RoundTrip(r *http.Request) (*http.Response, error) { + r.Header.Set("User-Agent", GenUserAgent(uat.prefix)) + return uat.rt.RoundTrip(r) +} diff --git a/web/useragent/user_agent_test.go b/web/useragent/user_agent_test.go new file mode 100644 index 0000000..702bcf7 --- /dev/null +++ b/web/useragent/user_agent_test.go @@ -0,0 +1,12 @@ +package useragent + +import "testing" + +func TestGenUserAgent(t *testing.T) { + ua := GenUserAgent() + if ua == "" { + t.Fatal("no user agent generated") + } + + t.Log(ua) +} -- cgit v1.2.3