Я пытаюсь отправить запрос на созданный мной TCPServer, прочитать запрос и, в конечном итоге, записать его в файл, который я создаю. Это работает некоторое время, но время ожидания часто. Затем это приводит к зависанию сервера, поскольку я считаю, что он блокирует закрытие сокета сервером.
Все единственные примеры предполагают, что я справляюсь с этим, спасая исключение Errno::EAGAIN, а также EOFError. Обработка Errno::EAGAIN с использованием IO.select и повторной попытки работает в 75% случаев, но занимает много времени и, кажется, все равно истекает в остальных 25% случаев. Ниже приведен мой код для создания TCPServer, создания сокета и обработки запроса. Любая помощь будет принята с благодарностью.
server = TCPServer.new('127.0.0.1', PORT)
while socket_events = select([server], nil, nil)
puts "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n"
Thread.new(server.accept) do |socket|
request = socket.gets
content_length = socket.readpartial(1024).match(/Content-Length: \d+/).to_s.split(': ')
content_length = content_length[1].to_i
puts content_length
@content_file = File.new("#{PATH}/#{SecureRandom.uuid}", "w")
@buffer = []
begin
@buffer << socket.read_nonblock(content_length)
puts "buffer is #{@buffer}"
rescue Errno::EAGAIN => e
puts "#{e.message}"
puts "#{e.backtrace}"
IO.select([socket])
retry
rescue EOFError
$STDOUT.puts "-" * 50
puts "request data is #{@buffer}"
$STDOUT.puts "-" * 50
break
end
response = "" #@content_file.path
headers = ["HTTP/1.1 200 OK", "server: ruby", "Content-Type: text/plain", "Content-Length: #{response.bytesize}\r\n\r\n"].join("\r\n")
socket.print headers
socket.print response
@content_file.close
socket.close
end
end