aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/new_base/http.rb
blob: c96aaaa86505446f9ef3fb7d797170fec9cccda7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
require 'action_controller/abstract'
require 'active_support/core_ext/module/delegation'

module ActionController
  class Http < AbstractController::Base
    abstract!

    # :api: public
    attr_internal :params, :env

    # :api: public
    def self.controller_name
      @controller_name ||= controller_path.split("/").last
    end

    # :api: public
    def controller_name
      self.class.controller_name
    end

    # :api: public
    def self.controller_path
      @controller_path ||= self.name.sub(/Controller$/, '').underscore
    end

    # :api: public
    def controller_path
      self.class.controller_path
    end

    # :api: private
    def self.action_names
      action_methods
    end

    # :api: private
    def action_names
      action_methods
    end

    # :api: plugin
    def self.call(env)
      controller = new
      controller.call(env).to_rack
    end

    # The details below can be overridden to support a specific
    # Request and Response object. The default ActionController::Base
    # implementation includes RackConvenience, which makes a request
    # and response object available. You might wish to control the
    # environment and response manually for performance reasons.

    attr_internal :status, :headers, :content_type

    def initialize(*)
      @_headers = {}
      super
    end

    # Basic implements for content_type=, location=, and headers are
    # provided to reduce the dependency on the RackConvenience module
    # in Renderer and Redirector.

    def content_type=(type)
      headers["Content-Type"] = type.to_s
    end

    def location=(url)
      headers["Location"] = url
    end

    # :api: private
    def call(name, env)
      @_env = env
      process(name)
      to_rack
    end

    # :api: private
    def to_rack
      [status, headers, response_body]
    end

    def self.action(name)
      @actions ||= {}
      @actions[name.to_s] ||= proc do |env|
        new.call(name, env)
      end
    end
  end
end