Class: Utopia::Middleware::Requester

Inherits:
Object
  • Object
show all
Defined in:
lib/utopia/middleware/requester.rb

Defined Under Namespace

Classes: NoRequesterError, RecursiveRequestError, Response

Constant Summary collapse

TTL_KEY =
"utopia.requestor.ttl"
REQUESTOR_KEY =
"utopia.requestor"
PATH_VARIABLES =
Set.new
MAXIMUM_DEPTH =
5

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, env = {}) ⇒ Requester

Returns a new instance of Requester.



79
80
81
82
83
# File 'lib/utopia/middleware/requester.rb', line 79

def initialize(app, env = {})
  @app = app
  @env = env
  @env[TTL_KEY] = 0
end

Instance Attribute Details

#envObject

Returns the value of attribute env.



85
86
87
# File 'lib/utopia/middleware/requester.rb', line 85

def env
  @env
end

Class Method Details

.[](env) ⇒ Object



70
71
72
73
74
75
76
77
# File 'lib/utopia/middleware/requester.rb', line 70

def self.[](env)
  requestor = env[REQUESTOR_KEY]
  if requestor
    return requestor
  else
    raise NoRequesterError
  end
end

Instance Method Details

#[](path, method = "GET", env = {}) ⇒ Object



110
111
112
113
114
115
116
# File 'lib/utopia/middleware/requester.rb', line 110

def [](path, method = "GET", env = {})
  path_env = {
    "REQUEST_METHOD" => method,
    "PATH_INFO" => path.to_s
  }
  request(env.merge(path_env))
end

#call(env) ⇒ Object



87
88
89
90
91
92
93
94
# File 'lib/utopia/middleware/requester.rb', line 87

def call(env)
  requestor = dup
  env[REQUESTOR_KEY] = requestor
  requestor.env = env.merge(@env)
  requestor.env.delete("rack.request")

  @app.call(env)
end

#inspectObject

Avoid a huge amount of junk being printed when inspecting env.



119
120
121
# File 'lib/utopia/middleware/requester.rb', line 119

def inspect
  to_s
end

#request(env) ⇒ Object



99
100
101
102
103
104
105
106
107
108
# File 'lib/utopia/middleware/requester.rb', line 99

def request(env)
  env = @env.merge(env)
  env[TTL_KEY] += 1

  if env[TTL_KEY].to_i > MAXIMUM_DEPTH
    raise RecursiveRequestError, env["PATH_INFO"]
  end

  return Response.new(*@app.call(env))
end