package transport import ( "net/http" "strings" ghcontext "github.com/github/github-mcp-server/pkg/context" headers "github.com/github/github-mcp-server/pkg/http/headers" ) type BearerAuthTransport struct { Transport http.RoundTripper Token string // TokenProvider, when non-nil, supplies the bearer token for each request // and takes precedence over Token. It backs OAuth, where the token is // obtained after the client is built and is refreshed over the session's // lifetime. It may return an empty string before authorization completes. TokenProvider func() string } func (t *BearerAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) { req = req.Clone(req.Context()) token := t.Token if t.TokenProvider != nil { token = t.TokenProvider() } // Before OAuth authorization completes the token is empty; send an // unauthenticated request rather than an empty "Bearer " header. if token != "" { req.Header.Set(headers.AuthorizationHeader, "Bearer "+token) } // Check for GraphQL-Features in context and add header if present if features := ghcontext.GetGraphQLFeatures(req.Context()); len(features) > 0 { req.Header.Set(headers.GraphQLFeaturesHeader, strings.Join(features, ", ")) } return t.Transport.RoundTrip(req) }