display nicer error messages for POST /upload
authorLunar <lunar@anargeek.net>
Tue, 28 Feb 2012 23:20:26 +0000 (00:20 +0100)
committerLunar <lunar@anargeek.net>
Thu, 14 Mar 2013 09:12:08 +0000 (10:12 +0100)
We factor out view helpers in Coquelicot::Helpers in order to make them
available from both Coquelicot::Application and Coquelicot::Rack::Upload.

lib/coquelicot.rb
lib/coquelicot/app.rb
lib/coquelicot/helpers.rb [new file with mode: 0644]
lib/coquelicot/rack/upload.rb
spec/coquelicot/rack/upload_spec.rb

index c12aa3d..aed8dcb 100644 (file)
@@ -20,5 +20,6 @@ require 'coquelicot/stored_file'
 require 'coquelicot/depot'
 require 'coquelicot/rack/multipart_parser'
 require 'coquelicot/num'
+require 'coquelicot/helpers'
 require 'coquelicot/rack/upload'
 require 'coquelicot/app'
index a3f4f49..f8ab01d 100644 (file)
@@ -41,6 +41,7 @@ module Coquelicot
   class Application < Sinatra::Base
     register Sinatra::ConfigFile
     register Coquelicot::Auth::Extension
+    helpers Coquelicot::Helpers
 
     set :root, Proc.new { app_file && File.expand_path('../../..', app_file) }
     set :depot_path, Proc.new { File.join(root, 'files') }
@@ -205,20 +206,6 @@ module Coquelicot
         403
       end
     end
-
-    helpers do
-      def clone_url
-        settings.respond_to?(:clone_url) ? settings.clone_url : uri('coquelicot.git')
-      end
-
-      def authenticate(params)
-        Coquelicot.settings.authenticator.authenticate(params)
-      end
-
-      def auth_method
-        Coquelicot.settings.authenticator.class.name.gsub(/Coquelicot::Auth::([A-z0-9]+)Authenticator$/, '\1').downcase
-      end
-    end
   end
 end
 
diff --git a/lib/coquelicot/helpers.rb b/lib/coquelicot/helpers.rb
new file mode 100644 (file)
index 0000000..df00742
--- /dev/null
@@ -0,0 +1,32 @@
+# Coquelicot: "one-click" file sharing with a focus on users' privacy.
+# Copyright © 2010-2012 potager.org <jardiniers@potager.org>
+#           © 2011 mh / immerda.ch <mh+coquelicot@immerda.ch>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+module Coquelicot
+  module Helpers
+    def clone_url
+      settings.respond_to?(:clone_url) ? settings.clone_url : uri('coquelicot.git')
+    end
+
+    def authenticate(params)
+      Coquelicot.settings.authenticator.authenticate(params)
+    end
+
+    def auth_method
+      Coquelicot.settings.authenticator.class.name.gsub(/Coquelicot::Auth::([A-z0-9]+)Authenticator$/, '\1').downcase
+    end
+  end
+end
index 156334d..2f9603d 100644 (file)
@@ -29,6 +29,9 @@ module Coquelicot::Rack
 
   class Upload < Sinatra::Base
     set :logging, true
+    set :views, Proc.new { Coquelicot.settings.views }
+    set :additional_css, Proc.new { Coquelicot.settings.additional_css }
+    helpers Coquelicot::Helpers
 
     def call(env)
       if handle_request?(env)
@@ -90,6 +93,21 @@ module Coquelicot::Rack
       forward
     end
 
+    def error_block!(status)
+      return unless (400..599).include? status
+
+      # XXX: NOT NICE! FIX FIX FIX!
+      FastGettext.add_text_domain 'coquelicot', :path => 'po', :type => 'po'
+      FastGettext.available_locales = [ 'en', 'fr', 'de' ]
+      FastGettext.text_domain = 'coquelicot'
+      FastGettext.locale = request.env['HTTP_ACCEPT_LANGUAGE'] || 'en'
+
+      haml <<-HAML.gsub(/^ */, '')
+        %h1 Oops…
+        %p= response.body.join
+      HAML
+    end
+
     def process!
       # Stop users right now if input has already said the file is too big.
       length = @env['CONTENT_LENGTH']
index 20ae6b3..96791bb 100644 (file)
@@ -221,7 +221,7 @@ MULTIPART_DATA
             subject.status == 400
           end
           it 'should display "Bad Request: fields in unacceptable order"' do
-            subject.body.should == 'Bad Request: fields in unacceptable order'
+            subject.body.should include('Bad Request: fields in unacceptable order')
           end
         end
         context 'when authentication fails' do
@@ -233,7 +233,7 @@ MULTIPART_DATA
             subject.status == 403
           end
           it 'should display "Forbidden"' do
-            subject.body.should == 'Forbidden'
+            subject.body.should include('Forbidden')
           end
           it 'should not add a file' do
             expect { subject }.to_not change { Coquelicot.depot.size }
@@ -249,7 +249,7 @@ MULTIPART_DATA
             subject.status == 503
           end
           it 'should display the error message' do
-            subject.body.should == 'Something bad happened!'
+            subject.body.should include('Something bad happened!')
           end
           it 'should not add a file' do
             expect { subject }.to_not change { Coquelicot.depot.size }
@@ -314,7 +314,7 @@ MULTIPART_DATA
             subject.status == 403
           end
           it 'should display "Forbidden: expiration time too big"' do
-            subject.body.should == 'Forbidden: expiration time too big'
+            subject.body.should include('Forbidden: expiration time too big')
           end
           it 'should not add a file' do
             expect { subject }.to_not change { Coquelicot.depot.size }