aboutsummaryrefslogblamecommitdiffstats
path: root/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go
blob: 2f391d731258d8d2ed1a50cf6eb05c420d1216b1 (plain) (tree)









































































                                                                                                          
package azblob

// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is regenerated.

import (
    "bytes"
    "context"
    "encoding/xml"
    "github.com/Azure/azure-pipeline-go/pipeline"
    "io/ioutil"
)

type responder func(resp pipeline.Response) (result pipeline.Response, err error)

// ResponderPolicyFactory is a Factory capable of creating a responder pipeline.
type responderPolicyFactory struct {
    responder responder
}

// New creates a responder policy factory.
func (arpf responderPolicyFactory) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy {
    return responderPolicy{next: next, responder: arpf.responder}
}

type responderPolicy struct {
    next      pipeline.Policy
    responder responder
}

// Do sends the request to the service and validates/deserializes the HTTP response.
func (arp responderPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {
    resp, err := arp.next.Do(ctx, request)
    if err != nil {
        return resp, err
    }
    return arp.responder(resp)
}

// validateResponse checks an HTTP response's status code against a legal set of codes.
// If the response code is not legal, then validateResponse reads all of the response's body
// (containing error information) and returns a response error.
func validateResponse(resp pipeline.Response, successStatusCodes ...int) error {
    if resp == nil {
        return NewResponseError(nil, nil, "nil response")
    }
    responseCode := resp.Response().StatusCode
    for _, i := range successStatusCodes {
        if i == responseCode {
            return nil
        }
    }
    // only close the body in the failure case. in the
    // success case responders will close the body as required.
    defer resp.Response().Body.Close()
    b, err := ioutil.ReadAll(resp.Response().Body)
    if err != nil {
        return NewResponseError(err, resp.Response(), "failed to read response body")
    }
    // the service code, description and details will be populated during unmarshalling
    responseError := NewResponseError(nil, resp.Response(), resp.Response().Status)
    if len(b) > 0 {
        if err = xml.Unmarshal(b, &responseError); err != nil {
            return NewResponseError(err, resp.Response(), "failed to unmarshal response body")
        }
    }
    return responseError
}

// removes any BOM from the byte slice
func removeBOM(b []byte) []byte {
    // UTF8
    return bytes.TrimPrefix(b, []byte("\xef\xbb\xbf"))
}