Простой HTTP-сервер в Ruby с использованием TCPServer

Для школьного задания я пытаюсь создать простой HTTP-сервер, используя Ruby и библиотеку сокетов.

Прямо сейчас я могу заставить его отвечать на любое соединение простым приветствием:

require 'socket'

server = TCPServer.open 2000
puts "Listening on port 2000"

loop {
  client = server.accept()
  resp = "Hello?"
  headers = ["HTTP/1.1 200 OK",
             "Date: Tue, 14 Dec 2010 10:48:45 GMT",
             "Server: Ruby",
             "Content-Type: text/html; charset=iso-8859-1",
             "Content-Length: #{resp.length}\r\n\r\n"].join("\r\n")
  client.puts headers
  client.puts resp
  client.close
}

Это работает, как ожидалось. Однако, когда у меня есть сервер, сообщающий мне, кто только что подключился к

puts "Client: #{client.addr[2]}"

и использовал Chromium (браузер) для подключения к localhost: 2000 / (только один раз), я получаю:

Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1
Client: 127.0.0.1

Я предполагаю, что это Chromium запрашивает вспомогательные файлы, такие как favicon.ico , а не мой скрипт делает что-то странное, поэтому я хотел исследовать входящий запрос. Я заменил строку resp = "Hello?" на

resp = client.read()

и перезапустил сервер. Я отклонил запрос в Chromium, и вместо того, чтобы сразу вернуться, он просто завис. Тем временем я получил вывод Client: 127.0.0.1 в выводе моего сервера. Я нажал кнопку «Стоп» в Chromium, а затем на сервере произошел сбой с

server.rb:16:in `write': Broken pipe (Errno::EPIPE)
    from server.rb:16:in `puts'
    from server.rb:16:in `block in <main>'
    from server.rb:6:in `loop'
    from server.rb:6:in `<main>'

. Очевидно, я делаю что-то не так, так как ожидаемое поведение отправляло входящий запрос обратно в качестве ответа.

Что мне не хватает?

8
задан Austin Hyde 25 September 2011 в 21:49
поделиться