class EventMachine::HttpRequest

EventMachine based HTTP request class with support for streaming consumption of the response. Response is parsed with a Ragel-generated whitelist parser which supports chunked HTTP encoding.

Example

EventMachine.run {
  http = EventMachine::HttpRequest.new('http://127.0.0.1/').get :query => {'keyname' => 'value'}

  http.callback {
   p http.response_header.status
   p http.response_header
   p http.response

EventMachine.stop
  }
}

Attributes

method[R]
options[R]

Public Instance Methods

delete(options = {}) click to toggle source
# File lib/em-http/request.rb, line 51
def delete options = {}, &blk;  setup_request(:delete,options, &blk);   end
get(options = {}) click to toggle source

Send an HTTP request and consume the response. Supported options:

head: {Key: Value}
  Specify an HTTP header, e.g. {'Connection': 'close'}

query: {Key: Value}
  Specify query string parameters (auto-escaped)

body: String
  Specify the request body (you must encode it for now)

on_response: Proc
  Called for each response body chunk (you may assume HTTP 200
  OK then)
# File lib/em-http/request.rb, line 49
def get    options = {}, &blk;  setup_request(:get,   options, &blk);   end
head(options = {}) click to toggle source
# File lib/em-http/request.rb, line 50
def head   options = {}, &blk;  setup_request(:head,  options, &blk);   end
post(options = {}) click to toggle source
# File lib/em-http/request.rb, line 53
def post   options = {}, &blk;  setup_request(:post,  options, &blk);   end
put(options = {}) click to toggle source
# File lib/em-http/request.rb, line 52
def put    options = {}, &blk;  setup_request(:put,   options, &blk);   end

Protected Instance Methods

send_request(&blk) click to toggle source
# File lib/em-http/request.rb, line 62
def send_request(&blk)
  begin
    EventMachine.connect(@req.host, @req.port, EventMachine::HttpClient) { |c|
      c.uri = @req.uri
      c.method = @req.method
      c.options = @req.options
      c.comm_inactivity_timeout = @req.options[:timeout]
      c.pending_connect_timeout = @req.options[:timeout]
      blk.call(c) unless blk.nil?
    }
  rescue EventMachine::ConnectionError => e
    conn = EventMachine::HttpClient.new("")
    conn.on_error(e.message, true)
    conn.uri = @req.uri
    conn
  end
end
setup_request(method, options, &blk) click to toggle source
# File lib/em-http/request.rb, line 57
def setup_request(method, options, &blk)
  @req = HttpOptions.new(method, @uri, options)
  send_request(&blk)
end

Public Class Methods

new(host) click to toggle source
# File lib/em-http/request.rb, line 29
def initialize(host)
  @uri = host.kind_of?(Addressable::URI) ? host : Addressable::URI::parse(host.to_s)
end