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