class SlowServer::Server

Public Instance Methods

chunk_size() click to toggle source
# File lib/slow_server/server.rb, line 14
def chunk_size
  (config.response_body.size / config.chunks.to_f).round
end
chunks() click to toggle source
# File lib/slow_server/server.rb, line 19
def chunks
  #config.response_body.scan(/.{1,#{chunk_size}}/m)
  # NOTE: to be accurate, chunk_size needs to be variable, or at least increase in a giant burst at the end
  #

  offset = 0
  length = 0
  out = []
  config.chunks.times do |i|
    length = ((config.response_body.size - out.join.size) / (config.chunks - i).to_f).floor
    out << config.response_body[offset..(offset+length)]
    offset += length + 1
  end
  out
end
config() click to toggle source
# File lib/slow_server/server.rb, line 6
def config
  @config ||= ServerConfig.new
end
get_request(socket) click to toggle source
# File lib/slow_server/server.rb, line 45
def get_request(socket)
  STDERR.puts socket.gets
  STDERR.puts "Waiting for #{config.response_delay} seconds"
end
response_headers() click to toggle source
# File lib/slow_server/server.rb, line 36
def response_headers
  [].tap do |h|
    h << "HTTP/1.1 200 OK"
    h << "Content-Type: text/plain"
    h << "Content-Length: #{config.response_body.size}"
    h << "Connection: close"
  end
end
send_response(socket) click to toggle source
# File lib/slow_server/server.rb, line 50
def send_response(socket)
  STDERR.puts "Sending response headers"
  socket.print response_headers.join("\n")
  socket.print "\r\n\r\n"
  chunks.each do |chunk|
    STDERR.puts "Sending #{chunk_size} bytes"
    socket.print chunk
    STDERR.puts "Waiting for #{config.chunk_delay} seconds"
    sleep config.chunk_delay
  end
end
server() click to toggle source
# File lib/slow_server/server.rb, line 10
def server
  @server ||= TCPServer.open('0.0.0.0', config.port)
end
start() click to toggle source
# File lib/slow_server/server.rb, line 62
def start
  loop do
    Thread.start(server.accept) do |socket|
      STDERR.puts "Accepted Connection"
      # NOTE: consider putting a delay in here too
      get_request(socket)

      sleep config.response_delay

      send_response(socket)
      STDERR.print "\n"
      socket.close
    end
  end
end