-----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
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
...

/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-----