Disable telemetry for GHES

This commit is contained in:
William Martin 2026-04-15 14:55:35 +02:00
parent 18dc5e77f0
commit 3ed389d664
23 changed files with 920 additions and 656 deletions

View file

@ -7,6 +7,7 @@ import (
"strings"
"time"
"github.com/cli/cli/v2/internal/gh/ghtelemetry"
"github.com/cli/cli/v2/utils"
ghAPI "github.com/cli/go-gh/v2/pkg/api"
ghauth "github.com/cli/go-gh/v2/pkg/auth"
@ -26,6 +27,7 @@ type HTTPClientOptions struct {
LogColorize bool
LogVerboseHTTP bool
SkipDefaultHeaders bool
TelemetryDisabler ghtelemetry.Disabler
}
func NewHTTPClient(opts HTTPClientOptions) (*http.Client, error) {
@ -74,6 +76,13 @@ func NewHTTPClient(opts HTTPClientOptions) (*http.Client, error) {
client.Transport = AddAuthTokenHeader(client.Transport, opts.Config)
}
if opts.TelemetryDisabler != nil {
client.Transport = telemetryDisablerTransport{
wrappedTransport: client.Transport,
telemetryDisabler: opts.TelemetryDisabler,
}
}
return client, nil
}
@ -147,3 +156,15 @@ func getHost(r *http.Request) string {
}
return r.URL.Host
}
type telemetryDisablerTransport struct {
wrappedTransport http.RoundTripper
telemetryDisabler ghtelemetry.Disabler
}
func (t telemetryDisablerTransport) RoundTrip(req *http.Request) (*http.Response, error) {
if ghauth.IsEnterprise(getHost(req)) {
t.telemetryDisabler.Disable()
}
return t.wrappedTransport.RoundTrip(req)
}

View file

@ -315,6 +315,80 @@ func TestHTTPClientSanitizeControlCharactersC1(t *testing.T) {
assert.Equal(t, "monalisa¡", issue.Author.Login)
}
func TestNewHTTPClientTelemetryDisabler(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNoContent)
}))
defer ts.Close()
tests := []struct {
name string
host string
wantDisabled bool
}{
{
name: "enterprise host triggers disable",
host: "ghes.example.com",
wantDisabled: true,
},
{
name: "github.com does not trigger disable",
host: "github.com",
wantDisabled: false,
},
{
name: "tenancy host does not trigger disable",
host: "my-company.ghe.com",
wantDisabled: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
disabler := &fakeTelemetryDisabler{}
client, err := NewHTTPClient(HTTPClientOptions{
TelemetryDisabler: disabler,
})
require.NoError(t, err)
req, err := http.NewRequest("GET", ts.URL, nil)
require.NoError(t, err)
req.Host = tt.host
res, err := client.Do(req)
require.NoError(t, err)
assert.Equal(t, 204, res.StatusCode)
assert.Equal(t, tt.wantDisabled, disabler.disabled, "Disable() called")
})
}
}
func TestNewHTTPClientWithoutTelemetryDisabler(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNoContent)
}))
defer ts.Close()
client, err := NewHTTPClient(HTTPClientOptions{})
require.NoError(t, err)
req, err := http.NewRequest("GET", ts.URL, nil)
require.NoError(t, err)
req.Host = "ghes.example.com"
res, err := client.Do(req)
require.NoError(t, err)
assert.Equal(t, 204, res.StatusCode)
}
type fakeTelemetryDisabler struct {
disabled bool
}
func (f *fakeTelemetryDisabler) Disable() {
f.disabled = true
}
type tinyConfig map[string]string
func (c tinyConfig) ActiveToken(host string) (string, string) {