Class: Grenache::Http

Inherits:
Base
  • Object
show all
Defined in:
lib/grenache/http.rb,
lib/grenache/http/http_client.rb

Defined Under Namespace

Classes: HttpClient

Instance Method Summary collapse

Instance Method Details

#listen(key, port, opts = {}, &block) ⇒ Object



4
5
6
7
8
9
10
# File 'lib/grenache/http.rb', line 4

def listen(key, port,  opts={}, &block)
  start_http_service(port,&block)

  announce(key, port, opts) do |res|
    puts "#{key} announced #{res}"
  end
end

#request(key, payload, params = {}) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/grenache/http.rb', line 40

def request(key, payload, params={})
  services = lookup(key)
  if services && services.size > 0
    json = ServiceMessage.new(payload,key).to_json
    service = get_random_service services
    resp = http_client.request service, json, params
    msg = ServiceMessage.parse(resp.body)
    return [msg.err, msg.payload]
  else
    return ["NoPeerFound",nil]
  end
rescue Exception => e
  return [e, nil]
end

#start_http_service(port, &block) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/grenache/http.rb', line 12

def start_http_service(port, &block)
  EM.defer {
    app = -> (env) {
      req = ServiceMessage.parse(env['rack.input'].read)
      fingerprint = extract_fingerprint(env['rack.peer_cert'])
      e, payload = block.call(req, fingerprint)
      err = e.kind_of?(Exception) ? e.message : e
      [200,nil, ServiceMessage.new(payload, err, req.rid).to_json]
    }
    server = Thin::Server.new config.service_host, port, {signals: false}, app

    if config.thin_threaded
      server.threaded = true
      server.threadpool_size = config.thin_threadpool_size
    end

    if tls?
      server.ssl = true
      server.ssl_options = {
        private_key_file: config.key,
        cert_chain_file: config.cert_pem,
        verify_peer: true
      }
    end
    server.start
  }
end