From 2f87153df97cf29a05d6af7c7e09ee7d428090d9 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki <drogus@gmail.com> Date: Mon, 5 Nov 2012 21:45:21 +0100 Subject: [PATCH] Move CORS middleware in front of the stack If there is an error somewhere along the line (like in DB connection management), it should not interfere with returning proper result for OPTIONS request. Otherwise it's hard to guess why the actual request in the browser was not properly sent. --- lib/travis/api/app.rb | 2 ++ lib/travis/api/app/cors.rb | 20 ++++++++++++++++++++ lib/travis/api/app/middleware/cors.rb | 22 ---------------------- spec/unit/{middleware => }/cors_spec.rb | 4 ++-- 4 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 lib/travis/api/app/cors.rb delete mode 100644 lib/travis/api/app/middleware/cors.rb rename spec/unit/{middleware => }/cors_spec.rb (93%) diff --git a/lib/travis/api/app.rb b/lib/travis/api/app.rb index ddfe2fc9..049b889b 100644 --- a/lib/travis/api/app.rb +++ b/lib/travis/api/app.rb @@ -25,6 +25,7 @@ module Travis::Api autoload :Helpers, 'travis/api/app/helpers' autoload :Middleware, 'travis/api/app/middleware' autoload :Responders, 'travis/api/app/responders' + autoload :Cors, 'travis/api/app/cors' Rack.autoload :SSL, 'rack/ssl' @@ -52,6 +53,7 @@ module Travis::Api def initialize @app = Rack::Builder.app do + use Travis::Api::App::Cors use Hubble::Rescuer, env: Travis.env, codename: ENV['CODENAME'] if Endpoint.production? && ENV['HUBBLE_ENDPOINT'] use Rack::Protection::PathTraversal use Rack::SSL if Endpoint.production? diff --git a/lib/travis/api/app/cors.rb b/lib/travis/api/app/cors.rb new file mode 100644 index 00000000..781efc00 --- /dev/null +++ b/lib/travis/api/app/cors.rb @@ -0,0 +1,20 @@ +require 'travis/api/app' + +class Travis::Api::App + # Implements Cross-Origin Resource Sharing. Supported by all major browsers. + # See http://www.w3.org/TR/cors/ + # + # TODO: Be smarter about origin. + class Cors < Base + before do + headers['Access-Control-Allow-Origin'] = "*" + headers['Access-Control-Allow-Credentials'] = "true" + headers['Access-Control-Expose-Headers'] = "Content-Type, Cache-Control, Expires, Etag, Last-Modified" + end + + options // do + headers['Access-Control-Allow-Methods'] = "HEAD, GET, POST, PATCH, PUT, DELETE" + headers['Access-Control-Allow-Headers'] = "Content-Type, Authorization, Accept, If-None-Match, If-Modified-Since" + end + end +end diff --git a/lib/travis/api/app/middleware/cors.rb b/lib/travis/api/app/middleware/cors.rb deleted file mode 100644 index 5a93b7a3..00000000 --- a/lib/travis/api/app/middleware/cors.rb +++ /dev/null @@ -1,22 +0,0 @@ -require 'travis/api/app' - -class Travis::Api::App - class Middleware - # Implements Cross-Origin Resource Sharing. Supported by all major browsers. - # See http://www.w3.org/TR/cors/ - # - # TODO: Be smarter about origin. - class Cors < Middleware - before do - headers['Access-Control-Allow-Origin'] = "*" - headers['Access-Control-Allow-Credentials'] = "true" - headers['Access-Control-Expose-Headers'] = "Content-Type, Cache-Control, Expires, Etag, Last-Modified" - end - - options // do - headers['Access-Control-Allow-Methods'] = "HEAD, GET, POST, PATCH, PUT, DELETE" - headers['Access-Control-Allow-Headers'] = "Content-Type, Authorization, Accept, If-None-Match, If-Modified-Since" - end - end - end -end diff --git a/spec/unit/middleware/cors_spec.rb b/spec/unit/cors_spec.rb similarity index 93% rename from spec/unit/middleware/cors_spec.rb rename to spec/unit/cors_spec.rb index 16d565bd..83e79914 100644 --- a/spec/unit/middleware/cors_spec.rb +++ b/spec/unit/cors_spec.rb @@ -1,9 +1,9 @@ require 'spec_helper' -describe Travis::Api::App::Middleware::Cors do +describe Travis::Api::App::Cors do before do mock_app do - use Travis::Api::App::Middleware::Cors + use Travis::Api::App::Cors get('/check_cors') { 'ok' } end end