ンンンパ

ふとしです

移転しました

Ruby の GServer で message-body がうまくとれなかった

勉強のために Ruby でブログでもつくってみるやんけ、とまず Gserver で簡易サーバーをたてて POST を取得しようとしたらいきなりつまずいた。

require 'gserver'

class HttpServer < GServer
        def initialize(port=8080, host="127.0.0.1", *args)
                super(port, host, *args)
        end


        def serve(io)
                puts 'serve'
                while (line=io.gets)
                        puts line
                end
                puts 'serve end'
        end
end

server = HttpServer.new
server.start
loop do
        sleep 1000
end

こうやってアクセスすると、message-body の一行で長大な時間がかかり、serve end 出力までおかしな時間がかかっていた。

最後は nil を返して平和におわるはずなんだけど、nil を返す前に時間がかかっている感じ?原因がよくわからないし、エラーも出ないし、ぐぐってもそもそも GServer を使っているひとがほとんどいないので答えが見つけられない。

head = {}
io.each do |s|
	if (s.length == 2)
		query = {}
		io.read(head['Content-Length'].to_i).split('&').each do |param|
			key, value = param.split('=')
			query[key] = value
		end
		return query
	end
	key, value = s.split(':')
	head[key] = value
end

もう便利メソッドとか見つけられないしよくわからないので、Content-Length をとってヘッダフィールドのおわりをしめす CRLF から数えて文字をとることにしたら、とりあえずいけました。

とにかく message-body のケツを読もうとすると変な時間のかかりかたをするんですが、どういう理由なのかさっぱりわからないですね。