using Rack's Response to leverage it's code
[sinatra.git] / lib / sinatra / context.rb
blob8b2523bd262bd2e0761c54a7ae6c89899246882b
1 require File.dirname(__FILE__) + '/context/renderer'
3 module Sinatra
5   class EventContext
6   
7     cattr_accessor :logger
8     attr_reader :request, :response
10     include Sinatra::Renderer
11   
12     def initialize(request) #:nodoc:
13       @request = request
14       @response = Rack::Response.new
15       @response.body = nil
16     end
17   
18     # Sets or returns the status
19     def status(value = nil)
20       @response.status = value if value
21       @response.status || 200
22     end
23   
24     # Sets or returns the body
25     # *Usage*
26     #   body 'test'
27     # or
28     #   body do
29     #     'test'
30     #   end
31     # both are the same
32     #
33     def body(value = nil, &block)
34       @response.body = value if value
35       @response.body = block.call if block
36       @response.body
37     end
38     
39     # Renders an exception to +body+ and sets status to 500
40     def error(value = nil)
41       if value
42         status 500
43         @error = value
44         erb :error, :views_directory => SINATRA_ROOT + '/files/'
45       end
46       @error
47     end
48       
49     # Sets or returns response headers
50     #
51     # *Usage*
52     #   header 'Content-Type' => 'text/html'
53     #   header 'Foo' => 'Bar'
54     # or
55     #   headers 'Content-Type' => 'text/html',
56     #           'Foo' => 'Bar'
57     # 
58     # Whatever blows your hair back
59     def headers(value = nil)
60       @response.headers.merge!(value) if value
61       @response.headers
62     end
63     alias :header :headers
64   
65     # Returns a Hash of params.  Keys are symbolized
66     def params
67       @params ||= @request.params.symbolize_keys
68     end
69     
70     # Redirect to a url
71     def redirect(path)
72       logger.info "Redirecting to: #{path}"
73       status 302
74       header 'Location' => path
75     end
76   
77     def log_event #:nodoc:
78       logger.info "#{request.request_method} #{request.path_info} | Status: #{status} | Params: #{params.inspect}"
79       logger.exception(error) if error
80     end
81   
82   end
84 end