Class: EventMachine::Protocols::HttpClient2::Request
- Inherits:
-
Object
- Object
- EventMachine::Protocols::HttpClient2::Request
- Includes:
- Deferrable
- Defined in:
- lib/em/protocols/httpclient2.rb
Overview
:nodoc:
Constant Summary collapse
- HttpResponseRE =
– TODO, inefficient how we’re handling this. Part of it is done so as to make sure we don’t have problems in detecting chunked-encoding, content-length, etc.
/\AHTTP\/(1.[01]) ([\d]{3})/i
- ClenRE =
/\AContent-length:\s*(\d+)/i
- ChunkedRE =
/\ATransfer-encoding:\s*chunked/i
- ColonRE =
/\:\s*/
Instance Attribute Summary collapse
-
#content ⇒ Object
readonly
Returns the value of attribute content.
-
#header_lines ⇒ Object
readonly
Returns the value of attribute header_lines.
-
#headers ⇒ Object
readonly
Returns the value of attribute headers.
-
#internal_error ⇒ Object
readonly
Returns the value of attribute internal_error.
-
#status ⇒ Object
readonly
Returns the value of attribute status.
-
#version ⇒ Object
readonly
Returns the value of attribute version.
Instance Method Summary collapse
-
#initialize(conn, args) ⇒ Request
constructor
A new instance of Request.
-
#receive_chunk_header(ln) ⇒ Object
– Cf RFC 2616 pgh 3.6.1 for the format of HTTP chunks.
-
#receive_chunk_trailer(ln) ⇒ Object
–.
-
#receive_chunked_text(text) ⇒ Object
– We get a single chunk.
-
#receive_header_line(ln) ⇒ Object
– Allow up to ten blank lines before we get a real response line.
-
#receive_line(ln) ⇒ Object
–.
-
#receive_sized_text(text) ⇒ Object
– At the present time, we only handle contents that have a length specified by the content-length header.
- #receive_text(text) ⇒ Object
- #send_request ⇒ Object
Methods included from Deferrable
#callback, #cancel_timeout, #errback, #fail, future, #set_deferred_status, #succeed, #timeout
Constructor Details
#initialize(conn, args) ⇒ Request
Returns a new instance of Request.
60 61 62 63 64 65 66 67 68 |
# File 'lib/em/protocols/httpclient2.rb', line 60 def initialize conn, args @conn = conn @args = args @header_lines = [] @headers = {} @blanks = 0 @chunk_trailer = nil @chunking = nil end |
Instance Attribute Details
#content ⇒ Object (readonly)
Returns the value of attribute content.
57 58 59 |
# File 'lib/em/protocols/httpclient2.rb', line 57 def content @content end |
#header_lines ⇒ Object (readonly)
Returns the value of attribute header_lines.
55 56 57 |
# File 'lib/em/protocols/httpclient2.rb', line 55 def header_lines @header_lines end |
#headers ⇒ Object (readonly)
Returns the value of attribute headers.
56 57 58 |
# File 'lib/em/protocols/httpclient2.rb', line 56 def headers @headers end |
#internal_error ⇒ Object (readonly)
Returns the value of attribute internal_error.
58 59 60 |
# File 'lib/em/protocols/httpclient2.rb', line 58 def internal_error @internal_error end |
#status ⇒ Object (readonly)
Returns the value of attribute status.
54 55 56 |
# File 'lib/em/protocols/httpclient2.rb', line 54 def status @status end |
#version ⇒ Object (readonly)
Returns the value of attribute version.
53 54 55 |
# File 'lib/em/protocols/httpclient2.rb', line 53 def version @version end |
Instance Method Details
#receive_chunk_header(ln) ⇒ Object
– Cf RFC 2616 pgh 3.6.1 for the format of HTTP chunks.
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/em/protocols/httpclient2.rb', line 132 def receive_chunk_header ln if ln.length > 0 chunksize = ln.to_i(16) if chunksize > 0 @conn.set_text_mode(ln.to_i(16)) else @content = @content ? @content.join : '' @chunk_trailer = true end else # We correctly come here after each chunk gets read. # p "Got A BLANK chunk line" end end |
#receive_chunk_trailer(ln) ⇒ Object
–
97 98 99 100 101 102 103 104 |
# File 'lib/em/protocols/httpclient2.rb', line 97 def receive_chunk_trailer ln if ln.length == 0 @conn.pop_request succeed(self) else p "Received chunk trailer line" end end |
#receive_chunked_text(text) ⇒ Object
– We get a single chunk. Append it to the incoming content and switch back to line mode.
152 153 154 155 |
# File 'lib/em/protocols/httpclient2.rb', line 152 def receive_chunked_text text # p "RECEIVED #{text.length} CHUNK" (@content ||= []) << text end |
#receive_header_line(ln) ⇒ Object
– Allow up to ten blank lines before we get a real response line. Allow no more than 100 lines in the header.
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/em/protocols/httpclient2.rb', line 110 def receive_header_line ln if ln.length == 0 if @header_lines.length > 0 process_header else @blanks += 1 if @blanks > 10 @conn.close_connection end end else @header_lines << ln if @header_lines.length > 100 @internal_error = :bad_header @conn.close_connection end end end |
#receive_line(ln) ⇒ Object
–
85 86 87 88 89 90 91 92 93 |
# File 'lib/em/protocols/httpclient2.rb', line 85 def receive_line ln if @chunk_trailer receive_chunk_trailer(ln) elsif @chunking receive_chunk_header(ln) else receive_header_line(ln) end end |
#receive_sized_text(text) ⇒ Object
– At the present time, we only handle contents that have a length specified by the content-length header.
227 228 229 230 231 |
# File 'lib/em/protocols/httpclient2.rb', line 227 def receive_sized_text text @content = text @conn.pop_request succeed(self) end |
#receive_text(text) ⇒ Object
219 220 221 |
# File 'lib/em/protocols/httpclient2.rb', line 219 def receive_text text @chunking ? receive_chunked_text(text) : receive_sized_text(text) end |
#send_request ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/em/protocols/httpclient2.rb', line 70 def send_request az = @args[:authorization] and az = "Authorization: #{az}\r\n" r = [ "#{@args[:verb]} #{@args[:uri]} HTTP/#{@args[:version] || "1.1"}\r\n", "Host: #{@args[:host_header] || "_"}\r\n", az || "", "\r\n" ] @conn.send_data r.join end |