Skip to content

Commit

Permalink
Break Request#stream into a method object RequestStream
Browse files Browse the repository at this point in the history
Signed-off-by: Sam Phippen <samphippen@googlemail.com>
  • Loading branch information
Sam Phippen committed Sep 5, 2012
1 parent 346b84d commit 45180a2
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 31 deletions.
1 change: 1 addition & 0 deletions lib/http.rb
Expand Up @@ -8,6 +8,7 @@
require 'http/mime_type'
require 'http/options'
require 'http/request'
require 'http/request_stream'
require 'http/response'
require 'http/response_parser'
require 'http/uri_backport' if RUBY_VERSION < "1.9.0"
Expand Down
33 changes: 2 additions & 31 deletions lib/http/request.rb
Expand Up @@ -34,37 +34,8 @@ def [](header)
# Stream the request to a socket
def stream(socket)
request_header = "#{method.to_s.upcase} #{uri.path} HTTP/#{version}#{CRLF}"
@headers.each do |field, value|
request_header << "#{field}: #{value}#{CRLF}"
end

case body
when NilClass
socket << request_header << CRLF
return
when String
request_header << "Content-Length: #{body.length}#{CRLF}" unless @headers['Content-Length']
request_header << CRLF

socket << request_header
socket << body.to_s
when Enumerable
if encoding = @headers['Transfer-Encoding']
raise ArgumentError, "invalid transfer encoding" unless encoding == "chunked"
request_header << CRLF
else
request_header << "Transfer-Encoding: chunked#{CRLF * 2}"
end

socket << request_header
body.each do |chunk|
socket << chunk.bytesize.to_s(16) << CRLF
socket << chunk
end

socket << "0" << CRLF * 2
else raise TypeError, "invalid body type: #{body.class}"
end
rs = Http::RequestStream.new socket, body, @headers, request_header
rs.stream
end
end
end
47 changes: 47 additions & 0 deletions lib/http/request_stream.rb
@@ -0,0 +1,47 @@
module Http
class RequestStream
def initialize(socket, body, headers, headerstart)
@socket = socket
@body = body
@headers = headers
@request_header = headerstart
end

# Stream the request to a socket
def stream
socket = @socket
request_header = @request_header
@headers.each do |field, value|
request_header << "#{field}: #{value}#{CRLF}"
end

case @body
when NilClass
socket << request_header << CRLF
return
when String
request_header << "Content-Length: #{@body.length}#{CRLF}" unless @headers['Content-Length']
request_header << CRLF

socket << request_header
socket << @body.to_s
when Enumerable
if encoding = @headers['Transfer-Encoding']
raise ArgumentError, "invalid transfer encoding" unless encoding == "chunked"
request_header << CRLF
else
request_header << "Transfer-Encoding: chunked#{CRLF * 2}"
end

socket << request_header
@body.each do |chunk|
socket << chunk.bytesize.to_s(16) << CRLF
socket << chunk
end

socket << "0" << CRLF * 2
else raise TypeError, "invalid @body type: #{@body.class}"
end
end
end
end

0 comments on commit 45180a2

Please sign in to comment.