From: Michal Fojtik <[email protected]>

---
 server/lib/sinatra/rabbit.rb |   50 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/server/lib/sinatra/rabbit.rb b/server/lib/sinatra/rabbit.rb
index a2b1c3d..75c0789 100644
--- a/server/lib/sinatra/rabbit.rb
+++ b/server/lib/sinatra/rabbit.rb
@@ -36,6 +36,11 @@ module Sinatra
         @description = ""
         instance_eval(&block) if block_given?
         generate_documentation
+        generate_options
+      end
+
+      def http_method
+        @method
       end
 
       def standard?
@@ -58,6 +63,21 @@ module Sinatra
         end
       end
 
+      def generate_options
+        current_operation = self
+        
::Sinatra::Application.options("/api/#{current_operation.collection.name}/#{current_operation.name}")
 do
+          required_params = current_operation.effective_params(driver).collect 
do |name, validation| 
+            name.to_s if validation.type.eql?(:required)
+          end.compact.join(',')
+          optional_params = current_operation.effective_params(driver).collect 
do |name, validation| 
+            name.to_s if validation.type.eql?(:optional)
+          end.compact.join(',')
+          headers 'X-Required-Parameters' => required_params
+          headers 'X-Optional-Parameters' => optional_params
+          [200, '']
+        end
+      end
+
       def control(&block)
         op = self
         @control = Proc.new do
@@ -142,6 +162,8 @@ module Sinatra
         @operations = {}
         instance_eval(&block) if block_given?
         generate_documentation
+        generate_head
+        generate_options
       end
 
       # Set/Return description for collection
@@ -152,6 +174,24 @@ module Sinatra
         @description = text
       end
 
+      def generate_head
+        current_collection = self
+        ::Sinatra::Application.head("/api/#{name}") do
+          methods_allowed = current_collection.operations.collect { |o| 
o[1].method.to_s.upcase }.uniq.join(',')
+          headers 'Allow' => "HEAD,OPTIONS,#{methods_allowed}"
+          [200, '']
+        end
+      end
+
+      def generate_options
+        current_collection = self
+        ::Sinatra::Application.options("/api/#{name}") do
+          operations_allowed = current_collection.operations.collect { |o| 
o[0] }.join(',')
+          headers 'X-Operations-Allowed' => operations_allowed
+          [200, '']
+        end
+      end
+
       def generate_documentation
         coll = self
         ::Sinatra::Application.get("/api/docs/#{@name}") do
@@ -288,3 +328,13 @@ class String
           downcase
   end
 end
+
+configure do
+  class << Sinatra::Base
+    def options(path, opts={}, &block)
+      route 'OPTIONS', path, opts, &block
+    end
+  end
+  Sinatra::Delegator.delegate :options
+end
+
-- 
1.7.4

Reply via email to