lib/em-http/request.rb in em-http-request-0.2.7 vs lib/em-http/request.rb in em-http-request-0.2.9
- old
+ new
@@ -1,103 +1,79 @@
-require 'base64'
-require 'addressable/uri'
-
-module EventMachine
-
- # 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
- # }
- # }
- #
-
- class HttpRequest
-
- attr_reader :options, :method
-
- def initialize(host)
- @uri = host.kind_of?(Addressable::URI) ? host : Addressable::URI::parse(host)
- end
-
- # 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)
- #
-
- def get options = {}, &blk; setup_request(:get, options, &blk); end
- def head options = {}, &blk; setup_request(:head, options, &blk); end
- def delete options = {}, &blk; setup_request(:delete, options, &blk); end
- def put options = {}, &blk; setup_request(:put, options, &blk); end
- def post options = {}, &blk; setup_request(:post, options, &blk); end
-
- protected
-
- def setup_request(method, options, &blk)
- raise ArgumentError, "invalid request path" unless /^\// === @uri.path
- @options = options
-
- if proxy = options[:proxy]
- @host_to_connect = proxy[:host]
- @port_to_connect = proxy[:port]
- else
- @host_to_connect = @uri.host
- @port_to_connect = @uri.port
- end
-
- # default connect & inactivity timeouts
- @options[:timeout] = 10 if not @options[:timeout]
-
- # Make sure the ports are set as Addressable::URI doesn't
- # set the port if it isn't there
- if @uri.scheme == "https"
- @uri.port ||= 443
- @port_to_connect ||= 443
- else
- @uri.port ||= 80
- @port_to_connect ||= 80
- end
-
- @method = method.to_s.upcase
- send_request(&blk)
- end
-
- def send_request(&blk)
- begin
- EventMachine.connect(@host_to_connect, @port_to_connect, EventMachine::HttpClient) { |c|
- c.uri = @uri
- c.method = @method
- c.options = @options
- c.comm_inactivity_timeout = @options[:timeout]
- c.pending_connect_timeout = @options[:timeout]
- blk.call(c) unless blk.nil?
- }
- rescue EventMachine::ConnectionError => e
- conn = EventMachine::HttpClient.new("")
- conn.on_error(e.message, true)
- conn
- end
- end
- end
+require 'base64'
+require 'addressable/uri'
+
+module EventMachine
+
+ # 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
+ # }
+ # }
+ #
+
+ class HttpRequest
+
+ attr_reader :options, :method
+
+ def initialize(host)
+ @uri = host.kind_of?(Addressable::URI) ? host : Addressable::URI::parse(host)
+ end
+
+ # 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)
+ #
+
+ def get options = {}, &blk; setup_request(:get, options, &blk); end
+ def head options = {}, &blk; setup_request(:head, options, &blk); end
+ def delete options = {}, &blk; setup_request(:delete,options, &blk); end
+ def put options = {}, &blk; setup_request(:put, options, &blk); end
+ def post options = {}, &blk; setup_request(:post, options, &blk); end
+
+ protected
+
+ def setup_request(method, options, &blk)
+ @req = HttpOptions.new(method, @uri, options)
+ send_request(&blk)
+ end
+
+ 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
+ end
+ end
+ end
end
\ No newline at end of file