summaryrefslogtreecommitdiff
path: root/spec/ruby/library
diff options
context:
space:
mode:
authorBenoit Daloze <eregontp@gmail.com>2021-08-13 18:09:14 +0200
committerBenoit Daloze <eregontp@gmail.com>2021-08-13 18:09:14 +0200
commit73085c8d8ee5456b6c157042b78d812f3d1ab054 (patch)
tree052a33ae7e33c9264fd3f748fc65db72e00fbcad /spec/ruby/library
parentac4d53bd461ff386cd45fdd484ffb6b628a251ad (diff)
Update to ruby/spec@330c641
Diffstat (limited to 'spec/ruby/library')
-rw-r--r--spec/ruby/library/net/http/http/fixtures/http_server.rb150
-rw-r--r--spec/ruby/library/net/http/http/post_spec.rb2
-rw-r--r--spec/ruby/library/net/http/http/send_request_spec.rb2
3 files changed, 84 insertions, 70 deletions
diff --git a/spec/ruby/library/net/http/http/fixtures/http_server.rb b/spec/ruby/library/net/http/http/fixtures/http_server.rb
index c06012cc86..63543b46a9 100644
--- a/spec/ruby/library/net/http/http/fixtures/http_server.rb
+++ b/spec/ruby/library/net/http/http/fixtures/http_server.rb
@@ -1,5 +1,4 @@
-require 'webrick'
-require 'webrick/httpservlet/abstract'
+require 'socket'
module NetHTTPSpecs
class NullWriter
@@ -9,102 +8,117 @@ module NetHTTPSpecs
def printf(*args) end
end
- class SpecServlet < WEBrick::HTTPServlet::AbstractServlet
- def handle(req, res)
- reply(req, res)
+ class SmallHTTPServer
+ def initialize(bind_address)
+ @server = TCPServer.new(bind_address, 0)
+ @running = Mutex.new
+ @thread = Thread.new {
+ Thread.current.abort_on_exception = true
+ listen
+ }
end
- %w{ do_GET do_HEAD do_POST do_PUT do_PROPPATCH do_LOCK do_UNLOCK
- do_OPTIONS do_PROPFIND do_DELETE do_MOVE do_COPY
- do_MKCOL do_TRACE }.each do |method|
- alias_method method.to_sym, :handle
+ def port
+ @server.addr[1]
end
- end
- class RequestServlet < SpecServlet
- def reply(req, res)
- res.content_type = "text/plain"
- res.body = "Request type: #{req.request_method}"
+ def listen
+ loop do
+ begin
+ client = @server.accept
+ rescue IOError => e
+ if @running.locked? # close
+ break
+ else
+ raise e
+ end
+ end
+
+ handle_client(client)
+ end
end
- end
- class RequestBodyServlet < SpecServlet
- def reply(req, res)
- res.content_type = "text/plain"
- res.body = req.body
+ def handle_client(client)
+ begin
+ until client.closed?
+ request = client.gets("\r\n\r\n")
+ break unless request
+ handle_request(client, request)
+ end
+ ensure
+ client.close
+ end
end
- end
- class RequestHeaderServlet < SpecServlet
- def reply(req, res)
- res.content_type = "text/plain"
- res.body = req.header.inspect
+ def parse_request(request)
+ request, *headers = request.chomp.lines.map { |line| line.chomp }
+ request_method, request_uri, _http_version = request.split
+ headers = headers.map { |line| line.split(': ', 2) }.to_h
+ [request_method, request_uri, headers]
end
- end
- class RequestBasicAuthServlet < SpecServlet
- def reply(req, res)
- res.content_type = "text/plain"
+ def handle_request(client, request)
+ request_method, request_uri, headers = parse_request(request)
+
+ if headers.include? 'Content-Length'
+ request_body_size = Integer(headers['Content-Length'])
+ request_body = client.read(request_body_size)
+ end
+
+ case request_uri
+ when '/'
+ raise request_method unless request_method == 'GET'
+ reply(client, "This is the index page.", request_method)
+ when '/request'
+ reply(client, "Request type: #{request_method}", request_method)
+ when '/request/body'
+ reply(client, request_body, request_method)
+ when '/request/header'
+ reply(client, headers.inspect, request_method)
+ when '/request/basic_auth'
+ reply(client, "username: \npassword: ", request_method)
+ else
+ raise request_uri
+ end
+ end
- WEBrick::HTTPAuth.basic_auth(req, res, "realm") do |user, pass|
- res.body = "username: #{user}\npassword: #{pass}"
- true
+ def reply(client, body, request_method)
+ client.print "HTTP/1.1 200 OK\r\n"
+ if request_method == 'HEAD'
+ client.close
+ else
+ client.print "Content-Type: text/plain\r\n"
+ client.print "Content-Length: #{body.bytesize}\r\n"
+ client.print "\r\n"
+ client.print body
end
end
+
+ def close
+ @running.lock
+ @server.close
+ @thread.join
+ end
end
@server = nil
- @server_thread = nil
class << self
def port
raise "server not started" unless @server
- @server.config[:Port]
+ @server.port
end
def start_server
bind_address = platform_is(:windows) ? "localhost" : "127.0.0.1"
- server_config = {
- BindAddress: bind_address,
- Port: 0,
- Logger: WEBrick::Log.new(NullWriter.new),
- AccessLog: [],
- ServerType: Thread
- }
-
- @server = WEBrick::HTTPServer.new(server_config)
-
- @server.mount_proc('/') do |req, res|
- res.content_type = "text/plain"
- res.body = "This is the index page."
- end
- @server.mount('/request', RequestServlet)
- @server.mount("/request/body", RequestBodyServlet)
- @server.mount("/request/header", RequestHeaderServlet)
- @server.mount("/request/basic_auth", RequestBasicAuthServlet)
-
- @server_thread = @server.start
+ @server = SmallHTTPServer.new(bind_address)
end
def stop_server
if @server
- begin
- @server.shutdown
- rescue Errno::EPIPE, Errno::EBADF
- # Because WEBrick is not thread-safe and only catches IOError
-
- # EBADF can happen because WEBrick @server_thread concurrently closes the shutdown pipe
- # once @status = :Shutdown, while the current thread does write_nonblock("\0").
- # On MRI this EBADF is replaced by IOError due to the GIL around both #close and #write_nonblock.
- end
+ @server.close
@server = nil
end
- if @server_thread
- @server_thread.join
- @server_thread = nil
- end
- timeout = WEBrick::Utils::TimeoutHandler
- timeout.terminate if timeout.respond_to?(:terminate)
end
end
end
diff --git a/spec/ruby/library/net/http/http/post_spec.rb b/spec/ruby/library/net/http/http/post_spec.rb
index 9f20a03c85..891e20aaca 100644
--- a/spec/ruby/library/net/http/http/post_spec.rb
+++ b/spec/ruby/library/net/http/http/post_spec.rb
@@ -27,7 +27,7 @@ describe "Net::HTTP.post" do
it "sends Content-Type: application/x-www-form-urlencoded by default" do
response = Net::HTTP.post(URI("http://localhost:#{NetHTTPSpecs.port}/request/header"), "test=test")
- response.body.should include('"content-type"=>["application/x-www-form-urlencoded"]')
+ response.body.should include('"Content-Type"=>"application/x-www-form-urlencoded"')
end
it "does not support HTTP Basic Auth" do
diff --git a/spec/ruby/library/net/http/http/send_request_spec.rb b/spec/ruby/library/net/http/http/send_request_spec.rb
index 47b3eef5b9..83e9448b8b 100644
--- a/spec/ruby/library/net/http/http/send_request_spec.rb
+++ b/spec/ruby/library/net/http/http/send_request_spec.rb
@@ -54,7 +54,7 @@ describe "Net::HTTP#send_request" do
@methods.each do |method|
response = @http.send_request(method, "/request/header", "test=test", "referer" => referer)
- response.body.should include('"referer"=>["' + referer + '"]')
+ response.body.should include('"Referer"=>"' + referer + '"')
end
end
end