/
http.rb
85 lines (67 loc) · 1.98 KB
/
http.rb
1
2
3
4
5
6
7
8
9
10
11
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
module Faye
class Transport::Http < Transport
def self.usable?(dispatcher, endpoint, &callback)
callback.call(URI === endpoint)
end
def encode(messages)
Faye.to_json(messages)
end
def request(messages)
content = encode(messages)
params = build_params(content)
request = create_request(params)
request.callback do
handle_response(messages, request.response)
store_cookies(request.response_header['SET_COOKIE'])
end
request.errback do
handle_error(messages)
end
request
end
private
def build_params(content)
params = {
:head => {
'Content-Length' => content.bytesize,
'Content-Type' => 'application/json',
'Host' => @endpoint.host + (@endpoint.port ? ":#{@endpoint.port}" : '')
}.merge(@dispatcher.headers),
:body => content,
:timeout => -1 # for em-http-request < 1.0
}
cookie = get_cookies
params[:head]['Cookie'] = cookie unless cookie == ''
params
end
def create_request(params)
version = EventMachine::HttpRequest::VERSION.split('.')[0].to_i
options = {
:inactivity_timeout => 0,
:tls => {:sni_hostname => @endpoint.hostname}
}
if @proxy[:origin]
uri = URI.parse(@proxy[:origin])
options[:proxy] = {:host => uri.host, :port => uri.port}
if uri.user
options[:proxy][:authorization] = [uri.user, uri.password]
end
end
if version >= 1
client = EventMachine::HttpRequest.new(@endpoint.to_s, options)
else
client = EventMachine::HttpRequest.new(@endpoint.to_s)
end
client.post(params)
end
def handle_response(messages, response)
replies = MultiJson.load(response) rescue nil
if replies
receive(replies)
else
handle_error(messages)
end
end
end
Transport.register 'long-polling', Transport::Http
end