diff --git a/app/controllers/ru_captcha/captcha_controller.rb b/app/controllers/ru_captcha/captcha_controller.rb index ef4d729..c85afbf 100644 --- a/app/controllers/ru_captcha/captcha_controller.rb +++ b/app/controllers/ru_captcha/captcha_controller.rb @@ -4,7 +4,11 @@ module RuCaptcha headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate' headers['Pragma'] = 'no-cache' - send_data generate_rucaptcha, disposition: 'inline', type: 'image/png' + if Gem.win_platform? + send_file generate_rucaptcha, disposition: 'inline', type: 'image/png' + else + send_data generate_rucaptcha, disposition: 'inline', type: 'image/png' + end end end end diff --git a/lib/rucaptcha/captcha.rb b/lib/rucaptcha/captcha.rb index b0644d3..34f8e3e 100644 --- a/lib/rucaptcha/captcha.rb +++ b/lib/rucaptcha/captcha.rb @@ -60,12 +60,21 @@ module RuCaptcha -implode #{RuCaptcha.config.implode} -trim label:- png:- CODE - command.strip! - pid, stdin, stdout, stderr = POSIX::Spawn.popen4(command) - Process.waitpid(pid) - err = stderr.read - raise "RuCaptcha: #{err.strip}" if err != nil && err.length > 0 - stdout.read + if Gem.win_platform? + png_file_path = Rails.root.join('tmp', 'cache', "#{code}.png") + command = "convert -size #{size} xc:White -gravity Center -weight 12 -pointsize 20 -annotate 0 \"#{code}\" -trim #{png_file_path}" + require 'open3' + _stdout_str, stderr_str = Open3.capture3(command) + raise "RuCaptcha: #{stderr_str.strip}" if stderr_str != nil && stderr_str.length > 0 + png_file_path + else + command.strip! + pid, stdin, stdout, stderr = POSIX::Spawn.popen4(command) + Process.waitpid(pid) + err = stderr.read + raise "RuCaptcha: #{err.strip}" if err != nil && err.length > 0 + stdout.read + end end end end diff --git a/spec/ocr_spec.rb b/spec/ocr_spec.rb index efe9e38..30e9bc2 100644 --- a/spec/ocr_spec.rb +++ b/spec/ocr_spec.rb @@ -1,15 +1,17 @@ require 'spec_helper' require 'fileutils' +require 'tmpdir' describe 'OCR' do before do + @tmp_dir = Dir.mktmpdir @samples = [] 10.times do @samples << SecureRandom.hex(2) end @filenames = [] @samples.each do |chars| - fname = File.join(File.dirname(__FILE__), "..", "tmp", "#{chars}.png") + fname = File.join(@tmp_dir, "#{chars}.png") img = RuCaptcha::Captcha.create(chars) File.open(fname, 'w+') do |f| f.puts img @@ -19,14 +21,13 @@ describe 'OCR' do end after do - path = File.expand_path File.join(File.dirname(__FILE__), '..', 'tmp/*.png') - FileUtils.rm_f(path) + FileUtils.rm_f(@tmp_dir) end it 'should not read by OCR lib' do results = [] @samples.each do |chars| - str = RTesseract.new(File.join(File.dirname(__FILE__), "..", "tmp", "#{chars}.png"), processor: 'mini_magick').to_s + str = RTesseract.new(File.join(@tmp_dir, "#{chars}.png"), processor: 'mini_magick').to_s results << "- Chars: #{chars}, OCR read #{str.strip}" expect(chars).not_to eq(str) end