| package gophercloud |
| |
| import ( |
| "github.com/racker/perigee" |
| ) |
| |
| // WithReauth wraps a Perigee request fragment with logic to perform re-authentication |
| // if it's deemed necessary. |
| // |
| // Do not confuse this function with WithReauth()! Although they work together to support reauthentication, |
| // WithReauth() actually contains the decision-making logic to determine when to perform a reauth, |
| // while WithReauthHandler() is used to configure what a reauth actually entails. |
| func (c *Context) WithReauth(ap AccessProvider, f func() error) error { |
| err := f() |
| cause, ok := err.(*perigee.UnexpectedResponseCodeError) |
| if ok && cause.Actual == 401 { |
| err = c.reauthHandler(ap) |
| if err == nil { |
| err = f() |
| } |
| } |
| return err |
| } |
| |
| // This is like WithReauth above but returns a perigee Response object |
| func (c *Context) ResponseWithReauth(ap AccessProvider, f func() (*perigee.Response, error)) (*perigee.Response, error) { |
| response, err := f() |
| cause, ok := err.(*perigee.UnexpectedResponseCodeError) |
| if ok && cause.Actual == 401 { |
| err = c.reauthHandler(ap) |
| if err == nil { |
| response, err = f() |
| } |
| } |
| return response, err |
| } |