azure-storage 0.10.0.preview → 0.10.1.preview
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/azure/storage/autoload.rb +2 -4
- data/lib/azure/storage/blob/blob_service.rb +2 -5
- data/lib/azure/storage/blob/container.rb +5 -1
- data/lib/azure/storage/client.rb +4 -4
- data/lib/azure/storage/{core/client_options.rb → client_options.rb} +1 -2
- data/lib/azure/storage/{core/client_options_error.rb → client_options_error.rb} +2 -2
- data/lib/azure/storage/core.rb +1 -1
- data/lib/azure/storage/core/auth/shared_access_signature.rb +3 -2
- data/lib/azure/storage/core/auth/shared_access_signature_generator.rb +31 -18
- data/lib/azure/storage/core/auth/shared_access_signature_signer.rb +1 -1
- data/lib/azure/storage/core/auth/shared_key.rb +4 -72
- data/lib/azure/storage/core/autoload.rb +17 -8
- data/lib/azure/storage/core/error.rb +2 -8
- data/lib/azure/storage/core/filter/exponential_retry_filter.rb +62 -0
- data/lib/azure/storage/core/{auth/shared_key_lite.rb → filter/linear_retry_filter.rb} +27 -29
- data/lib/azure/storage/core/filter/retry_filter.rb +172 -0
- data/lib/azure/storage/core/http_client.rb +1 -1
- data/lib/azure/storage/core/utility.rb +2 -10
- data/lib/azure/storage/{core/constants.rb → default.rb} +0 -0
- data/lib/azure/storage/service/storage_service.rb +7 -2
- data/lib/azure/storage/table/auth/shared_key.rb +2 -2
- data/lib/azure/storage/table/batch.rb +1 -1
- data/lib/azure/storage/table/table_service.rb +11 -11
- data/lib/azure/storage/version.rb +1 -1
- metadata +24 -18
- data/lib/azure/storage/core/auth/signer.rb +0 -60
- data/lib/azure/storage/core/filtered_service.rb +0 -54
- data/lib/azure/storage/core/http/debug_filter.rb +0 -45
- data/lib/azure/storage/core/http/http_error.rb +0 -95
- data/lib/azure/storage/core/http/http_filter.rb +0 -62
- data/lib/azure/storage/core/http/http_request.rb +0 -182
- data/lib/azure/storage/core/http/http_response.rb +0 -105
- data/lib/azure/storage/core/http/retry_policy.rb +0 -83
- data/lib/azure/storage/core/http/signer_filter.rb +0 -42
- data/lib/azure/storage/core/service.rb +0 -55
- data/lib/azure/storage/core/signed_service.rb +0 -54
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 68f699e6dbd6ceed52d8c35694a78d9c852ea5a0
         | 
| 4 | 
            +
              data.tar.gz: 21e079f0fab409af5260dd228e1a3ec7e05d180c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c15b3eb7927d1856e98f0a36cfd543885d5bfedc6d4986d01147a234f0b016169683a66974126aa1b22bf9341547ad6f89708c4b848526d128666c5222433701
         | 
| 7 | 
            +
              data.tar.gz: 4f9cf1548ad8e0761671dfba0835a71367544e3018c02b06b44ccd185af42ff0056a181f029aa291a8c79fe4e6b555a227cc85ca882618b1a0777873f4cc8caa
         | 
| @@ -29,15 +29,13 @@ module Azure | |
| 29 29 | 
             
              autoload :Storage,                      'azure/storage/core'
         | 
| 30 30 |  | 
| 31 31 | 
             
              module Storage
         | 
| 32 | 
            -
                autoload :Default,                    'azure/storage/ | 
| 32 | 
            +
                autoload :Default,                    'azure/storage/default'
         | 
| 33 33 | 
             
                autoload :Configurable,               'azure/storage/configurable'
         | 
| 34 34 | 
             
                autoload :Client,                     'azure/storage/client'
         | 
| 35 | 
            -
                autoload :ClientOptions,              'azure/storage/ | 
| 35 | 
            +
                autoload :ClientOptions,              'azure/storage/client_options'
         | 
| 36 36 |  | 
| 37 37 | 
             
                module Auth
         | 
| 38 38 | 
             
                  autoload :SharedAccessSignature,    'azure/storage/core/auth/shared_access_signature'
         | 
| 39 | 
            -
                  autoload :SharedKey,                'azure/storage/core/auth/shared_key'
         | 
