You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
// Copyright 2018 Drone.IO Inc. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package oauth2
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"git.awesome-for.me/liuzhiguo/go-scm/scm"
|
|
"git.awesome-for.me/liuzhiguo/go-scm/scm/transport/internal"
|
|
)
|
|
|
|
// Supported authentication schemes. Note that Gogs and
|
|
// Gitea use non-standard authorization schemes.
|
|
const (
|
|
SchemeBearer = "Bearer"
|
|
SchemeToken = "token"
|
|
)
|
|
|
|
// Transport is an http.RoundTripper that refreshes oauth
|
|
// tokens, wrapping a base RoundTripper and refreshing the
|
|
// token if expired.
|
|
type Transport struct {
|
|
Scheme string
|
|
Source scm.TokenSource
|
|
Base http.RoundTripper
|
|
}
|
|
|
|
// RoundTrip authorizes and authenticates the request with
|
|
// an access token from the request context.
|
|
func (t *Transport) RoundTrip(r *http.Request) (*http.Response, error) {
|
|
ctx := r.Context()
|
|
token, err := t.Source.Token(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if token == nil {
|
|
return t.base().RoundTrip(r)
|
|
}
|
|
r2 := internal.CloneRequest(r)
|
|
r2.Header.Set("Authorization", t.scheme()+" "+token.Token)
|
|
return t.base().RoundTrip(r2)
|
|
}
|
|
|
|
// base returns the base transport. If no base transport
|
|
// is configured, the default transport is returned.
|
|
func (t *Transport) base() http.RoundTripper {
|
|
if t.Base != nil {
|
|
return t.Base
|
|
}
|
|
return http.DefaultTransport
|
|
}
|
|
|
|
// scheme returns the token scheme. If no scheme is
|
|
// configured, the bearer scheme is used.
|
|
func (t *Transport) scheme() string {
|
|
if t.Scheme == "" {
|
|
return SchemeBearer
|
|
}
|
|
return t.Scheme
|
|
}
|