Class: Dalli::Protocol::ServerConfigParser

Inherits:
Object
  • Object
show all
Defined in:
lib/dalli/protocol/server_config_parser.rb

Overview

Dalli::Protocol::ServerConfigParser parses a server string passed to a Dalli::Protocol::Binary instance into the hostname, port, weight, and socket_type.

Constant Summary collapse

MEMCACHED_URI_PROTOCOL =
'memcached://'
SERVER_CONFIG_REGEXP =

TODO: Revisit this, especially the IP/domain part. Likely can limit character set to LDH + ‘.’. Hex digit section is there to support IPv6 addresses, which need to be specified with a bounding []

/\A(\[([\h:]+)\]|[^:]+)(?::(\d+))?(?::(\d+))?\z/.freeze
DEFAULT_PORT =
11_211
DEFAULT_WEIGHT =
1

Class Method Summary collapse

Class Method Details

.attributes_for_tcp_socket(res) ⇒ Object



67
68
69
# File 'lib/dalli/protocol/server_config_parser.rb', line 67

def self.attributes_for_tcp_socket(res)
  [normalize_port(res[3]), normalize_weight(res[4])]
end

.attributes_for_unix_socket(res) ⇒ Object

Raises:



60
61
62
63
64
65
# File 'lib/dalli/protocol/server_config_parser.rb', line 60

def self.attributes_for_unix_socket(res)
  # in case of unix socket, allow only setting of weight, not port
  raise Dalli::DalliError, "Could not parse hostname #{res[0]}" if res[4]

  [nil, normalize_weight(res[3])]
end

.deconstruct_string(str) ⇒ Object

Raises:



53
54
55
56
57
58
# File 'lib/dalli/protocol/server_config_parser.rb', line 53

def self.deconstruct_string(str)
  mtch = str.match(SERVER_CONFIG_REGEXP)
  raise Dalli::DalliError, "Could not parse hostname #{str}" if mtch.nil? || mtch[1] == '[]'

  mtch
end

.normalize_host_from_match(str, res) ⇒ Object

Raises:



71
72
73
74
75
# File 'lib/dalli/protocol/server_config_parser.rb', line 71

def self.normalize_host_from_match(str, res)
  raise Dalli::DalliError, "Could not parse hostname #{str}" if res.nil? || res[1] == '[]'

  res[2] || res[1]
end

.normalize_port(port) ⇒ Object



77
78
79
# File 'lib/dalli/protocol/server_config_parser.rb', line 77

def self.normalize_port(port)
  Integer(port || DEFAULT_PORT)
end

.normalize_weight(weight) ⇒ Object



81
82
83
# File 'lib/dalli/protocol/server_config_parser.rb', line 81

def self.normalize_weight(weight)
  Integer(weight || DEFAULT_WEIGHT)
end

.parse(str) ⇒ Object



24
25
26
27
28
# File 'lib/dalli/protocol/server_config_parser.rb', line 24

def self.parse(str)
  return parse_non_uri(str) unless str.start_with?(MEMCACHED_URI_PROTOCOL)

  parse_uri(str)
end

.parse_non_uri(str) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/dalli/protocol/server_config_parser.rb', line 39

def self.parse_non_uri(str)
  res = deconstruct_string(str)

  hostname = normalize_host_from_match(str, res)
  if hostname.start_with?('/')
    socket_type = :unix
    port, weight = attributes_for_unix_socket(res)
  else
    socket_type = :tcp
    port, weight = attributes_for_tcp_socket(res)
  end
  [hostname, port, socket_type, weight, {}]
end

.parse_uri(str) ⇒ Object



30
31
32
33
34
35
36
37
# File 'lib/dalli/protocol/server_config_parser.rb', line 30

def self.parse_uri(str)
  uri = URI.parse(str)
  auth_details = {
    username: uri.user,
    password: uri.password
  }
  [uri.host, normalize_port(uri.port), :tcp, DEFAULT_WEIGHT, auth_details]
end