Skip to content
This repository has been archived by the owner on Apr 20, 2021. It is now read-only.

Commit

Permalink
Support for custom http client
Browse files Browse the repository at this point in the history
  • Loading branch information
gambarini committed Jul 2, 2017
1 parent b9842fa commit f017f16
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 21 deletions.
27 changes: 27 additions & 0 deletions .gitignore
@@ -0,0 +1,27 @@
# Compiled Object files, Static and Dynamic libs (Shared Objects)
*.o
*.a
*.so

# Folders
_obj
_test

# Architecture specific extensions/prefixes
*.[568vq]
[568vq].out

*.cgo1.go
*.cgo2.c
_cgo_defun.c
_cgo_gotypes.go
_cgo_export.*

_testmain.go

*.exe
*.test
*.prof

.idea
.DS_Store
114 changes: 93 additions & 21 deletions xerogolang.go
Expand Up @@ -20,6 +20,7 @@ import (
"github.com/markbates/goth/gothic"
"github.com/mrjones/oauth"
"golang.org/x/oauth2"
"crypto"
)

var (
Expand Down Expand Up @@ -49,14 +50,29 @@ type Provider struct {

//newPublicConsumer creates a consumer capable of communicating with a Public application: https://developer.xero.com/documentation/auth-and-limits/public-applications
func (p *Provider) newPublicConsumer(authURL string) *oauth.Consumer {
c := oauth.NewConsumer(
p.ClientKey,
p.Secret,
oauth.ServiceProvider{
RequestTokenUrl: requestURL,
AuthorizeTokenUrl: authURL,
AccessTokenUrl: tokenURL},
)

var c *oauth.Consumer

if p.HTTPClient != nil{
c = oauth.NewCustomHttpClientConsumer(
p.ClientKey,
p.Secret,
oauth.ServiceProvider{
RequestTokenUrl: requestURL,
AuthorizeTokenUrl: authURL,
AccessTokenUrl: tokenURL},
p.HTTPClient,
)
} else {
c = oauth.NewConsumer(
p.ClientKey,
p.Secret,
oauth.ServiceProvider{
RequestTokenUrl: requestURL,
AuthorizeTokenUrl: authURL,
AccessTokenUrl: tokenURL},
)
}

c.Debug(p.debug)

Expand All @@ -76,14 +92,30 @@ func (p *Provider) newPrivateOrPartnerConsumer(authURL string) *oauth.Consumer {
if err != nil {
log.Fatal(err)
}
c := oauth.NewRSAConsumer(
p.ClientKey,
privateKey,
oauth.ServiceProvider{
RequestTokenUrl: requestURL,
AuthorizeTokenUrl: authURL,
AccessTokenUrl: tokenURL},
)

var c *oauth.Consumer

if p.HTTPClient != nil{
c = oauth.NewCustomRSAConsumer(
p.ClientKey,
privateKey,
crypto.SHA1,
oauth.ServiceProvider{
RequestTokenUrl: requestURL,
AuthorizeTokenUrl: authURL,
AccessTokenUrl: tokenURL},
p.HTTPClient,
)
} else {
c = oauth.NewRSAConsumer(
p.ClientKey,
privateKey,
oauth.ServiceProvider{
RequestTokenUrl: requestURL,
AuthorizeTokenUrl: authURL,
AccessTokenUrl: tokenURL},
)
}

c.Debug(p.debug)

Expand Down Expand Up @@ -119,6 +151,31 @@ func New(clientKey, secret, callbackURL string) *Provider {
return p
}

// New creates a new Xero provider, with a custom http client
func NewCustomHTTPClient(clientKey, secret, callbackURL string, httpClient *http.Client) *Provider {
p := &Provider{
ClientKey: clientKey,
Secret: secret,
CallbackURL: callbackURL,

Method: os.Getenv("XERO_METHOD"),
providerName: "xero",
HTTPClient: httpClient,
}

switch p.Method {
case "private":
p.consumer = p.newPrivateOrPartnerConsumer(authorizeURL)
case "public":
p.consumer = p.newPublicConsumer(authorizeURL)
case "partner":
p.consumer = p.newPrivateOrPartnerConsumer(authorizeURL)
default:
p.consumer = p.newPublicConsumer(authorizeURL)
}
return p
}

// Name is the name used to retrieve this provider later.
func (p *Provider) Name() string {
return p.providerName
Expand Down Expand Up @@ -180,12 +237,27 @@ func (p *Provider) processRequest(request *http.Request, session goth.Session, a
request.Header.Add(key, value)
}

client, err := p.consumer.MakeHttpClient(sess.AccessToken)
if err != nil {
return nil, err

var err error
var response *http.Response

if p.HTTPClient == nil {

client, err := p.consumer.MakeHttpClient(sess.AccessToken)

if err != nil {
return nil, err
}

response, err = client.Do(request)

} else {

transport, _ := p.consumer.MakeRoundTripper(sess.AccessToken)

response, err = transport.RoundTrip(request)
}

response, err := client.Do(request)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -371,4 +443,4 @@ func (p *Provider) GetSessionFromStore(request *http.Request, response http.Resp
return nil, errors.New("access token has expired - please reconnect")
}
return session, err
}
}

0 comments on commit f017f16

Please sign in to comment.