Для школьного задания я пытаюсь создать простой 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>'
. Очевидно, я делаю что-то не так, так как ожидаемое поведение отправляло входящий запрос обратно в качестве ответа.
Что мне не хватает?