lib/simple_captcha/middleware.rb in galetahub-simple_captcha-0.1.2 vs lib/simple_captcha/middleware.rb in galetahub-simple_captcha-0.1.3

- old
+ new

@@ -1,10 +1,15 @@ # encoding: utf-8 module SimpleCaptcha class Middleware include SimpleCaptcha::ImageHelpers + DEFAULT_SEND_FILE_OPTIONS = { + :type => 'application/octet-stream'.freeze, + :disposition => 'attachment'.freeze, + }.freeze + def initialize(app, options={}) @app = app self end @@ -15,23 +20,39 @@ @app.call(env) end end protected - def make_image(env, body = '', status = 404) + def make_image(env, headers = {}, status = 404) request = Rack::Request.new(env) code = request.params["code"] + body = [] if !code.blank? && Utils::simple_captcha_value(code) - status = 200 - body = generate_simple_captcha_image(code) - body = File.open(body, "rb") + #status, headers, body = @app.call(env) + #status = 200 + #body = generate_simple_captcha_image(code) + #headers['Content-Type'] = 'image/jpeg' + + return send_file(generate_simple_captcha_image(code), :type => 'image/jpeg', :disposition => 'inline', :filename => 'simple_captcha.jpg') end - [status, {'Content-Type' => 'image/jpeg', 'Content-Length' => body.size.to_s}, body] + [status, headers, body] end def captcha_path?(request_path) request_path.include?('/simple_captcha') + end + + def send_file(path, options = {}) + raise MissingFile, "Cannot read file #{path}" unless File.file?(path) and File.readable?(path) + + options[:filename] ||= File.basename(path) unless options[:url_based_filename] + + status = options[:status] || 200 + headers = {"Content-Disposition" => "#{options[:disposition]}; filename='#{options[:filename]}'", "Content-Type" => options[:type], 'Content-Transfer-Encoding' => 'binary', 'Cache-Control' => 'private'} + response_body = File.open(path, "rb") + + [status, headers, response_body] end end end