| 40 | 
            -
                  autoload :SharedKeyLite,            'azure/storage/core/auth/shared_key_lite'
         | 
| 41 39 | 
             
                end
         | 
| 42 40 |  | 
| 43 41 | 
             
                module Service
         | 
| @@ -30,17 +30,14 @@ require 'azure/storage/blob/append' | |
| 30 30 |  | 
| 31 31 | 
             
            module Azure::Storage
         | 
| 32 32 | 
             
              include Service
         | 
| 33 | 
            +
              
         | 
| 33 34 | 
             
              module Blob
         | 
| 34 35 | 
             
                class BlobService < StorageService
         | 
| 35 36 | 
             
                  include Azure::Storage::Blob
         | 
| 36 37 | 
             
                  include Azure::Storage::Blob::Container
         | 
| 37 38 |  | 
| 38 39 | 
             
                  def initialize(options = {})
         | 
| 39 | 
            -
                     | 
| 40 | 
            -
                    signer = options[:signer] || Auth::SharedKey.new(
         | 
| 41 | 
            -
                      client_config.storage_account_name,
         | 
| 42 | 
            -
                      client_config.storage_access_key)
         | 
| 43 | 
            -
                    super(signer, client_config.storage_account_name, options)
         | 
| 40 | 
            +
                    super(nil, nil, options)
         | 
| 44 41 | 
             
                    @host = client.storage_blob_host
         | 
| 45 42 | 
             
                  end
         | 
| 46 43 |  | 
| @@ -545,7 +545,11 @@ module Azure::Storage::Blob | |
| 545 545 | 
             
                  response = call(:get, uri)
         | 
| 546 546 |  | 
| 547 547 | 
             
                  # Result
         | 
| 548 | 
            -
                   | 
| 548 | 
            +
                  if response.success?
         | 
| 549 | 
            +
                    Serialization.blob_enumeration_results_from_xml(response.body)
         | 
| 550 | 
            +
                  else
         | 
| 551 | 
            +
                    response.exception
         | 
| 552 | 
            +
                  end
         | 
| 549 553 | 
             
                end
         | 
| 550 554 |  | 
| 551 555 | 
             
              end
         | 
    
        data/lib/azure/storage/client.rb
    CHANGED
    
    | @@ -22,10 +22,10 @@ | |
| 22 22 | 
             
            # THE SOFTWARE.
         | 
| 23 23 | 
             
            #--------------------------------------------------------------------------
         | 
| 24 24 |  | 
| 25 | 
            +
            require 'azure/storage/core'
         | 
| 25 26 | 
             
            require 'azure/storage/core/http_client'
         | 
| 26 27 |  | 
| 27 | 
            -
            require 'azure/storage/ | 
| 28 | 
            -
            require 'azure/storage/core/client_options'
         | 
| 28 | 
            +
            require 'azure/storage/client_options'
         | 
| 29 29 |  | 
| 30 30 | 
             
            require 'azure/storage/blob/blob_service'
         | 
| 31 31 | 
             
            require 'azure/storage/table/table_service'
         | 
| @@ -35,7 +35,7 @@ module Azure::Storage | |
| 35 35 | 
             
              class Client
         | 
| 36 36 | 
             
                include Azure::Storage::Configurable
         | 
| 37 37 | 
             
                include Azure::Storage::ClientOptions
         | 
| 38 | 
            -
                include Azure::Core::HttpClient
         | 
| 38 | 
            +
                include Azure::Storage::Core::HttpClient
         | 
| 39 39 |  | 
| 40 40 | 
             
                # Public: Creates an instance of [Azure::Storage::Client]
         | 
| 41 41 | 
             
                #
         | 
| @@ -178,7 +178,7 @@ module Azure::Storage | |
| 178 178 | 
             
                private
         | 
| 179 179 |  | 
| 180 180 | 
             
                def default_client(opts)
         | 
