Class: EventMachine::Protocols::HttpClient2::Request

Inherits:
Object
  • Object
show all
Includes:
Deferrable
Defined in:
lib/protocols/httpcli2.rb

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

Instance Method Summary collapse

Methods included from Deferrable

#callback, #cancel_timeout, #errback, #fail, future, #set_deferred_failure, #set_deferred_status, #set_deferred_success, #succeed, #timeout

Constructor Details

#initialize(conn, args) ⇒ Request

Returns a new instance of Request.



46
47
48
49
50
51
52
# File 'lib/protocols/httpcli2.rb', line 46

def initialize conn, args
	@conn = conn
	@args = args
	@header_lines = []
	@headers = {}
	@blanks = 0
end

Instance Attribute Details

#contentObject (readonly)

Returns the value of attribute content.



43
44
45
# File 'lib/protocols/httpcli2.rb', line 43

def content
  @content
end

#header_linesObject (readonly)

Returns the value of attribute header_lines.



41
42
43
# File 'lib/protocols/httpcli2.rb', line 41

def header_lines
  @header_lines
end

#headersObject (readonly)

Returns the value of attribute headers.



42
43
44
# File 'lib/protocols/httpcli2.rb', line 42

def headers
  @headers
end

#internal_errorObject (readonly)

Returns the value of attribute internal_error.



44
45
46
# File 'lib/protocols/httpcli2.rb', line 44

def internal_error
  @internal_error
end

#statusObject (readonly)

Returns the value of attribute status.



40
41
42
# File 'lib/protocols/httpcli2.rb', line 40

def status
  @status
end

#versionObject (readonly)

Returns the value of attribute version.



39
40
41
# File 'lib/protocols/httpcli2.rb', line 39

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.



116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/protocols/httpcli2.rb', line 116

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.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



81
82
83
84
85
86
87
88
# File 'lib/protocols/httpcli2.rb', line 81

def receive_chunk_trailer ln
	if ln.length == 0
		@conn.pop_request
		succeed
	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.



136
137
138
139
# File 'lib/protocols/httpcli2.rb', line 136

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.



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/protocols/httpcli2.rb', line 94

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



69
70
71
72
73
74
75
76
77
# File 'lib/protocols/httpcli2.rb', line 69

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.



203
204
205
206
207
# File 'lib/protocols/httpcli2.rb', line 203

def receive_sized_text text
	@content = text
	@conn.pop_request
	succeed
end

#receive_text(text) ⇒ Object



195
196
197
# File 'lib/protocols/httpcli2.rb', line 195

def receive_text text
	@chunking ? receive_chunked_text(text) : receive_sized_text(text)
end

#send_requestObject



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/protocols/httpcli2.rb', line 54

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