Hi all, Has anyone successfully used WWW::Mechanize with file_column? I''m trying to upload a bunch of images to a custom controller, and something''s going wrong with the parameter names. Using a noddy controller :create action that looks like this: def create render :text => params.inspect end I get this result from a manual upload from a form: {"commit"=>"Create", "snapshot"=>{"screenshot"=>#<File:/tmp/CGI8585.3>, "screenshot_temp"=>"", "processes"=>"foo bar"}, "action"=>"create", "controller"=>"snapshots"} (model name is Snapshot which has a file_column :screenshot, controller is :snapshots) But I get this result from Mechanize: {"snapshot%5Bscreenshot%5D"=>#<File:/tmp/CGI8585.4>, "action"=>"create", "controller"=>"snapshots", "snapshot%5Bprocesses%5D"=>"", "snapshot%5Bscreenshot_temp%5D"=>""} It looks to my untutored eye like the query keys are getting double-quoted on upload. Anyone else seen this, or anything like it? The code driving mechanize looks like this: img = @form.file_uploads.find{|f| f.name == ''snapshot[screenshot]''} img_name = time + ''.png'' img.file_data = File.read(File.join(dirname, img_name)) img.file_name = img_name img.mime_type = ''image/png'' @form.fields.find{|f| f.name == ''snapshot[processes]''}.value = '''' response = @agent.submit(@form) puts response.body @form is found from @agent.get(blah).forms.first, @agent is a WWW::Mechanize.new. I''m stumped - I can''t see anything that looks wrong here. -- Alex
Alex Young wrote:> Hi all,<snip>> I get this result from a manual upload from a form: > > {"commit"=>"Create", "snapshot"=>{"screenshot"=>#<File:/tmp/CGI8585.3>, > "screenshot_temp"=>"", "processes"=>"foo bar"}, "action"=>"create", > "controller"=>"snapshots"} ><snip>> > But I get this result from Mechanize: > > {"snapshot%5Bscreenshot%5D"=>#<File:/tmp/CGI8585.4>, "action"=>"create", > "controller"=>"snapshots", "snapshot%5Bprocesses%5D"=>"", > "snapshot%5Bscreenshot_temp%5D"=>""}I''m replying to my own post here, because I''ve done a little more investigation. WWW::Mechanize uses WEBrick''s HTTPUtils.escape_form on the uploaded form, which escapes ''['' and '']'' via the ''unwise'' character collection. Rails builds its deep params hash by splitting the query key strings on literal ''['' characters, without unquoting, which means that Mechanize''s submission isn''t interpreted in the intended way. Now, which is correct? Firefox submits with literal ''['' characters, which makes me think that Rails is at least partially correct, but should it also accept ''%5B...%5D''? Is WWW::Mechanize out of spec here? Neither would be particularly tricky to patch, and because it''s blocking me I''ll probably do it over the next 24 hours either way. It''s just a question of which is in the wrong and needs correcting. -- Alex
Alex Young wrote: <snip>> I''m replying to my own post here, because I''ve done a little more > investigation.Further details: PHP doesn''t unquote the key values. That''s a fair amount of evidence pointing to WWW::Mechanize being at fault... -- Alex