| 181 | 
            -
                  {client:  | 
| 181 | 
            +
                  !opts.empty? ? {client: Azure::Storage.client(opts)} : {client: self} 
         | 
| 182 182 | 
             
                end
         | 
| 183 183 |  | 
| 184 184 | 
             
              end
         | 
| @@ -23,8 +23,7 @@ | |
| 23 23 | 
             
            #--------------------------------------------------------------------------
         | 
| 24 24 |  | 
| 25 25 | 
             
            require 'uri'
         | 
| 26 | 
            -
            require 'azure/storage/ | 
| 27 | 
            -
            require 'azure/storage/core/client_options_error'
         | 
| 26 | 
            +
            require 'azure/storage/client_options_error'
         | 
| 28 27 |  | 
| 29 28 | 
             
            module Azure::Storage
         | 
| 30 29 | 
             
              module ClientOptions
         | 
| @@ -24,13 +24,13 @@ | |
| 24 24 |  | 
| 25 25 | 
             
            module Azure::Storage
         | 
| 26 26 |  | 
| 27 | 
            -
              class InvalidConnectionStringError < StorageError
         | 
| 27 | 
            +
              class InvalidConnectionStringError < Core::StorageError
         | 
| 28 28 | 
             
                def initialize(message = SR::INVALID_CONNECTION_STRING)
         | 
| 29 29 | 
             
                	super(message)
         | 
| 30 30 | 
             
                end
         | 
| 31 31 | 
             
              end
         | 
| 32 32 |  | 
| 33 | 
            -
              class InvalidOptionsError < StorageError
         | 
| 33 | 
            +
              class InvalidOptionsError < Core::StorageError
         | 
| 34 34 | 
             
                def initialize(message = SR::INVALID_CLIENT_OPTIONS)
         | 
| 35 35 | 
             
                  super(message)
         | 
| 36 36 | 
             
                end
         | 
    
        data/lib/azure/storage/core.rb
    CHANGED
    
    
| @@ -22,6 +22,7 @@ | |
| 22 22 | 
             
            # THE SOFTWARE.
         | 
| 23 23 | 
             
            #--------------------------------------------------------------------------
         | 
| 24 24 |  | 
| 25 | 
            -
             | 
| 26 25 | 
             
            require 'azure/storage/core/auth/shared_access_signature_generator'
         | 
| 27 | 
            -
            require 'azure/storage/core/auth/shared_access_signature_signer'
         | 
| 26 | 
            +
            require 'azure/storage/core/auth/shared_access_signature_signer'
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            include Azure::Storage::Auth
         | 
| @@ -23,8 +23,8 @@ | |
| 23 23 | 
             
            #--------------------------------------------------------------------------
         | 
| 24 24 |  | 
| 25 25 | 
             
            require 'azure/storage/core'
         | 
| 26 | 
            -
            require 'azure/storage/ | 
| 27 | 
            -
            require 'azure/ | 
| 26 | 
            +
            require 'azure/storage/client_options_error'
         | 
| 27 | 
            +
            require 'azure/core/auth/signer'
         | 
| 28 28 | 
             
            require 'time'
         | 
| 29 29 | 
             
            require 'uri'
         | 
| 30 30 |  | 
| @@ -104,47 +104,60 @@ module Azure::Storage | |
| 104 104 | 
             
                    service_type = options[:service_type] || Azure::Storage::ServiceType::BLOB
         | 
| 105 105 | 
             
                    options.delete(:service_type) if options.key?(:service_type)
         | 
| 106 106 |  | 
| 107 | 
            +
                    options[:start] = Time.parse(options[:start]).utc.iso8601 if options[:start] 
         | 
| 108 | 
            +
                    options[:expiry] = Time.parse(options[:expiry]).utc.iso8601 if options[:expiry] 
         | 
| 107 109 | 
             
                    options[:expiry] ||= (Time.now + 60*30).utc.iso8601
         | 
| 108 110 |  | 
| 109 111 | 
             
                    raise InvalidOptionsError,"SAS version cannot be set" if options[:version]
         | 
| 110 112 |  | 
| 111 | 
            -
                     | 
| 113 | 
            +
                    options = DEFAULTS.merge(options)
         | 
| 112 114 | 
             
                    valid_mappings = KEY_MAPPINGS
         | 
| 113 115 | 
             
                    if service_type == Azure::Storage::ServiceType::BLOB
         | 
| 114 | 
            -
                       | 
| 116 | 
            +
                      options.merge!(resource: 'b')
         | 
| 115 117 | 
             
                      valid_mappings.merge!(BLOB_KEY_MAPPINGS)
         | 
| 116 118 | 
             
                    elsif service_type == Azure::Storage::ServiceType::TABLE
         | 
| 117 | 
            -
                       | 
| 119 | 
            +
                      options.merge!(tablename: path)
         | 
| 118 120 | 
             
                      valid_mappings.merge!(TABLE_KEY_MAPPINGS)
         | 
| 119 121 | 
             
                    end
         | 
| 120 122 |  | 
| 121 123 | 
             
                    invalid_options = options.reject { |k,v| valid_mappings.key?(k) }
         | 
| 122 124 | 
             
                    raise InvalidOptionsError,"invalid options #{invalid_options} provided for SAS token generate" if invalid_options.length > 0
         | 
| 123 125 |  | 
| 124 | 
            -
                    options. | 
| 125 | 
            -
             | 
| 126 | 
            +
                    query_hash = Hash[options.map { |k, v| [KEY_MAPPINGS[k], v] }]
         | 
| 127 | 
            +
                    .reject { |k, v| OPTIONAL_QUERY_PARAMS.include?(k) && v.to_s == '' }
         | 
| 128 | 
            +
                    .merge( sig: @signer.sign(signable_string(service_type, path, options)) )
         | 
| 129 | 
            +
                    
         | 
| 130 | 
            +
                    sas_params = URI.encode_www_form(query_hash)
         | 
| 131 | 
            +
                  end
         | 
| 132 | 
            +
                  
         | 
| 133 | 
            +
                  # Construct the plaintext to the spec required for signatures
         | 
| 134 | 
            +
                  # @return [String]
         | 
| 135 | 
            +
                  def signable_string(service_type, path, options)
         | 
| 126 136 | 
             
                    # Order is significant
         | 
| 127 137 | 
             
                    # The newlines from empty strings here are required
         | 
| 138 | 
            +
                    options[:start] = Time.parse(options[:start]).utc.iso8601 if options[:start]
         | 
| 139 | 
            +
                    options[:expiry] = Time.parse(options[:expiry]).utc.iso8601 if options[:expiry]
         | 
| 140 | 
            +
                    
         | 
| 128 141 | 
             
                    signable_string =
         | 
| 129 142 | 
             
                    [
         | 
| 130 143 | 
             
                      options[:permissions],
         | 
| 131 144 | 
             
                      options[:start],
         | 
| 132 145 | 
             
                      options[:expiry],
         | 
| 133 | 
            -
                       | 
| 146 | 
            +
                      canonicalized_resource(service_type, path),
         | 
| 134 147 | 
             
                      options[:identifier],
         | 
| 135 | 
            -
                       | 
| 148 | 
            +
                      Azure::Storage::Default::STG_VERSION,
         | 
| 136 149 | 
             
                      options[:cache_control],
         | 
| 137 150 | 
             
                      options[:content_disposition],
         | 
| 138 151 | 
             
                      options[:content_encoding],
         | 
| 139 152 | 
             
                      options[:content_language],
         | 
| 140 153 | 
             
                      options[:content_type]
         | 
| 141 154 | 
             
                    ].join("\n")
         | 
| 142 | 
            -
             | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 145 | 
            -
             | 
| 146 | 
            -
             | 
| 147 | 
            -
                     | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
                  
         | 
| 157 | 
            +
                  # Return the cononicalized resource representation of the blob resource
         | 
| 158 | 
            +
                  # @return [String]
         | 
| 159 | 
            +
                  def canonicalized_resource(service_type, path)
         | 
| 160 | 
            +
                    "/#{service_type}/#{account_name}#{path.start_with?('/') ? '' : '/'}#{path}"
         | 
| 148 161 | 
             
                  end
         | 
| 149 162 |  | 
| 150 163 | 
             
                  # A customised URI reflecting options for the resource signed with Shared Access Signature
         | 
| @@ -172,14 +185,14 @@ module Azure::Storage | |
| 172 185 | 
             
                  # * +:endpk+               - String. The end partition key of a specified partition key range. Optional but endpk must accompany endrk.
         | 
| 173 186 | 
             
                  # * +:startrk+             - String. The start row key of a specified row key range. Optional.
         | 
| 174 187 | 
             
                  # * +:endrk+               - String. The end row key of a specified row key range. Optional.
         | 
| 175 | 
            -
                  def  | 
| 188 | 
            +
                  def signed_uri(uri, options)
         | 
| 176 189 | 
             
                    parsed_query = CGI::parse(uri.query || '').inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
         | 
| 177 | 
            -
             | 
| 190 | 
            +
                    
         | 
| 178 191 | 
             
                    if parsed_query.has_key?(:restype)
         | 
| 179 192 | 
             
                      options[:resource] = parsed_query[:restype].first == 'container' ? 'c' : 'b'
         | 
| 180 193 | 
             
                    end
         | 
| 181 194 |  | 
| 182 | 
            -
                    if options[:service_type] == nil
         | 
| 195 | 
            +
                    if options[:service_type] == nil and uri.host != nil
         | 
| 183 196 | 
             
                      host_splits = uri.host.split('.')
         | 
| 184 197 | 
             
                      options[:service_type] = host_splits[1] if host_splits.length > 1 && host_splits[0] == account_name
         | 
| 185 198 | 
             
                    end
         | 
| @@ -22,53 +22,11 @@ | |
| 22 22 | 
             
            # THE SOFTWARE.
         | 
| 23 23 | 
             
            #--------------------------------------------------------------------------
         | 
| 24 24 | 
             
            require 'cgi'
         | 
| 25 | 
            -
            require 'azure/ | 
| 25 | 
            +
            require 'azure/core/auth/signer'
         | 
| 26 26 |  | 
| 27 | 
            -
            module Azure::Storage
         | 
| 27 | 
            +
            module Azure::Storage::Core
         | 
| 28 28 | 
             
              module Auth
         | 
| 29 | 
            -
                class SharedKey < Azure::Core::Auth:: | 
| 30 | 
            -
                  # The Azure account's name.
         | 
| 31 | 
            -
                  attr :account_name
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                  # Initialize the Signer.
         | 
| 34 | 
            -
                  #
         | 
| 35 | 
            -
                  # @param account_name [String] The account name. Defaults to the one in the
         | 
| 36 | 
            -
                  #                global configuration.
         | 
| 37 | 
            -
                  # @param access_key   [String] The access_key encoded in Base64. Defaults to the
         | 
| 38 | 
            -
                  #                one in the global configuration.
         | 
| 39 | 
            -
                  def initialize(account_name=Azure::Storage.config.storage_account_name, access_key=Azure::Storage.config.storage_access_key)
         | 
| 40 | 
            -
                    @account_name = account_name
         | 
| 41 | 
            -
                    super(access_key)
         | 
| 42 | 
            -
                  end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                  # The name of the strategy.
         | 
| 45 | 
            -
                  #
         | 
| 46 | 
            -
                  # @return [String]
         | 
| 47 | 
            -
                  def name
         | 
| 48 | 
            -
                    'SharedKey'
         | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                  # Create the signature for the request parameters
         | 
| 52 | 
            -
                  #
         | 
| 53 | 
            -
                  # @param method     [Symbol] HTTP request method.
         | 
| 54 | 
            -
                  # @param uri        [URI] URI of the request we're signing.
         | 
| 55 | 
            -
                  # @param headers    [Hash] HTTP request headers.
         | 
| 56 | 
            -
                  #
         | 
| 57 | 
            -
                  # @return           [String] base64 encoded signature
         | 
| 58 | 
            -
                  def sign(method, uri, headers)
         | 
| 59 | 
            -
                    "#{account_name}:#{super(signable_string(method, uri, headers))}"
         | 
| 60 | 
            -
                  end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                  # Sign the request
         | 
| 63 | 
            -
                  #
         | 
| 64 | 
            -
                  # @param req    [Azure::Core::Http::HttpRequest] HTTP request to sign
         | 
| 65 | 
            -
                  #
         | 
| 66 | 
            -
                  # @return       [Azure::Core::Http::HttpRequest]
         | 
| 67 | 
            -
                  def sign_request(req)
         | 
| 68 | 
            -
                    req.headers['Authorization'] = "#{name} #{sign(req.method, req.uri, req.headers)}"
         | 
| 69 | 
            -
                    req
         | 
| 70 | 
            -
                  end
         | 
| 71 | 
            -
             | 
| 29 | 
            +
                class SharedKey < Azure::Core::Auth::SharedKey
         | 
| 72 30 | 
             
                  # Generate the string to sign.
         | 
| 73 31 | 
             
                  #
         | 
| 74 32 | 
             
                  # @param method     [Symbol] HTTP request method.
         | 
| @@ -94,32 +52,6 @@ module Azure::Storage | |
| 94 52 | 
             
                      canonicalized_resource(uri)
         | 
| 95 53 | 
             
                    ].join("\n")
         | 
