class QingStor::SDK::Preprocessor
Constants
- URI_BUCKET_PREFIX
Public Class Methods
compact(object)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 163 def self.compact(object) object.each do |k, v| object[k] = compact v if v.is_a? Hash object.delete k if v.nil? || v == '' end object end
decorate_input(input)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 157 def self.decorate_input(input) input.deep_symbolize_keys! input[:id] = (Random.new.rand * 1_000_000).to_int compact input end
escape(origin)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 171 def self.escape(origin) origin = CGI.escape origin origin.gsub! '%2F', '/' origin.gsub! '%3D', '=' origin.gsub! '+', '%20' origin end
parse_endpoint(endpoint)
click to toggle source
try to parse endpoint: if endpoint invalid, means ip host without scheme, like: 192.168.0.1:3000 if endpoint parsed, and no scheme find, means host without scheme, like: qingstor.dev both above will add default schema at the start, and parse again
# File lib/qingstor/sdk/request/preprocessor.rb, line 183 def self.parse_endpoint(endpoint) if endpoint.blank? raise 'endpoint should not be empty when parse' end begin uri = URI.parse endpoint unless uri.scheme.nil? return uri end rescue URI::InvalidURIError # Ignored and continue, add scheme prefix then end endpoint = "http://#{endpoint}" # add default scheme for endpoint URI.parse endpoint end
preprocess(input)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 29 def self.preprocess(input) input = decorate_input input input[:request_endpoint] = request_endpoint input input[:request_uri] = request_uri input input[:request_body] = request_body input input[:request_headers] = request_headers input input[:request_params] = request_params input display = {} input.each { |k, v| display[k] = v unless k.to_s == 'request_body' } Logger.info "Preprocess QingStor request: [#{input[:id]}] #{display}" input end
request_body(input)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 81 def self.request_body(input) body = input[:request_body] body = body.is_a?(File) ? body.read : body return body if body if input[:request_elements] && !input[:request_elements].empty? json_body = JSON.generate input[:request_elements] Logger.info "QingStor request json: [#{input[:id]}] #{json_body}" json_body end end
request_endpoint(input)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 43 def self.request_endpoint(input) config = input[:config] zone = input[:properties] ? input[:properties][:zone] : nil # handle endpoint directly if it exists if config[:endpoint].present? uri = parse_endpoint(config[:endpoint].to_s) if zone uri.host = "#{zone}.#{uri.host}" end return uri.to_s end if zone "#{config[:protocol]}://#{zone}.#{config[:host]}:#{config[:port]}" else "#{config[:protocol]}://#{config[:host]}:#{config[:port]}" end end
request_headers(input)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 93 def self.request_headers(input) unless input[:request_headers][:Date] input[:request_headers][:Date] = Time.now.utc.strftime '%a, %d %b %Y %H:%M:%S GMT' end if !input[:request_headers][:'Content-Length'] && input[:request_body] input[:request_headers][:'Content-Length'] = input[:request_body].length end if input[:request_method] == 'POST' || input[:request_method] == 'PUT' || input[:request_method] == 'DELETE' unless input[:request_headers][:'Content-Type'] if input[:request_elements] && !input[:request_elements].empty? input[:request_headers][:'Content-Type'] = 'application/json' else input[:request_headers][:'Content-Type'] = MimeMagic.by_path input[:request_uri] end end end unless input[:request_headers][:'Content-Type'] input[:request_headers][:'Content-Type'] = 'application/octet-stream' end unless input[:request_headers][:'User-Agent'] ua = "qingstor-sdk-ruby/#{QingStor::SDK::VERSION} (Ruby v#{RUBY_VERSION}; #{RUBY_PLATFORM})" if input[:config][:additional_user_agent] && !input[:config][:additional_user_agent].empty? ua = "#{ua} #{input[:config][:additional_user_agent]}" end input[:request_headers][:'User-Agent'] = ua end if input[:api_name] == 'Delete Multiple Objects' input[:request_headers][:'Content-MD5'] = Base64.encode64(Digest::MD5.digest(input[:request_body])).strip end # X-QS-MetaData used to handle meta data unless input[:request_headers][:'X-QS-MetaData'].nil? if input[:request_headers][:'X-QS-MetaData'].is_a?(Hash) && !input[:request_headers][:'X-QS-MetaData'].empty? prefix = 'x-qs-meta-' input[:request_headers][:'X-QS-MetaData'].each do |k, v| k = k.to_s # add prefix for meta data in header k = prefix + k input[:request_headers][:"#{k}"] = v end end # remove X-QS-MetaData from request header input[:request_headers].delete :'X-QS-MetaData' end input[:request_headers].map do |k, v| input[:request_headers][k] = escape v.to_s unless v.to_s.ascii_only? end input[:request_headers] end
request_params(input)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 148 def self.request_params(input) unless input[:request_params].nil? input[:request_params].map do |k, v| input[:request_params][k] = escape v.to_s end end input[:request_params] end
request_uri(input)
click to toggle source
# File lib/qingstor/sdk/request/preprocessor.rb, line 62 def self.request_uri(input) config = input[:config] # if enable vhost, and uri property contains bucket-name if config[:enable_virtual_host_style] && input[:properties].present? && input[:properties][:"bucket-name"] uri = parse_endpoint input[:request_endpoint] # modify host, add bucket before uri.host = "#{input[:properties][:"bucket-name"]}.#{uri.host}" input[:request_endpoint] = uri.to_s # handle request_uri, remove prefix (bucket-name) input[:request_uri].delete_prefix! URI_BUCKET_PREFIX if input[:request_uri].start_with? URI_BUCKET_PREFIX end unless input[:properties].nil? input[:properties].each do |k, v| input[:request_uri].gsub! "<#{k}>", (escape v.to_s) end end input[:request_uri] end