Class: Warden::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/warden/client.rb,
lib/warden/client/v1.rb,
lib/warden/client/version.rb

Defined Under Namespace

Classes: Error, ServerError, V1

Constant Summary collapse

VERSION =
"0.1.0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Client

Returns a new instance of Client.



14
15
16
17
# File 'lib/warden/client.rb', line 14

def initialize(path)
  @path = path
  @v1mode = false
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &blk) ⇒ Object



107
108
109
110
111
112
113
# File 'lib/warden/client.rb', line 107

def method_missing(sym, *args, &blk)
  klass_name = sym.to_s.gsub(/(^|_)([a-z])/) { $2.upcase }
  klass_name += "Request"
  klass = Warden::Protocol.const_get(klass_name)

  call(klass.new(*args))
end

Instance Attribute Details

#pathObject (readonly)

Returns the value of attribute path.



12
13
14
# File 'lib/warden/client.rb', line 12

def path
  @path
end

Instance Method Details

#call(request) ⇒ Object



102
103
104
105
# File 'lib/warden/client.rb', line 102

def call(request)
  write(request)
  read
end

#connectObject



23
24
25
26
# File 'lib/warden/client.rb', line 23

def connect
  raise "already connected" if connected?
  @sock = ::UNIXSocket.new(path)
end

#connected?Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/warden/client.rb', line 19

def connected?
  !@sock.nil?
end

#disconnectObject



28
29
30
31
32
# File 'lib/warden/client.rb', line 28

def disconnect
  raise "not connected" unless connected?
  @sock.close rescue nil
  @sock = nil
end

#ioObject



39
40
41
42
43
44
45
46
47
# File 'lib/warden/client.rb', line 39

def io
  rv = yield
  if rv.nil?
    disconnect
    raise ::EOFError
  end

  rv
end

#readObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/warden/client.rb', line 49

def read
  length = io { @sock.gets }
  data = io { @sock.read(length.to_i) }

  # Discard \r\n
  io { @sock.read(2) }

  response = Warden::Protocol::Message.decode(data).response

  # Raise error replies
  if response.is_a?(Warden::Protocol::ErrorResponse)
    raise Warden::Client::ServerError.new(response.message)
  end

  if @v1mode
    response = V1.response_to_v1(response)
  end

  response
end

#reconnectObject



34
35
36
37
# File 'lib/warden/client.rb', line 34

def reconnect
  disconnect if connected?
  connect
end

#stream(request, &blk) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/warden/client.rb', line 85

def stream(request, &blk)
  unless request.is_a?(Warden::Protocol::StreamRequest)
    msg = "Expected argument to be of type:"
    msg << "'#{Warden::Protocol::StreamRequest}'"
    msg << ", but received: '#{request.class}'."
    raise ArgumentError, msg
  end

  response = call(request)
  while response.exit_status.nil?
    blk.call(response)
    response = read
  end

  response
end

#write(request) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/warden/client.rb', line 70

def write(request)
  if request.kind_of?(Array)
    @v1mode = true
    request = V1.request_from_v1(request.dup)
  end

  unless request.kind_of?(Warden::Protocol::BaseRequest)
    raise "Expected #kind_of? Warden::Protocol::BaseRequest"
  end

  data = request.wrap.encode.to_s
  @sock.write data.length.to_s + "\r\n"
  @sock.write data + "\r\n"
end