おふくろさまより愛をこめて

mmmpa ふとしです。誠実なプログラミングを心がけたい。

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

    <span class="synPreProc">def</span> <span class="synIdentifier">serve</span>(io)
            puts <span class="synSpecial">'</span><span class="synConstant">serve</span><span class="synSpecial">'</span>
            <span class="synStatement">while</span> (line=io.gets)
                    puts line
            <span class="synStatement">end</span>
            puts <span class="synSpecial">'</span><span class="synConstant">serve end</span><span class="synSpecial">'</span>
    <span class="synPreProc">end</span>

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 のケツを読もうとすると変な時間のかかりかたをするんですが、どういう理由なのかさっぱりわからないですね。