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



65
66
67
# File 'lib/dalli/protocol/server_config_parser.rb', line 65

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

.attributes_for_unix_socket(res) ⇒ Object

Raises:



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

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:



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

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:



69
70
71
72
73
# File 'lib/dalli/protocol/server_config_parser.rb', line 69

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



75
76
77
# File 'lib/dalli/protocol/server_config_parser.rb', line 75

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

.normalize_weight(weight) ⇒ Object



79
80
81
# File 'lib/dalli/protocol/server_config_parser.rb', line 79

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

.parse(str) ⇒ Object



22
23
24
25
26
# File 'lib/dalli/protocol/server_config_parser.rb', line 22

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



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

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



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

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