Class: HTTP::Connection
- Inherits:
-
Object
- Object
- HTTP::Connection
- Extended by:
- Forwardable
- Defined in:
- lib/http/connection.rb
Overview
A connection to the HTTP server
Constant Summary collapse
- BUFFER_SIZE =
Attempt to read this much data
16_384
- HTTP_1_0 =
HTTP/1.0
"1.0".freeze
- HTTP_1_1 =
HTTP/1.1
"1.1".freeze
Instance Method Summary collapse
-
#close ⇒ void
Close the connection.
-
#expired? ⇒ Boolean
Whether our connection has expired.
-
#failed_proxy_connect? ⇒ Boolean
Whenever proxy connect failed.
-
#finish_response ⇒ void
Callback for when we've reached the end of a response.
-
#initialize(req, options) ⇒ Connection
constructor
A new instance of Connection.
-
#keep_alive? ⇒ Boolean
Whether we're keeping the conn alive.
-
#read_headers! ⇒ void
Reads data from socket up until headers are loaded.
-
#readpartial(size = BUFFER_SIZE) ⇒ String?
Read a chunk of the body.
-
#send_request(req) ⇒ nil
Send a request to the server.
Constructor Details
#initialize(req, options) ⇒ Connection
Returns a new instance of Connection.
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/http/connection.rb', line 21 def initialize(req, ) @persistent = .persistent? @keep_alive_timeout = [:keep_alive_timeout].to_f @pending_request = false @pending_response = false @failed_proxy_connect = false @parser = Response::Parser.new @socket = [:timeout_class].new([:timeout_options]) @socket.connect([:socket_class], req.socket_host, req.socket_port) send_proxy_connect_request(req) start_tls(req, ) reset_timer end |
Instance Method Details
#close ⇒ void
This method returns an undefined value.
Close the connection
116 117 118 119 120 121 |
# File 'lib/http/connection.rb', line 116 def close @socket.close unless @socket.closed? @pending_response = false @pending_request = false end |
#expired? ⇒ Boolean
Whether our connection has expired
131 132 133 |
# File 'lib/http/connection.rb', line 131 def expired? !@conn_expires_at || @conn_expires_at < Time.now end |
#failed_proxy_connect? ⇒ Boolean
Returns whenever proxy connect failed.
48 49 50 |
# File 'lib/http/connection.rb', line 48 def failed_proxy_connect? @failed_proxy_connect end |
#finish_response ⇒ void
This method returns an undefined value.
Callback for when we've reached the end of a response
104 105 106 107 108 109 110 111 112 |
# File 'lib/http/connection.rb', line 104 def finish_response close unless keep_alive? @parser.reset @socket.reset_counter if @socket.respond_to?(:reset_counter) reset_timer @pending_response = false end |
#keep_alive? ⇒ Boolean
Whether we're keeping the conn alive
125 126 127 |
# File 'lib/http/connection.rb', line 125 def keep_alive? !!@keep_alive && !@socket.closed? end |
#read_headers! ⇒ void
This method returns an undefined value.
Reads data from socket up until headers are loaded
94 95 96 97 98 99 100 |
# File 'lib/http/connection.rb', line 94 def read_headers! read_more BUFFER_SIZE until @parser.headers set_keep_alive rescue IOError, Errno::ECONNRESET, Errno::EPIPE => e return if e.is_a?(EOFError) && @parser.headers raise IOError, "problem making HTTP request: #{e}" end |
#readpartial(size = BUFFER_SIZE) ⇒ String?
Read a chunk of the body
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/http/connection.rb', line 75 def readpartial(size = BUFFER_SIZE) return unless @pending_response begin read_more size finished = @parser.finished? rescue EOFError finished = true end chunk = @parser.chunk finish_response if finished chunk.to_s end |
#send_request(req) ⇒ nil
Send a request to the server
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/http/connection.rb', line 56 def send_request(req) if @pending_response fail StateError, "Tried to send a request while one is pending already. Make sure you read off the body." elsif @pending_request fail StateError, "Tried to send a request while a response is pending. Make sure you've fully read the body from the request." end @pending_request = true req.stream @socket @pending_response = true @pending_request = false end |