| 96 54 | 
             
                  end
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                  # Calculate the Canonicalized Headers string for a request.
         | 
| 99 | 
            -
                  #
         | 
| 100 | 
            -
                  # @param headers    [Hash] HTTP request headers.
         | 
| 101 | 
            -
                  #
         | 
| 102 | 
            -
                  # @return [String] a string with the canonicalized headers.
         | 
| 103 | 
            -
                  def canonicalized_headers(headers)
         | 
| 104 | 
            -
                    headers = headers.map { |k,v| [k.to_s.downcase, v] }
         | 
| 105 | 
            -
                    headers.select! { |k,v| k =~ /^x-ms-/ }
         | 
| 106 | 
            -
                    headers.sort_by! { |(k,v)| k }
         | 
| 107 | 
            -
                    headers.map! { |k,v| '%s:%s' % [k, v] }
         | 
| 108 | 
            -
                    headers.map! { |h| h.gsub(/\s+/, ' ') }.join("\n")
         | 
| 109 | 
            -
                  end
         | 
| 110 | 
            -
             | 
| 111 | 
            -
                  # Calculate the Canonicalized Resource string for a request.
         | 
| 112 | 
            -
                  #
         | 
| 113 | 
            -
                  # @param uri        [URI] URI of the request we're signing.
         | 
