1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/library/net/http/httpgenericrequest/exec_spec.rb
2019-07-27 12:40:09 +02:00

131 lines
5.2 KiB
Ruby

require_relative '../../../../spec_helper'
require 'net/http'
require "stringio"
describe "Net::HTTPGenericRequest#exec when passed socket, version, path" do
before :each do
@socket = StringIO.new("")
@buffered_socket = Net::BufferedIO.new(@socket)
end
it "executes the request over the socket to the path using the HTTP version" do
request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path")
request.exec(@buffered_socket, "1.1", "/some/path")
str = @socket.string
str.should =~ %r[POST /some/path HTTP/1.1\r\n]
str.should =~ %r[Accept: \*/\*\r\n]
str[-4..-1].should == "\r\n\r\n"
request = Net::HTTPGenericRequest.new("GET", true, true, "/some/path",
"Content-Type" => "text/html")
request.exec(@buffered_socket, "1.0", "/some/other/path")
str = @socket.string
str.should =~ %r[GET /some/other/path HTTP/1.0\r\n]
str.should =~ %r[Accept: \*/\*\r\n]
str.should =~ %r[Content-Type: text/html\r\n]
str[-4..-1].should == "\r\n\r\n"
end
describe "when a request body is set" do
it "sets the 'Content-Type' header to 'application/x-www-form-urlencoded' unless the 'Content-Type' header is supplied" do
request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path")
request.body = "Some Content"
request.exec(@buffered_socket, "1.1", "/some/other/path")
str = @socket.string
str.should =~ %r[POST /some/other/path HTTP/1.1\r\n]
str.should =~ %r[Accept: \*/\*\r\n]
str.should =~ %r[Content-Type: application/x-www-form-urlencoded\r\n]
str.should =~ %r[Content-Length: 12\r\n]
str[-16..-1].should == "\r\n\r\nSome Content"
end
it "correctly sets the 'Content-Length' header and includes the body" do
request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path",
"Content-Type" => "text/html")
request.body = "Some Content"
request.exec(@buffered_socket, "1.1", "/some/other/path")
str = @socket.string
str.should =~ %r[POST /some/other/path HTTP/1.1\r\n]
str.should =~ %r[Accept: \*/\*\r\n]
str.should =~ %r[Content-Type: text/html\r\n]
str.should =~ %r[Content-Length: 12\r\n]
str[-16..-1].should == "\r\n\r\nSome Content"
end
end
describe "when a body stream is set" do
it "sets the 'Content-Type' header to 'application/x-www-form-urlencoded' unless the 'Content-Type' header is supplied" do
request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path",
"Content-Length" => "10")
request.body_stream = StringIO.new("a" * 20)
request.exec(@buffered_socket, "1.1", "/some/other/path")
str = @socket.string
str.should =~ %r[POST /some/other/path HTTP/1.1\r\n]
str.should =~ %r[Accept: \*/\*\r\n]
str.should =~ %r[Content-Type: application/x-www-form-urlencoded\r\n]
str.should =~ %r[Content-Length: 10\r\n]
str[-24..-1].should == "\r\n\r\naaaaaaaaaaaaaaaaaaaa"
end
it "sends the whole stream, regardless of the 'Content-Length' header" do
request = Net::HTTPGenericRequest.new("POST", true, true,"/some/path",
"Content-Type" => "text/html",
"Content-Length" => "10")
request.body_stream = StringIO.new("a" * 20)
request.exec(@buffered_socket, "1.1", "/some/other/path")
str = @socket.string
str.should =~ %r[POST /some/other/path HTTP/1.1\r\n]
str.should =~ %r[Accept: \*/\*\r\n]
str.should =~ %r[Content-Type: text/html\r\n]
str.should =~ %r[Content-Length: 10\r\n]
str[-24..-1].should == "\r\n\r\naaaaaaaaaaaaaaaaaaaa"
end
it "sends the request in chunks when 'Transfer-Encoding' is set to 'chunked'" do
request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path",
"Content-Type" => "text/html",
"Transfer-Encoding" => "chunked")
datasize = 1024 * 10
request.body_stream = StringIO.new("a" * datasize)
request.exec(@buffered_socket, "1.1", "/some/other/path")
str = @socket.string
str.should =~ %r[POST /some/other/path HTTP/1.1\r\n]
str.should =~ %r[Accept: \*/\*\r\n]
str.should =~ %r[Content-Type: text/html\r\n]
str.should =~ %r[Transfer-Encoding: chunked\r\n]
str =~ %r[\r\n\r\n]
str = $'
while datasize > 0
chunk_size_line, str = str.split(/\r\n/, 2)
chunk_size = chunk_size_line[/\A[0-9A-Fa-f]+/].to_i(16)
str.slice!(0, chunk_size).should == 'a' * chunk_size
datasize -= chunk_size
str.slice!(0, 2).should == "\r\n"
end
datasize.should == 0
str.should == %"0\r\n\r\n"
end
it "raises an ArgumentError when the 'Content-Length' is not set or 'Transfer-Encoding' is not set to 'chunked'" do
request = Net::HTTPGenericRequest.new("POST", true, true, "/some/path",
"Content-Type" => "text/html")
request.body_stream = StringIO.new("Some Content")
-> { request.exec(@buffered_socket, "1.1", "/some/other/path") }.should raise_error(ArgumentError)
end
end
end