Class: EventMachine::Protocols::HttpClient2

Inherits:
Connection
  • Object
show all
Includes:
LineText2
Defined in:
lib/em/protocols/httpclient2.rb

Overview

Usage

EM.run{
  conn = EM::Protocols::HttpClient2.connect 'google.com', 80

  req = conn.get('/')
  req.callback{ |response|
    p(response.status)
    p(response.headers)
    p(response.content)
  }
}

Defined Under Namespace

Classes: Request

Constant Summary

Constants included from LineText2

LineText2::MaxBinaryLength, LineText2::MaxLineLength

Instance Attribute Summary

Attributes inherited from Connection

#signature

Class Method Summary collapse

Instance Method Summary collapse

Methods included from LineText2

#receive_data, #receive_end_of_binary_data, #set_binary_mode, #set_delimiter, #set_line_mode, #set_text_mode

Methods inherited from Connection

#associate_callback_target, #close_connection, #close_connection_after_writing, #comm_inactivity_timeout, #comm_inactivity_timeout=, #detach, #error?, #get_outbound_data_size, #get_peer_cert, #get_peername, #get_pid, #get_sock_opt, #get_sockname, #get_status, new, #notify_readable=, #notify_readable?, #notify_writable=, #notify_writable?, #pause, #paused?, #pending_connect_timeout, #pending_connect_timeout=, #proxy_incoming_to, #proxy_target_unbound, #receive_data, #reconnect, #resume, #send_data, #send_datagram, #send_file_data, #set_comm_inactivity_timeout, #set_pending_connect_timeout, #ssl_handshake_completed, #ssl_verify_peer, #start_tls, #stop_proxying, #stream_file_data

Constructor Details

#initializeHttpClient2

Returns a new instance of HttpClient2.



44
45
46
47
48
# File 'lib/em/protocols/httpclient2.rb', line 44

def initialize
  @authorization = nil
  @closed = nil
  @requests = nil
end

Class Method Details

.connect(*args) ⇒ Object

Make a connection to a remote HTTP server. Can take either a pair of arguments (which will be interpreted as a hostname/ip-address and a port), or a hash. If the arguments are a hash, then supported values include:

:host => a hostname or ip-address
:port => a port number
:ssl => true to enable ssl


241
242
243
244
245
246
247
248
249
250
251
252
253
# File 'lib/em/protocols/httpclient2.rb', line 241

def self.connect *args
  if args.length == 2
    args = {:host=>args[0], :port=>args[1]}
  else
    args = args.first
  end

  h,prt,ssl = args[:host], Integer(args[:port]), (args[:tls] || args[:ssl])
  conn = EM.connect( h, prt, self )
  conn.start_tls if ssl
  conn.set_default_host_header( h, prt, ssl )
  conn
end

Instance Method Details

#connection_completedObject



302
303
304
305
# File 'lib/em/protocols/httpclient2.rb', line 302

def connection_completed
  super
  @connected.succeed
end

#get(args) ⇒ Object

Get a url

req = conn.get(:uri => '/')
req.callback{|response| puts response.content }


260
261
262
263
264
265
266
# File 'lib/em/protocols/httpclient2.rb', line 260

def get args
  if args.is_a?(String)
    args = {:uri=>args}
  end
  args[:verb] = "GET"
  request args
end

#pop_requestObject

– Called by a Request object when it completes.



354
355
356
# File 'lib/em/protocols/httpclient2.rb', line 354

def pop_request
  @requests.pop
end

#post(args) ⇒ Object

Post to a url

req = conn.post('/data')
req.callback{|response| puts response.content }

– XXX there’s no way to supply a POST body.. wtf?



274
275
276
277
278
279
280
# File 'lib/em/protocols/httpclient2.rb', line 274

def post args
  if args.is_a?(String)
    args = {:uri=>args}
  end
  args[:verb] = "POST"
  request args
end

#post_initObject



297
298
299
300
# File 'lib/em/protocols/httpclient2.rb', line 297

def post_init
  super
  @connected = EM::DefaultDeferrable.new
end

#receive_binary_data(text) ⇒ Object



347
348
349
# File 'lib/em/protocols/httpclient2.rb', line 347

def receive_binary_data text
  @requests.last.receive_text text
end

#receive_line(ln) ⇒ Object



338
339
340
341
342
343
344
345
346
# File 'lib/em/protocols/httpclient2.rb', line 338

def receive_line ln
  if req = @requests.last
    req.receive_line ln
  else
    p "??????????"
    p ln
  end

end

#request(args) ⇒ Object



325
326
327
328
329
330
331
332
333
334
335
336
# File 'lib/em/protocols/httpclient2.rb', line 325

def request args
  args[:host_header] = @host_header unless args.has_key?(:host_header)
  args[:authorization] = @authorization unless args.has_key?(:authorization)
  r = Request.new self, args
  if @closed
    r.fail
  else
    (@requests ||= []).unshift r
    @connected.callback {r.send_request}
  end
  r
end

#set_default_host_header(host, port, ssl) ⇒ Object

– Compute and remember a string to be used as the host header in HTTP requests unless the user overrides it with an argument to #request.



288
289
290
291
292
293
294
# File 'lib/em/protocols/httpclient2.rb', line 288

def set_default_host_header host, port, ssl
  if (ssl and port != 443) or (!ssl and port != 80)
    @host_header = "#{host}:#{port}"
  else
    @host_header = host
  end
end

#unbindObject

– All pending requests, if any, must fail. We might come here without ever passing through connection_completed in case we can’t connect to the server. We’ll also get here when the connection closes (either because the server closes it, or we close it due to detecting an internal error or security violation). In either case, run down all pending requests, if any, and signal failure on them.

Set and remember a flag (@closed) so we can immediately fail any subsequent requests.



319
320
321
322
323
# File 'lib/em/protocols/httpclient2.rb', line 319

def unbind
  super
  @closed = true
  (@requests || []).each {|r| r.fail}
end