| 114 | 
            -
                  #
         | 
| 115 | 
            -
                  # @return           [String] a string with the canonicalized resource.
         | 
| 116 | 
            -
                  def canonicalized_resource(uri)
         | 
| 117 | 
            -
                    resource = '/' + account_name + (uri.path.empty? ? '/' : uri.path)
         | 
| 118 | 
            -
                    params = CGI.parse(uri.query.to_s).map { |k,v| [k.downcase, v] }
         | 
| 119 | 
            -
                    params.sort_by! { |k,v| k }
         | 
| 120 | 
            -
                    params.map! { |k,v| '%s:%s' % [k, v.map(&:strip).sort.join(',')] }
         | 
| 121 | 
            -
                    [resource, *params].join("\n")
         | 
| 122 | 
            -
                  end
         | 
| 123 55 | 
             
                end
         | 
| 124 56 | 
             
              end
         | 
| 125 | 
            -
            end
         | 
| 57 | 
            +
            end
         | 
| @@ -23,13 +23,22 @@ | |
| 23 23 | 
             
            #--------------------------------------------------------------------------
         | 
| 24 24 |  | 
| 25 25 | 
             
            module Azure
         | 
| 26 | 
            -
              module  | 
| 27 | 
            -
                 | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 26 | 
            +
              module Storage
         | 
