Blame vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_policy_unique_request_id.go

Packit 63bb0d
package azblob
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"context"
Packit Service 3a6627
	"errors"
Packit 63bb0d
	"github.com/Azure/azure-pipeline-go/pipeline"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// NewUniqueRequestIDPolicyFactory creates a UniqueRequestIDPolicyFactory object
Packit 63bb0d
// that sets the request's x-ms-client-request-id header if it doesn't already exist.
Packit 63bb0d
func NewUniqueRequestIDPolicyFactory() pipeline.Factory {
Packit 63bb0d
	return pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc {
Packit 63bb0d
		// This is Policy's Do method:
Packit 63bb0d
		return func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) {
Packit 63bb0d
			id := request.Header.Get(xMsClientRequestID)
Packit 63bb0d
			if id == "" { // Add a unique request ID if the caller didn't specify one already
Packit Service 3a6627
				id = newUUID().String()
Packit Service 3a6627
				request.Header.Set(xMsClientRequestID, id)
Packit 63bb0d
			}
Packit Service 3a6627
Packit Service 3a6627
			resp, err := next.Do(ctx, request)
Packit Service 3a6627
Packit Service 3a6627
			if err == nil && resp != nil {
Packit Service 3a6627
				val := resp.Response().Header.Values(xMsClientRequestID)
Packit Service 3a6627
				if len(val) > 0 {
Packit Service 3a6627
					if val[0] != id {
Packit Service 3a6627
						err = errors.New("client Request ID from request and response does not match")
Packit Service 3a6627
					}
Packit Service 3a6627
				}
Packit Service 3a6627
			}
Packit Service 3a6627
Packit Service 3a6627
			return resp, err
Packit 63bb0d
		}
Packit 63bb0d
	})
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
const xMsClientRequestID = "x-ms-client-request-id"