# File spec/dummy_server.rb, line 23 def initialize port @address = '127.0.0.1' @port = port.to_i @tcp_server = TCPServer.new(@address, @port) @socket_threads = [] @sockets = [] @fail_next = false reset_requests end
# File spec/dummy_server.rb, line 131 def start port, &block server = self.new(port) server.start if block_given? begin yield(server) ensure server.stop end else server end end
# File spec/dummy_server.rb, line 71 def fail_next @fail_next = true end
# File spec/dummy_server.rb, line 85 def requests @requests end
# File spec/dummy_server.rb, line 81 def reset_requests @requests = [] end
# File spec/dummy_server.rb, line 33 def start server = self @loop_thread = Thread.new do loop do @socket_threads << Thread.start(@tcp_server.accept) do |socket| @sockets << socket loop do request = read_request(socket) server.requests << request if server.should_fail? socket.shutdown server.failed! break end case request_uri(request) when %rsleep\/(.+)/ then sleep($1.to_f) when %rclose/ then socket.shutdown end respond(socket, 'ok') unless socket.closed? end end end end h = Net::HTTP.new(@address, @port) h.start h.request(Net::HTTP::Get.new('/ping')) h.finish end
# File spec/dummy_server.rb, line 75 def stop @tcp_server.close @loop_thread.kill @socket_threads.each(&:kill) end
# File spec/dummy_server.rb, line 95 def failed! @fail_next = false end
# File spec/dummy_server.rb, line 105 def read_request socket clength = 0 request = "" while data = socket.gets request << data if data.index "Content-Length: " clength = data["Content-Length: ".length..data.length].to_i end break if data == "\r\n" end request << socket.read(clength) unless clength == 0 request end
# File spec/dummy_server.rb, line 100 def request_uri request request.split(%r /)[1] end
# File spec/dummy_server.rb, line 120 def respond socket, content socket.write "HTTP/1.1 200 OK Date: #{Time.now} Content-Type: text/plain Content-Length: 2 OK" socket.flush end
# File spec/dummy_server.rb, line 90 def should_fail? @fail_next == true end