@@ -16,14 +16,33 @@ import (
1616
1717// Docs: https://developer.atlassian.com/cloud/bitbucket/rest/intro/
1818type BitBucketApiClient struct {
19- Client resty.Client
19+ Client resty.Client
20+ BaseURL string
21+ InternalBaseURL string
2022}
2123
22- func NewClient (username string , password string , bitBucketCookie string ) BitBucketApiClient {
24+ func NewClient (username string , password string , bitBucketCookie string , baseURL string ) BitBucketApiClient {
25+ if baseURL == "" {
26+ baseURL = "https://api.bitbucket.org/2.0"
27+ }
28+ // Derive an internal base URL for BitBucket internal APIs (bitbucket.org/!api/...)
29+ // Default behaviour: if API base points to api.bitbucket.org use bitbucket.org for internal endpoints
30+ parsedBase , err := url .Parse (baseURL )
31+ if err != nil {
32+ log .Fatal ().Err (err ).Msg ("Unable to parse baseURL" )
33+ }
34+
35+ internalHost := parsedBase .Host
36+ if parsedBase .Host == "api.bitbucket.org" || parsedBase .Host == "api.bitbucket.org:443" {
37+ internalHost = "bitbucket.org"
38+ }
39+ internalBase := parsedBase .Scheme + "://" + internalHost + "/!api"
40+
2341 client := * resty .New ().SetBasicAuth (username , password ).SetRedirectPolicy (resty .FlexibleRedirectPolicy (5 ))
2442 if len (bitBucketCookie ) > 0 {
2543 jar , _ := cookiejar .New (nil )
26- targetURL , _ := url .Parse ("https://bitbucket.org/" )
44+ // set cookie on the internal host root so requests to internal endpoints include it
45+ targetURL := & url.URL {Scheme : parsedBase .Scheme , Host : internalHost , Path : "/" }
2746 jar .SetCookies (targetURL , []* http.Cookie {
2847 {
2948 Name : "cloud.session.token" ,
@@ -35,7 +54,7 @@ func NewClient(username string, password string, bitBucketCookie string) BitBuck
3554 log .Debug ().Msg ("Added cloud.session.token to HTTP client" )
3655 }
3756
38- bbClient := BitBucketApiClient {Client : client }
57+ bbClient := BitBucketApiClient {Client : client , BaseURL : baseURL , InternalBaseURL : internalBase }
3958 bbClient .Client .AddRetryHooks (
4059 func (res * resty.Response , err error ) {
4160 if res .StatusCode () == 429 {
@@ -50,7 +69,7 @@ func NewClient(username string, password string, bitBucketCookie string) BitBuck
5069
5170// https://developer.atlassian.com/cloud/bitbucket/rest/api-group-workspaces/#api-workspaces-get
5271func (a BitBucketApiClient ) ListOwnedWorkspaces (nextPageUrl string ) ([]Workspace , string , * resty.Response , error ) {
53- url := "https://api.bitbucket.org/2.0 /workspaces"
72+ url := a . BaseURL + " /workspaces"
5473 if nextPageUrl != "" {
5574 url = nextPageUrl
5675 }
@@ -77,7 +96,7 @@ func (a BitBucketApiClient) ListWorkspaceRepositoires(nextPageUrl string, worksp
7796 if nextPageUrl != "" {
7897 reqUrl = nextPageUrl
7998 } else {
80- u , err := url .Parse ("https://api.bitbucket.org/2.0 /repositories/" )
99+ u , err := url .Parse (a . BaseURL + " /repositories/" )
81100 if err != nil {
82101 log .Fatal ().Err (err ).Msg ("Unable to parse ListWorkspaceRepositoires url" )
83102 }
@@ -108,7 +127,7 @@ func (a BitBucketApiClient) ListPublicRepositories(nextPageUrl string, after tim
108127 if nextPageUrl != "" {
109128 reqUrl = nextPageUrl
110129 } else {
111- u , err := url .Parse ("https://api.bitbucket.org/2.0 /repositories/" )
130+ u , err := url .Parse (a . BaseURL + " /repositories/" )
112131 if err != nil {
113132 log .Fatal ().Err (err ).Msg ("Unable to parse ListPublicRepositories url" )
114133 }
@@ -147,7 +166,7 @@ func (a BitBucketApiClient) ListRepositoryPipelines(nextPageUrl string, workspac
147166 if nextPageUrl != "" {
148167 reqUrl = nextPageUrl
149168 } else {
150- u , err := url .Parse ("https://api.bitbucket.org/2.0 /repositories/" )
169+ u , err := url .Parse (a . BaseURL + " /repositories/" )
151170 if err != nil {
152171 log .Fatal ().Err (err ).Msg ("Unable to parse ListRepositoryPipelines url" )
153172 }
@@ -183,7 +202,7 @@ func (a BitBucketApiClient) ListPipelineSteps(nextPageUrl string, workspaceSlug
183202 if nextPageUrl != "" {
184203 reqUrl = nextPageUrl
185204 } else {
186- u , err := url .Parse ("https://api.bitbucket.org/2.0 /repositories/" )
205+ u , err := url .Parse (a . BaseURL + " /repositories/" )
187206 if err != nil {
188207 log .Fatal ().Err (err ).Msg ("Unable to parse ListPipelineSteps url" )
189208 }
@@ -209,7 +228,7 @@ func (a BitBucketApiClient) ListPipelineSteps(nextPageUrl string, workspaceSlug
209228
210229// https://developer.atlassian.com/cloud/bitbucket/rest/api-group-pipelines/#api-repositories-workspace-repo-slug-pipelines-pipeline-uuid-steps-step-uuid-log-get
211230func (a BitBucketApiClient ) GetStepLog (workspaceSlug string , repoSlug string , pipelineUUID string , stepUUID string ) ([]byte , * resty.Response , error ) {
212- u , err := url .Parse ("https://api.bitbucket.org/2.0 /repositories/" )
231+ u , err := url .Parse (a . BaseURL + " /repositories/" )
213232 if err != nil {
214233 log .Fatal ().Err (err ).Msg ("Unable to parse GetStepLog url" )
215234 }
@@ -240,7 +259,7 @@ func (a BitBucketApiClient) ListDownloadArtifacts(nextPageUrl string, workspaceS
240259 if nextPageUrl != "" {
241260 reqUrl = nextPageUrl
242261 } else {
243- u , err := url .Parse ("https://api.bitbucket.org/2.0 /repositories/" )
262+ u , err := url .Parse (a . BaseURL + " /repositories/" )
244263 if err != nil {
245264 log .Fatal ().Err (err ).Msg ("Unable to parse ListDownloadArtifacts url" )
246265 }
@@ -291,7 +310,7 @@ func (a BitBucketApiClient) ListPipelineArtifacts(nextPageUrl string, workspaceS
291310 if nextPageUrl != "" {
292311 reqUrl = nextPageUrl
293312 } else {
294- u , err := url .Parse ("https://bitbucket.org/!api /internal/repositories/" )
313+ u , err := url .Parse (a . InternalBaseURL + " /internal/repositories/" )
295314 if err != nil {
296315 log .Fatal ().Err (err ).Msg ("Unable to parse ListPipelineArtifacst url" )
297316 }
@@ -309,8 +328,7 @@ func (a BitBucketApiClient) ListPipelineArtifacts(nextPageUrl string, workspaceS
309328
310329// Internal API: https://bitbucket.org/!api/internal/repositories/{workspace}/{repo}/pipelines/{buildId}/artifacts/{ArtifactUUID}/content
311330func (a BitBucketApiClient ) GetPipelineArtifact (workspaceSlug string , repoSlug string , buildNumber int , artifactUUID string ) []byte {
312-
313- u , err := url .Parse ("https://bitbucket.org/!api/internal/repositories/" )
331+ u , err := url .Parse (a .InternalBaseURL + "/internal/repositories/" )
314332 if err != nil {
315333 log .Fatal ().Err (err ).Msg ("Unable to parse GetPipelineArtifact url" )
316334 }
@@ -336,7 +354,7 @@ func (a BitBucketApiClient) GetuserInfo() {
336354 resp := & UserInfo {}
337355 res , err := a .Client .R ().
338356 SetResult (resp ).
339- Get ("https://bitbucket.org/!api /2.0/user" )
357+ Get (a . InternalBaseURL + " /2.0/user" )
340358
341359 if err != nil {
342360 log .Error ().Err (err ).Msg ("Failed get user info (network or client error)" )
0 commit comments