@@ -22,6 +22,7 @@ import (
2222
2323var (
2424 ErrSignedOut = errors .New ("sign in required" )
25+ ErrTransient = errors .New ("transient error encountered, please retry" )
2526 ErrGnomeKeyringRequired = fmt .Errorf ("gnome-keyring required for secure credential storage: %w" , ErrSignedOut )
2627)
2728
@@ -123,30 +124,34 @@ func (s *Session) CreatePATToken(ctx context.Context, deviceCode string) (string
123124 return "" , err
124125 }
125126
127+ requestId := res .Header .Get ("X-Request-Id" )
128+
126129 switch res .StatusCode {
127130 case http .StatusOK :
128131 var patTokens * AuthCliPatTokensResponse
129132 if err = json .NewDecoder (res .Body ).Decode (& patTokens ); err != nil {
130133 return "" , err
131134 }
132135 return patTokens .PatToken , nil
136+ case http .StatusServiceUnavailable :
137+ return "" , ErrTransient
133138 case http .StatusBadRequest :
134139 var errorsRes * Error
135140 if err = json .NewDecoder (res .Body ).Decode (& errorsRes ); err != nil {
136141 return "" , err
137142 }
138143 switch errorsRes .Type {
139144 case "urn:anchordev:api:cli-auth:authorization-pending" :
140- return "" , nil
145+ return "" , ErrTransient
141146 case "urn:anchordev:api:cli-auth:expired-device-code" :
142147 return "" , fmt .Errorf ("Your authorization request has expired, please try again." )
143148 case "urn:anchordev:api:cli-auth:incorrect-device-code" :
144149 return "" , fmt .Errorf ("Your authorization request was not found, please try again." )
145150 default :
146- return "" , fmt .Errorf ("unexpected error: %s" , errorsRes .Detail )
151+ return "" , fmt .Errorf ("request [%s]: unexpected error: %s" , requestId , errorsRes .Detail )
147152 }
148153 default :
149- return "" , fmt .Errorf ("unexpected response code: %d" , res .StatusCode )
154+ return "" , fmt .Errorf ("request [%s]: unexpected response code: %d" , requestId , res .StatusCode )
150155 }
151156}
152157
@@ -262,7 +267,8 @@ func (s *Session) get(ctx context.Context, path string, out any) error {
262267 if err = json .NewDecoder (res .Body ).Decode (& errorsRes ); err != nil {
263268 return err
264269 }
265- return fmt .Errorf ("%w: %s" , StatusCodeError (res .StatusCode ), errorsRes .Title )
270+ requestId := res .Header .Get ("X-Request-Id" )
271+ return fmt .Errorf ("request [%s]: %w: %s" , requestId , StatusCodeError (res .StatusCode ), errorsRes .Title )
266272 }
267273 return json .NewDecoder (res .Body ).Decode (out )
268274}
@@ -292,7 +298,8 @@ func (s *Session) post(ctx context.Context, path string, in, out any) error {
292298 if err = json .NewDecoder (res .Body ).Decode (& errorsRes ); err != nil {
293299 return err
294300 }
295- return fmt .Errorf ("%w: %s" , StatusCodeError (res .StatusCode ), errorsRes .Title )
301+ requestId := res .Header .Get ("X-Request-Id" )
302+ return fmt .Errorf ("request [%s]: %w: %s" , requestId , StatusCodeError (res .StatusCode ), errorsRes .Title )
296303 }
297304 return json .NewDecoder (res .Body ).Decode (out )
298305}
@@ -326,14 +333,16 @@ func (r responseChecker) RoundTrip(req *http.Request) (*http.Response, error) {
326333 return nil , fmt .Errorf ("request error %s %s: %w" , req .Method , req .URL .Path , err )
327334 }
328335
336+ requestId := res .Header .Get ("X-Request-Id" )
337+
329338 switch res .StatusCode {
330339 case http .StatusForbidden :
331340 return nil , ErrSignedOut
332341 case http .StatusInternalServerError :
333- return nil , fmt .Errorf ("request failed: %w" , err )
342+ return nil , fmt .Errorf ("request [%s] failed: %w" , requestId , err )
334343 }
335344 if contentType := res .Header .Get ("Content-Type" ); ! jsonMediaTypes .Matches (contentType ) {
336- return nil , fmt .Errorf ("non-json response received : %q : %w " , contentType , err )
345+ return nil , fmt .Errorf ("request [%s] : %d response, expected json content-type, got : %q " , requestId , res . StatusCode , contentType )
337346 }
338347 return res , nil
339348}
0 commit comments