From: "NAKAMURA, Hiroshi" Date: 2009-01-08T23:16:51+09:00 Subject: [ruby-dev:37744] Re: cgi.rbの先頭のboundary読み込み -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 (2008/12/22 0:54), Fujioka wrote: >> http://rubyforge.org/projects/multipart/ で、Rubyで作ったCGIにファイルを >> アップロードしようとして(失敗して)気付いたのですが、cgi.rbの先頭の >> boundaryまでの読み込みがstrict過ぎたりしないでしょうか。 >> >> multipartは、(処理の都合上っぽいですが)HTTP message bodyの先頭に改行が >> ひとつ余計にはいるので、cgi.rbがうまく処理できないようです(l984で、 >> boundary + CRLFが、statusと合致しない; statusの先頭に余分な改行がついて >> る)。先頭の特別扱いを消して、単純に汎用の処理にしてしまえばよさそうです >> が、どうでしょうか。 >> > 私のところでは今までで特に困ったことはなかったのですが、 > どういう時に困りましたでしょうか。 > サンプルがあったら教えていただけませんか? 遅くなりました。以下、multipartというgemを使って、fileをuploadするスクリ プトです。update.cgiが受け側、post.rbが送り側になります。 multipart: http://rubyforge.org/projects/multipart/ % ruby -v ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux] % cat upload.cgi #!/usr/local/bin/ruby require 'cgi' cgi = CGI.new print "Content-Type: text/plain\r\n\r\n" print cgi['upload'].size.to_s + "\n" % cat post.rb require 'multipart' url = ARGV.shift or raise url = URI.parse(url.to_s) proxy = ENV['http_proxy'] proxy = URI.parse(proxy.to_s) req = Net::HTTP::Post.new(url.path) file = Net::HTTP::FileForPost.new(__FILE__, 'text/plain') req.set_multipart_data('upload' => file) http = Net::HTTP::Proxy(proxy.host, proxy.port).new(url.host, url.port) puts http.request(req).read_body % ruby post.rb http://127.0.0.1/cgi-bin/upload.cgi 500 Internal Server Error

Internal Server Error

... /usr/local/lib/ruby/1.8/cgi.rb:984:in `read_multipart': bad content body (EOFError) from /usr/local/lib/ruby/1.8/cgi.rb:1109:in `initialize_query' from /usr/local/lib/ruby/1.8/cgi.rb:2276:in `initialize' from /usr/lib/cgi-bin/upload.cgi:5:in `new' from /usr/lib/cgi-bin/upload.cgi:5 [Thu Jan 08 23:09:27 2009] [error] [client 127.0.0.1] Premature end of script headers: upload.cgi 何かわかるでしょうか。 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (Cygwin) iQEcBAEBAgAGBQJJZgrRAAoJEKYDTjohNqG5Z14H/i8QtuGEJMwgAt/Qi1O4jFDe 7ck0pnHg7b7cwtOFv60TxkQX8oJlhRILZ0Qo6Fmtd5/WozwXUZYCTnB3oJdd84bW EXubxe7XMp4QvVtpcnJRKYMHRKVqnR3HpFqrWZtTEN1reKYrizVQSR27aTNC/1wL UDUaoYEr7xCWjQIWx3mWmA6zRJ3SrJU0EGGcyqV9W/cLoE2JmzJz//Lq+DdTtRgH fySSnsG6KVZ8xLetkJRmHn0Lh1PZcOGyYDnL5H8XfQxzYSlvqpMqV8glXYxI6b04 TdQYax8uD3NJqZu7yeFcADDEyWbDQfxMz3/QhI70bYdnEPr2fIIc4Y+lcn/8Ppk= =jnaK -----END PGP SIGNATURE-----