Ruby でいくつかの単純な HTTP サーバー実装 (スレッドなし、スレッド化、ファイバー、イベントマシンなし) のベンチマークを行っていますが、この単純なコードはスレッドを使用すると失敗します。
#!/usr/bin/env ruby
require 'socket'
server = TCPServer.new("127.0.0.1", 8080)
puts "Listening on 127.0.0.1:8080"
while true
Thread.new(server.accept) do |client|
msg = client.readline
headers = [
"",
"HTTP/1.1 200 OK",
"Date: Fri, 30 Sep 2011 08:11:27 GMT",
"Server: TCP socket test",
"Content-Type: text/html; charset=iso-8859-1",
"Content-Length: #{msg.length}\r\n\r\n"].join("\r\n")
client.write headers
client.write ">>> Data sent:\n #{msg}"
client.close
end
end
単純な curl http://localhost:8080/は、配列の最初の要素が "" またはその他の文字列である場合に正常に動作しますが、"HTTP/1.1 200 OK" 応答が直接返されない場合です。どうしてこれなの?