Q: send_file with Ruby 1.9.1 only works for text files

M

Mark Watson

When I use Ruby 1.8.6 my Rails app works fine. Under Ruby 1.9.1 in
development mode Webrick is trying to "split" binary data and throws
an error:

#<ArgumentError: invalid byte sequence in UTF-8>
["/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/rails-2.2.2/lib/
webrick_server.rb:136:in `split'", "/Users/markw/bin/ruby19/lib/ruby/
gems/1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:136:in
`extract_header_and_body'", "/Users/markw/bin/ruby19/lib/ruby/gems/
1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:109:in
`handle_dispatch'", "/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/
rails-2.2.2/lib/webrick_server.rb:74:in `service'", "/Users/markw/bin/
ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'", "/Users/
markw/bin/ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'", "/
Users/markw/bin/ruby19/lib/ruby/1.9.1/webrick/server.rb:183:in `block
in start_thread'"]

As much as possible I am trying convert all my Ruby code and Rails
apps to Ruby 1.9.x and this is one of the last problems that I am
having problems working around.

I have tried several combinations of send_file calls like:

send_file(filename, :filename => asset.filename, :type => :jpeg)

and none work - unless I am sending a plain text file.

This is obviously a unicode problem.


Thanks,
Mark
 
D

David Palm

When I use Ruby 1.8.6 my Rails app works fine. Under Ruby 1.9.1 in
development mode Webrick is trying to "split" binary data and throws
an error:

#<ArgumentError: invalid byte sequence in UTF-8>

Is webrick part of the standard distribution? (been years since I used it!) Does its tests run?

Does Thin work for you? I've been running Ruby 1.9.1 for a while now on Thin and it works pretty well. I haven't sent any binary data yet though.
["/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/rails-2.2.2/lib/
webrick_server.rb:136:in `split'", "/Users/markw/bin/ruby19/lib/ruby/
gems/1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:136:in
`extract_header_and_body'", "/Users/markw/bin/ruby19/lib/ruby/gems/
1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:109:in
`handle_dispatch'", "/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/
rails-2.2.2/lib/webrick_server.rb:74:in `service'", "/Users/markw/bin/
ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'", "/Users/
markw/bin/ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'", "/
Users/markw/bin/ruby19/lib/ruby/1.9.1/webrick/server.rb:183:in `block
in start_thread'"]

As much as possible I am trying convert all my Ruby code and Rails
apps to Ruby 1.9.x and this is one of the last problems that I am
having problems working around.

I have tried several combinations of send_file calls like:

send_file(filename, :filename => asset.filename, :type => :jpeg)

and none work - unless I am sending a plain text file.

This is obviously a unicode problem.


Thanks,
Mark
 
M

Mark Watson

When I use Ruby 1.8.6 my Rails app works fine. Under Ruby 1.9.1 in
development mode Webrick is trying to "split" binary data and throws
an error:
#<ArgumentError: invalid byte sequence in UTF-8>

Is webrick part of the standard distribution? (been years since I used it!) Does its tests run?

Does Thin work for you? I've been running Ruby 1.9.1 for a while now on Thin and it works pretty well. I haven't sent any binary data yet though.
["/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/rails-2.2.2/lib/
webrick_server.rb:136:in `split'", "/Users/markw/bin/ruby19/lib/ruby/
gems/1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:136:in
`extract_header_and_body'", "/Users/markw/bin/ruby19/lib/ruby/gems/
1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:109:in
`handle_dispatch'", "/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/
rails-2.2.2/lib/webrick_server.rb:74:in `service'", "/Users/markw/bin/
ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'", "/Users/
markw/bin/ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'", "/
Users/markw/bin/ruby19/lib/ruby/1.9.1/webrick/server.rb:183:in `block
in start_thread'"]
As much as possible I am trying convert all my Ruby code and Rails
apps to Ruby 1.9.x and this is one of the last problems that I am
having problems working around.
I have tried several combinations of send_file calls like:
send_file(filename, :filename => asset.filename, :type => :jpeg)
and none work - unless I am sending a plain text file.
This is obviously a unicode problem.
Thanks,
Mark

Thanks for the reference David.

I could not build thin on OS X using Ruby 1.9.1:
rubymain.cpp: In function ‘VALUE t_invoke_popen(VALUE, VALUE)’:
rubymain.cpp:466: error: ‘struct RArray’ has no member named ‘len’

Looks like the code is not updated for the unicode implementation in
Ruby 1.9.1
 
M

Mark Watson

When I use Ruby 1.8.6 my Rails app works fine. Under Ruby 1.9.1 in
development mode Webrick is trying to "split" binary data and throws
an error:

#<ArgumentError: invalid byte sequence in UTF-8>
["/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/rails-2.2.2/lib/
webrick_server.rb:136:in `split'", "/Users/markw/bin/ruby19/lib/ruby/
gems/1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:136:in
`extract_header_and_body'", "/Users/markw/bin/ruby19/lib/ruby/gems/
1.9.1/gems/rails-2.2.2/lib/webrick_server.rb:109:in
`handle_dispatch'", "/Users/markw/bin/ruby19/lib/ruby/gems/1.9.1/gems/
rails-2.2.2/lib/webrick_server.rb:74:in `service'", "/Users/markw/bin/
ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'", "/Users/
markw/bin/ruby19/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'", "/
Users/markw/bin/ruby19/lib/ruby/1.9.1/webrick/server.rb:183:in `block
in start_thread'"]

As much as possible I am trying convert all my Ruby code and Rails
apps to Ruby 1.9.x and this is one of the last problems that I am
having problems working around.

I have tried several combinations of send_file calls like:

send_file(filename, :filename => asset.filename, :type => :jpeg)

and none work - unless I am sending a plain text file.

This is obviously a unicode problem.

Thanks,
Mark

BTW, I can patch webrick_server.rb to make everything work:

def extract_header_and_body(data)
data.rewind
data = data.read

# MLW 2/1/2009
if data.ascii_only?
raw_header, body = *data.split(/^[\xd\xa]{2}/on, 2)
else
aa = data.lines.to_a
ind = aa.index("\r\n")
raw_header = aa[0...ind].join
body = aa[ind+1..-1].join
end

#raw_header, body = *data.split(/^[\xd\xa]{2}/on, 2)
header = WEBrick::HTTPUtils::parse_header(raw_header)

return header, body
end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top