aboutsummaryrefslogtreecommitdiff
path: root/web/useragent/user_agent.go
blob: 3e637988def9782791bd1ae5afb72f1ff2f23882 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package useragent

import (
	"fmt"
	"net/http"
	"os"
	"runtime"
)

var (
	hostname = "<unknown>"
)

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, infoURL: infoURL, 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, uat.infoURL))
	return uat.rt.RoundTrip(r)
}