Hatena::ブログ(Diary)

d.hatena.zeg.la このページをアンテナに追加 RSSフィード

2008-01-31

mongrelでResponse HeaderのServerヘッダを隠す方法[mongrel][rails][ruby]

斜め読みしかしてないがmongrel-1.1.3のソース

./ext/http11/http11.cで

387   DEF_GLOBAL(mongrel_version, "Mongrel 1.1.3"); /* XXX Why is this defined here? */
388   DEF_GLOBAL(server_software, "SERVER_SOFTWARE");
//でmongrelのバージョンなんかが定義されてて
151 void header_done(void *data, const char *at, size_t length
.
.
//ここでセットされてるっぽい
186   rb_hash_aset(req, global_server_protocol, global_server_protocol_value);
187   rb_hash_aset(req, global_server_software, global_mongrel_version);
188 }

/ext/http11/http11_parser.c

 341     if(parser->header_done != NULL)
 342       parser->header_done(parser->data, p + 1, pe - p - 1);
//でheader_done関数は呼ばれている

どうもmongrelの立ち上げ段階でセットされてしまって

ruby側みてみると

./lib/mongrel/cgi.rb
#ここでServerヘッダー出力を制御できそう!!
 73         @head['Server'] = options['server'] || env_table['SERVER_SOFTWARE']
#さらに追ってみると
127     def out(options = "text/html", really_final=@default_really_final)
128       if @out_called || !really_final
129         # don't do it more than once or if it's not the really final call
130         return
131       end
132       #ここで呼ばれている
133       header(options)
134
135       @response.start status do |head, body|
136         send_cookies(head)
137
138         @head.each {|k,v| head[k] = v}
139         body.write(yield || "")
140       end
141
142       @out_called = true
143     end

./lib/mongrel/rails.rb

#ハードコーディングされてる
 81             cgi.out("text/html",true) {""}

optionがハードコードされてる+optionの方が

優先されてる(||より前)なので

どうやら本当にmongrelに手を加えるしかなさそう

結局これをつかって

no title

Header unset Serverでmongrel側から送信されるServerヘッダを削除

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証