| 27 | 
            +
                module Core
         | 
| 28 | 
            +
                  autoload :HttpClient,                     'azure/storage/core/http_client'
         | 
| 29 | 
            +
                  autoload :Utility,                        'azure/storage/core/utility'
         | 
| 30 | 
            +
                  autoload :Logger,                         'azure/storage/core/utility'
         | 
| 31 | 
            +
                  autoload :Error,                          'azure/storage/core/error'
         | 
| 32 | 
            +
                  
         | 
| 33 | 
            +
                  module Auth
         | 
| 34 | 
            +
                    autoload :SharedKey,                    'azure/storage/core/auth/shared_key.rb'
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                  
         | 
| 37 | 
            +
                  module Filter
         | 
| 38 | 
            +
                    autoload :RetryPolicyFilter,            'azure/storage/core/filter/retry_filter'
         | 
| 39 | 
            +
                    autoload :LinearRetryPolicyFilter,      'azure/storage/core/filter/linear_retry_filter'
         | 
| 40 | 
            +
                    autoload :ExponentialRetryPolicyFilter, 'azure/storage/core/filter/exponential_retry_filter'
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 34 43 | 
             
              end
         | 
| 35 44 | 
             
            end
         | 
| @@ -21,15 +21,9 @@ | |
| 21 21 | 
             
            # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
         | 
| 22 22 | 
             
            # THE SOFTWARE.
         | 
| 23 23 | 
             
            #--------------------------------------------------------------------------
         | 
| 24 | 
            -
             | 
| 25 | 
            -
              module Core
         | 
| 26 | 
            -
                # Superclass for errors generated from this library, so people can
         | 
| 27 | 
            -
                # just rescue this for generic error handling
         | 
| 28 | 
            -
                class Error < StandardError;end
         | 
| 29 | 
            -
              end
         | 
| 30 | 
            -
            end
         | 
| 24 | 
            +
            require 'azure/core'
         | 
| 31 25 |  | 
| 32 | 
            -
            module Azure::Storage
         | 
| 26 | 
            +
            module Azure::Storage::Core
         | 
