From: nobu.nakada@... Date: 2003-12-10T12:23:45+09:00 Subject: [ruby-list:38884] Re: [cgi.rb] read_multipart でエラー なかだです。 At Wed, 10 Dec 2003 11:03:50 +0900, Kazuhiko wrote: > Premature end of script headers: attach.cgi, referer: http://www.example.com/hiki/?c=edit;p=FrontPage > /usr/lib/ruby/1.8/cgi.rb:1039:in `read_multipart': uninitialized constant CGI::QueryExtension::StringIO (NameError), referer: http://www.example.com/hiki/?c=edit;p=FrontPage > from /usr/lib/ruby/1.8/cgi.rb:987:in `loop', referer: http://www.example.com/hiki/?c=edit;p=FrontPage > from /usr/lib/ruby/1.8/cgi.rb:1076:in `read_multipart', referer: http://www.example.com/hiki/?c=edit;p=FrontPage > from /usr/lib/ruby/1.8/cgi.rb:1116:in `initialize_query', referer: http://www.example.com/hiki/?c=edit;p=FrontPage > from /usr/lib/ruby/1.8/cgi.rb:2299:in `initialize', referer: http://www.example.com/hiki/?c=edit;p=FrontPage > from /home/hiki/public_html/private/attach.cgi:10:in `new', referer: http://www.example.com/hiki/?c=edit;p=FrontPage > from /home/hiki/public_html/private/attach.cgi:10:in `attach_image', referer: http://www.example.com/hiki/?c=edit;p=FrontPage > from /home/hiki/public_html/private/attach.cgi:83, referer: http://www.example.com/hiki/?c=edit;p=FrontPage > > (1.8.1-preview3 と CVS HEAD で cgi.rb は変化なさそう) > > とりあえず以下のような修正で動くようになりました。 stringioは常にrequireされてるわけではないからですね。そもそも local_pathはpathのaliasでいいんじゃないかという気がするのですが。 Index: lib/cgi.rb =================================================================== RCS file: /cvs/ruby/src/ruby/lib/cgi.rb,v retrieving revision 1.66 diff -u -2 -p -d -r1.66 cgi.rb --- lib/cgi.rb 22 Nov 2003 03:59:53 -0000 1.66 +++ lib/cgi.rb 24 Nov 2003 12:37:45 -0000 @@ -922,13 +922,11 @@ class CGI module QueryExtension - for env in %w[ CONTENT_LENGTH SERVER_PORT ] - eval( <<-END ) - def #{env.sub(/^HTTP_/n, '').downcase} - env_table["#{env}"] && Integer(env_table["#{env}"]) - end - END + %w[ CONTENT_LENGTH SERVER_PORT ].each do |env| + define_method(env.sub(/^HTTP_/n, '').downcase) do + val = env_table[env] && Integer(val) + end end - for env in %w[ AUTH_TYPE CONTENT_TYPE GATEWAY_INTERFACE PATH_INFO + %w[ AUTH_TYPE CONTENT_TYPE GATEWAY_INTERFACE PATH_INFO PATH_TRANSLATED QUERY_STRING REMOTE_ADDR REMOTE_HOST REMOTE_IDENT REMOTE_USER REQUEST_METHOD SCRIPT_NAME @@ -937,10 +935,8 @@ class CGI HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM HTTP_HOST - HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT ] - eval( <<-END ) - def #{env.sub(/^HTTP_/n, '').downcase} - env_table["#{env}"] - end - END + HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT ].each do |env| + define_method(env.sub(/^HTTP_/n, '').downcase) do + env_table[env] + end end @@ -1035,32 +1031,20 @@ class CGI body.rewind - eval <<-END - def body.local_path - #{(body.class == StringIO)? "" : body.path.dump} - end - END - /Content-Disposition:.* filename="?([^\";]*)"?/ni.match(head) - eval <<-END - def body.original_filename - #{ - filename = ($1 or "").dup - if /Mac/ni.match(env_table['HTTP_USER_AGENT']) and - /Mozilla/ni.match(env_table['HTTP_USER_AGENT']) and - (not /MSIE/ni.match(env_table['HTTP_USER_AGENT'])) - CGI::unescape(filename) - else - filename - end.dump.untaint - }.taint - end - END - + filename = ($1 or "") + if /Mac/ni.match(env_table['HTTP_USER_AGENT']) and + /Mozilla/ni.match(env_table['HTTP_USER_AGENT']) and + (not /MSIE/ni.match(env_table['HTTP_USER_AGENT'])) + filename = CGI::unescape(filename) + end + /Content-Type: (.*)/ni.match(head) - eval <<-END - def body.content_type - #{($1 or "").dump.untaint}.taint - end - END + content_type = ($1 or "") + + (class << body; self; end).class_eval do + alias local_path path + define_method(:original_filename) {filename.dup.taint} + define_method(:content_type) {content_type.dup.taint} + end /Content-Disposition:.* name="?([^\";]*)"?/ni.match(head) @@ -2298,6 +2282,10 @@ class CGI else initialize_query() # set @params, @cookies - eval "CGI_PARAMS = @params.nil? ? nil : @params.dup" - eval "CGI_COOKIES = @cookies.nil? ? nil : @cookies.dup" + params = @params.nil? ? nil : @params.dup + cooikies = @cookies.nil? ? nil : @cookies.dup + (class << self; self; end).class_eval do + const_set(:CGI_PARAMS, params) + const_set(:CGI_COOKIES, cookies) + end if defined?(MOD_RUBY) and (RUBY_VERSION < "1.4.3") raise "Please, use ruby1.4.3 or later." @@ -2305,6 +2293,8 @@ class CGI at_exit() do if defined?(CGI_PARAMS) - CGI.class_eval("remove_const(:CGI_PARAMS)") - CGI.class_eval("remove_const(:CGI_COOKIES)") + CGI.class_eval do + remove_const(:CGI_PARAMS) + remove_const(:CGI_COOKIES) + end end end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