-
Notifications
You must be signed in to change notification settings - Fork 968
/
env.rb
172 lines (150 loc) · 4.5 KB
/
env.rb
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
module Faraday
# @!attribute method
# @return [Symbol] HTTP method (`:get`, `:post`)
#
# @!attribute body
# @return [String] The request body that will eventually be converted to a string.
#
# @!attribute url
# @return [URI] URI instance for the current request.
#
# @!attribute request
# @return [Hash] options for configuring the request.
# Options for configuring the request.
#
# - `:timeout` open/read timeout Integer in seconds
# - `:open_timeout` - read timeout Integer in seconds
# - `:on_data` - Proc for streaming
# - `:proxy` - Hash of proxy options
# - `:uri` - Proxy Server URI
# - `:user` - Proxy server username
# - `:password` - Proxy server password
#
# @!attribute request_headers
# @return [Hash] HTTP Headers to be sent to the server.
#
# @!attribute ssl
# @return [Hash] options for configuring SSL requests
#
# @!attribute parallel_manager
# @return [Object] sent if the connection is in parallel mode
#
# @!attribute params
# @return [Hash]
#
# @!attribute response
# @return [Response]
#
# @!attribute response_headers
# @return [Hash] HTTP headers from the server
#
# @!attribute status
# @return [Integer] HTTP response status code
#
# @!attribute reason_phrase
# @return [String]
class Env < Options.new(:method, :request_body, :url, :request, :request_headers,
:ssl, :parallel_manager, :params, :response, :response_headers, :status,
:reason_phrase, :response_body)
ContentLength = 'Content-Length'.freeze
StatusesWithoutBody = Set.new [204, 304]
SuccessfulStatuses = 200..299
# A Set of HTTP verbs that typically send a body. If no body is set for
# these requests, the Content-Length header is set to 0.
MethodsWithBodies = Set.new [:post, :put, :patch]
options :request => RequestOptions,
:request_headers => Utils::Headers, :response_headers => Utils::Headers
extend Forwardable
def_delegators :request, :params_encoder
# Build a new Env from given value. Respects and updates `custom_members`.
#
# @param value [Object] a value fitting Option.from(v).
# @return [Env] from given value
def self.from(value)
env = super(value)
if value.respond_to?(:custom_members)
env.custom_members.update(value.custom_members)
end
env
end
# @param key [Object]
def [](key)
return self[current_body] if key == :body
if in_member_set?(key)
super(key)
else
custom_members[key]
end
end
# @param key [Object]
# @param value [Object]
def []=(key, value)
return super(current_body, value) if key == :body
if in_member_set?(key)
super(key, value)
else
custom_members[key] = value
end
end
def current_body
!!status ? :response_body : :request_body
end
def body
self[:body]
end
def body=(value)
self[:body] = value
end
# @return [Boolean] true if status is in the set of {SuccessfulStatuses}.
def success?
SuccessfulStatuses.include?(status)
end
# @return [Boolean] true if there's no body yet, and the method is in the set of {MethodsWithBodies}.
def needs_body?
!body && MethodsWithBodies.include?(method)
end
# Sets content length to zero and the body to the empty string.
def clear_body
request_headers[ContentLength] = '0'
self.body = ''
end
# @return [Boolean] true if the status isn't in the set of {StatusesWithoutBody}.
def parse_body?
!StatusesWithoutBody.include?(status)
end
# @return [Boolean] true if there is a parallel_manager
def parallel?
!!parallel_manager
end
def inspect
attrs = [nil]
members.each do |mem|
if value = send(mem)
attrs << "@#{mem}=#{value.inspect}"
end
end
if !custom_members.empty?
attrs << "@custom=#{custom_members.inspect}"
end
%(#<#{self.class}#{attrs.join(" ")}>)
end
# @private
def custom_members
@custom_members ||= {}
end
# @private
if members.first.is_a?(Symbol)
def in_member_set?(key)
self.class.member_set.include?(key.to_sym)
end
else
def in_member_set?(key)
self.class.member_set.include?(key.to_s)
end
end
# @private
def self.member_set
@member_set ||= Set.new(members)
end
end
end