// DoPollForAsynchronous returns a SendDecorator that polls if the http.Response is for an Azure // long-running operation. It will delay between requests for the duration specified in the // RetryAfter header or, if the header is absent, the passed delay. Polling may be canceled by // closing the optional channel on the http.Request. func DoPollForAsynchronous(delay time.Duration) autorest.SendDecorator { return func(s autorest.Sender) autorest.Sender { return autorest.SenderFunc(func(r *http.Request) (resp *http.Response, err error) { resp, err = s.Do(r) if err != nil { return resp, err } ps := pollingState{} for err == nil { err = updatePollingState(resp, &ps) if err != nil { break } if ps.hasTerminated() { if !ps.hasSucceeded() { err = ps } break } r, err = newPollingRequest(resp, ps) if err != nil { return resp, err } resp, err = autorest.SendWithSender(s, r, autorest.AfterDelay(autorest.GetRetryAfter(resp, delay))) } return resp, err }) } }
// DoPollForAsynchronous returns a SendDecorator that polls if the http.Response is for an Azure // long-running operation. It will poll until the time passed is equal to or greater than // the supplied duration. It will delay between requests for the duration specified in the // RetryAfter header or, if the header is absent, the passed delay. Polling may be canceled by // closing the optional channel on the http.Request. func DoPollForAsynchronous(duration time.Duration, delay time.Duration) autorest.SendDecorator { return func(s autorest.Sender) autorest.Sender { return autorest.SenderFunc(func(r *http.Request) (resp *http.Response, err error) { resp, err = s.Do(r) if err != nil || !IsAsynchronousResponse(resp) { return resp, err } r, err = NewOperationResourceRequest(resp, r.Cancel) if err != nil { return resp, autorest.NewErrorWithError(err, "azure", "DoPollForAsynchronous", resp, "Failure occurred creating OperationResource request") } or := &OperationResource{} for err == nil && !or.HasTerminated() { autorest.Respond(resp, autorest.ByClosing()) resp, err = autorest.SendWithSender(s, r, autorest.AfterDelay(autorest.GetRetryAfter(resp, delay))) if err != nil { return resp, autorest.NewErrorWithError(err, "azure", "DoPollForAsynchronous", resp, "Failure occurred retrieving OperationResource") } err = autorest.Respond(resp, autorest.ByUnmarshallingJSON(or)) if err != nil { return resp, autorest.NewErrorWithError(err, "azure", "DoPollForAsynchronous", resp, "Failure occurred unmarshalling an OperationResource") } } if err == nil && or.HasTerminated() { err = or.GetError() } return resp, err }) } }