| 33 27 | 
             
              # Superclass for errors generated from this library, so people can
         | 
| 34 28 | 
             
              # just rescue this for generic error handling
         | 
| 35 29 | 
             
              class StorageError < StandardError
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            #-------------------------------------------------------------------------
         | 
| 2 | 
            +
            # # Copyright (c) Microsoft and contributors. All rights reserved.
         | 
| 3 | 
            +
            #
         | 
| 4 | 
            +
            # The MIT License(MIT)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # Permission is hereby granted, free of charge, to any person obtaining a copy
         | 
| 7 | 
            +
            # of this software and associated documentation files(the "Software"), to deal
         | 
| 8 | 
            +
            # in the Software without restriction, including without limitation the rights
         | 
| 9 | 
            +
            # to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
         | 
| 10 | 
            +
            # copies of the Software, and to permit persons to whom the Software is
         | 
| 11 | 
            +
            # furnished to do so, subject to the following conditions :
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            # The above copyright notice and this permission notice shall be included in
         | 
| 14 | 
            +
            # all copies or substantial portions of the Software.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
         | 
| 17 | 
            +
            # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
         | 
| 18 | 
            +
            # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
         | 
| 19 | 
            +
            # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
         | 
| 20 | 
            +
            # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
         | 
| 21 | 
            +
            # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
         | 
| 22 | 
            +
            # THE SOFTWARE.
         | 
| 23 | 
            +
            #--------------------------------------------------------------------------
         | 
| 24 | 
            +
            require 'azure/core'
         | 
| 25 | 
            +
            require 'azure/core/http/retry_policy'
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            module Azure::Storage::Core::Filter
         | 
| 28 | 
            +
              class ExponentialRetryPolicyFilter < RetryPolicyFilter
         | 
| 29 | 
            +
                def initialize(retry_count=nil, min_retry_interval=nil, max_retry_interval=nil)
         | 
| 30 | 
            +
                  @retry_count = retry_count || ExponentialRetryPolicyFilter::DEFAULT_RETRY_COUNT
         | 
| 31 | 
            +
                  @min_retry_interval = min_retry_interval || ExponentialRetryPolicyFilter::DEFAULT_MIN_RETRY_INTERVAL
         | 
| 32 | 
            +
                  @max_retry_interval = max_retry_interval || ExponentialRetryPolicyFilter::DEFAULT_MAX_RETRY_INTERVAL
         | 
| 33 | 
            +
                  
         | 
| 34 | 
            +
                  super @retry_count, @min_retry_interval
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
                attr_reader :min_retry_interval,
         | 
| 38 | 
            +
                            :max_retry_interval
         | 
| 39 | 
            +
                
         | 
| 40 | 
            +
                DEFAULT_RETRY_COUNT = 3
         | 
| 41 | 
            +
                DEFAULT_MIN_RETRY_INTERVAL = 10
         | 
| 42 | 
            +
                DEFAULT_MAX_RETRY_INTERVAL = 90
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                # Overrides the base class implementation of call to determine 
         | 
| 45 | 
            +
                # how the HTTP request should continue retrying
         | 
| 46 | 
            +
                #
         | 
| 47 | 
            +
                # retry_data - Hash. Stores stateful retry data
         | 
| 48 | 
            +
                #
         | 
| 49 | 
            +
                # The retry_data is a Hash which can be used to store
         | 
| 50 | 
            +
                # stateful data about the request execution context (such as an
         | 
| 51 | 
            +
                # incrementing counter, timestamp, etc). The retry_data object
         | 
| 52 | 
            +
                # will be the same instance throughout the lifetime of the request
         | 
| 53 | 
            +
                def apply_retry_policy(retry_data)
         | 
| 54 | 
            +
                  # Adjust retry count
         | 
| 55 | 
            +
                  retry_data[:count] = retry_data[:count] === nil ? 1 : retry_data[:count] + 1
         | 
| 56 | 
            +
                  
         | 
| 57 | 
            +
                  # Adjust retry interval
         | 
| 58 | 
            +
                  increment_delta = (@max_retry_interval - @min_retry_interval).fdiv(2 ** (@retry_count - 1)) * (2 ** (retry_data[:count] - 1));
         | 
| 59 | 
            +
                  retry_data[:interval] = retry_data[:interval] === nil ? @min_retry_interval : [@min_retry_interval + increment_delta, @max_retry_interval].min;
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
            end
         |