chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user