Class: Aliyun::OSS::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/aliyun/oss/connection.rb

Overview

:nodoc:

Defined Under Namespace

Modules: Management Classes: Options

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Connection

Creates a new connection. Connections make the actual requests to OSS, though these requests are usually called from subclasses of Base.

For details on establishing connections, check the Connection::Management::ClassMethods.



22
23
24
25
# File 'lib/aliyun/oss/connection.rb', line 22

def initialize(options = {})
  @options = Options.new(options)
  connect
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object (private)



146
147
148
# File 'lib/aliyun/oss/connection.rb', line 146

def method_missing(method, *args, &block)
  options[method] || super
end

Instance Attribute Details

#access_key_idObject (readonly)

Returns the value of attribute access_key_id.



16
17
18
# File 'lib/aliyun/oss/connection.rb', line 16

def access_key_id
  @access_key_id
end

#httpObject (readonly)

Returns the value of attribute http.



16
17
18
# File 'lib/aliyun/oss/connection.rb', line 16

def http
  @http
end

#optionsObject (readonly)

Returns the value of attribute options.



16
17
18
# File 'lib/aliyun/oss/connection.rb', line 16

def options
  @options
end

#secret_access_keyObject (readonly)

Returns the value of attribute secret_access_key.



16
17
18
# File 'lib/aliyun/oss/connection.rb', line 16

def secret_access_key
  @secret_access_key
end

Class Method Details

.connect(options = {}) ⇒ Object



6
7
8
# File 'lib/aliyun/oss/connection.rb', line 6

def connect(options = {})
  new(options)
end

.prepare_path(path) ⇒ Object



10
11
12
13
# File 'lib/aliyun/oss/connection.rb', line 10

def prepare_path(path)
  path = path.remove_extended unless path.valid_utf8?
  URI.escape(path)
end

Instance Method Details

#persistent?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/aliyun/oss/connection.rb', line 76

def persistent?
  options[:persistent]
end

#protocol(options = {}) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/aliyun/oss/connection.rb', line 80

def protocol(options = {})
  # This always trumps http.use_ssl?
  if options[:use_ssl] == false 
    'http://'
  elsif options[:use_ssl] || http.use_ssl?
    'https://'
  else
    'http://'
  end
end

#request(verb, path, headers = {}, body = nil, attempts = 0, &block) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/aliyun/oss/connection.rb', line 27

def request(verb, path, headers = {}, body = nil, attempts = 0, &block)
  body.rewind if body.respond_to?(:rewind) unless attempts.zero?      
  
  requester = Proc.new do 
    path    = self.class.prepare_path(path) if attempts.zero? # Only escape the path once
    request = request_method(verb).new(path, headers)
    ensure_content_type!(request)
    add_user_agent!(request)
    authenticate!(request)
    if body
      if body.respond_to?(:read)                                                                
        request.body_stream = body                                                           
      else                                                                                      
        request.body = body                                                                     
      end
      request.content_length = body.respond_to?(:lstat) ? body.stat.size : body.size         
    else
      request.content_length = 0                                                                                       
    end
    http.request(request, &block)
  end
  
  if persistent?
    http.start unless http.started?
    requester.call
  else
    http.start(&requester)
  end
rescue Errno::EPIPE, Timeout::Error, Errno::EINVAL, EOFError
  @http = create_connection
  attempts == 3 ? raise : (attempts += 1; retry)
end

#subdomainObject



72
73
74
# File 'lib/aliyun/oss/connection.rb', line 72

def subdomain
  http.address[/^([^.]+).#{DEFAULT_HOST}$/, 1]
end

#url_for(path, options = {}) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/aliyun/oss/connection.rb', line 60

def url_for(path, options = {})
  authenticate = options.delete(:authenticated)
  # Default to true unless explicitly false
  authenticate = true if authenticate.nil? 
  path         = self.class.prepare_path(path)
  request      = request_method(:get).new(path, {})
  query_string = query_string_authentication(request, options)
  "#{protocol(options)}#{http.address}#{port_string}#{path}".tap do |url|
    url << "?#{query_string}" if authenticate
  end
end