Coffee journaling on ATProto (alpha) alpha.arabica.social
coffee
17
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: descriptive user-agent in PDS requests

+22 -2
+21 -1
internal/atproto/client.go
··· 14 14 "tangled.org/pdewey.com/atp" 15 15 ) 16 16 17 + // userAgent is prepended to the User-Agent header on all PDS requests so 18 + // arabica traffic is identifiable in server logs. 19 + const userAgent = "Arabica (+https://alpha.arabica.social; abuse@mail.arabica.systems)" 20 + 21 + // userAgentTransport wraps an http.RoundTripper and prepends a custom 22 + // User-Agent string to every outgoing request. 23 + type userAgentTransport struct { 24 + base http.RoundTripper 25 + } 26 + 27 + func (t *userAgentTransport) RoundTrip(req *http.Request) (*http.Response, error) { 28 + r := req.Clone(req.Context()) 29 + if existing := r.Header.Get("User-Agent"); existing != "" { 30 + r.Header.Set("User-Agent", userAgent+" "+existing) 31 + } else { 32 + r.Header.Set("User-Agent", userAgent) 33 + } 34 + return t.base.RoundTrip(r) 35 + } 36 + 17 37 // ErrSessionExpired is returned when the OAuth session cannot be resumed. 18 38 var ErrSessionExpired = atp.ErrSessionExpired 19 39 ··· 58 78 baseTransport = http.DefaultTransport 59 79 } 60 80 apiClient.Client = &http.Client{ 61 - Transport: otelhttp.NewTransport(baseTransport), 81 + Transport: &userAgentTransport{base: otelhttp.NewTransport(baseTransport)}, 62 82 Timeout: apiClient.Client.Timeout, 63 83 CheckRedirect: apiClient.Client.CheckRedirect, 64 84 Jar: apiClient.Client.Jar,
+1 -1
internal/atproto/public_client.go
··· 24 24 func NewPublicClient() *PublicClient { 25 25 hc := &http.Client{ 26 26 Timeout: 30 * time.Second, 27 - Transport: otelhttp.NewTransport(http.DefaultTransport), 27 + Transport: &userAgentTransport{base: otelhttp.NewTransport(http.DefaultTransport)}, 28 28 } 29 29 return &PublicClient{inner: atp.NewPublicClientWithHTTP(hc)} 30 30 }