nice_http 1.7.2 → 1.7.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,237 +1,237 @@
1
- module NiceHttpManageRequest
2
-
3
- ######################################################
4
- # private method to manage Request
5
- # input:
6
- # 3 args: path, data, headers
7
- # 1 arg: Hash containg at least keys :path and :data
8
- # In case :data not supplied and :data_examples array supplied, it will be taken the first example as :data.
9
- # output:
10
- # path, data, headers
11
- ######################################################
12
- def manage_request(*arguments)
13
- require "json"
14
-
15
- @prev_request = Hash.new() if @prev_request.nil?
16
- begin
17
- content_type_included = false
18
- path = ""
19
- data = ""
20
-
21
- @response = Hash.new()
22
- headers_t = @headers.dup()
23
- cookies_to_set_str = ""
24
- if arguments.size == 3
25
- path = arguments[0]
26
- elsif arguments.size == 1 and arguments[0].kind_of?(Hash)
27
- path = arguments[0][:path]
28
- elsif arguments.size == 1 and arguments[0].kind_of?(String)
29
- path = arguments[0].to_s()
30
- end
31
- path = (@prepath + path).gsub("//", "/") unless path.nil? or path.start_with?("http:") or path.start_with?("https:")
32
- @cookies.each { |cookie_path, cookies_hash|
33
- cookie_path = "" if cookie_path == "/"
34
- path_to_check = path
35
- if path == "/" or path[-1] != "/"
36
- path_to_check += "/"
37
- end
38
- if path_to_check.scan(/^#{cookie_path}\//).size > 0
39
- cookies_hash.each { |key, value|
40
- cookies_to_set_str += "#{key}=#{value}; "
41
- }
42
- end
43
- }
44
- headers_t["Cookie"] = cookies_to_set_str
45
-
46
- method_s = caller[0].to_s().scan(/:in `(.*)'/).join
47
-
48
- if arguments.size == 3
49
- data = arguments[1]
50
- if arguments[2].kind_of?(Hash)
51
- headers_t.merge!(arguments[2])
52
- end
53
- elsif arguments.size == 1 and arguments[0].kind_of?(Hash)
54
- if arguments[0][:data].nil?
55
- if arguments[0].keys.include?(:data)
56
- data = ""
57
- elsif arguments[0].keys.include?(:data_examples) and
58
- arguments[0][:data_examples].kind_of?(Array)
59
- data = arguments[0][:data_examples][0] #the first example by default
60
- else
61
- data = ""
62
- end
63
- else
64
- data = arguments[0][:data]
65
- end
66
- if arguments[0].include?(:headers)
67
- headers_t.merge!(arguments[0][:headers])
68
- end
69
-
70
- if headers_t["Content-Type"].to_s() == "" and headers_t["content-type"].to_s() == "" and
71
- headers_t[:"content-type"].to_s() == "" and headers_t[:"Content-Type"].to_s() == ""
72
- content_type_included = false
73
- elsif headers_t["content-type"].to_s() != ""
74
- content_type_included = true
75
- headers_t["Content-Type"] = headers_t["content-type"]
76
- elsif headers_t[:"content-type"].to_s() != ""
77
- content_type_included = true
78
- headers_t["Content-Type"] = headers_t[:"content-type"]
79
- headers_t.delete(:"content-type")
80
- elsif headers_t[:"Content-Type"].to_s() != ""
81
- content_type_included = true
82
- headers_t["Content-Type"] = headers_t[:"Content-Type"]
83
- headers_t.delete(:"Content-Type")
84
- elsif headers_t["Content-Type"].to_s() != ""
85
- content_type_included = true
86
- end
87
- if !content_type_included and data.kind_of?(Hash)
88
- headers_t["Content-Type"] = "application/json"
89
- content_type_included = true
90
- end
91
- # to be backwards compatible since before was :values
92
- if arguments[0].include?(:values) and !arguments[0].include?(:values_for)
93
- arguments[0][:values_for] = arguments[0][:values]
94
- end
95
-
96
- if @values_for.size > 0
97
- if arguments[0][:values_for].nil?
98
- arguments[0][:values_for] = @values_for.dup
99
- else
100
- arguments[0][:values_for] = @values_for.merge(arguments[0][:values_for])
101
- end
102
- end
103
-
104
- if content_type_included and (!headers_t["Content-Type"][/text\/xml/].nil? or
105
- !headers_t["Content-Type"]["application/soap+xml"].nil? or
106
- !headers_t["Content-Type"][/application\/jxml/].nil?)
107
- if arguments[0].include?(:values_for)
108
- arguments[0][:values_for].each { |key, value|
109
- data = NiceHttpUtils.set_value_xml_tag(key.to_s(), data, value.to_s(), true)
110
- }
111
- end
112
- elsif content_type_included and !headers_t["Content-Type"][/application\/json/].nil? and data.to_s() != ""
113
- require "json"
114
- if data.kind_of?(String)
115
- if arguments[0].include?(:values_for)
116
- arguments[0][:values_for].each { |key, value|
117
- data.gsub!(/"(#{key})":\s*"([^"]*)"/, '"\1": "' + value + '"') # "key":"value"
118
- data.gsub!(/(#{key}):\s*"([^"]*)"/, '\1: "' + value + '"') # key:"value"
119
- data.gsub!(/(#{key}):\s*'([^']*)'/, '\1: \'' + value + "'") # key:'value'
120
- data.gsub!(/"(#{key})":\s*(\w+)/, '"\1": ' + value) # "key":456
121
- data.gsub!(/(#{key}):\s*(\w+)/, '\1: ' + value) # key:456
122
- }
123
- end
124
- elsif data.kind_of?(Hash)
125
- if arguments[0].include?(:values_for)
126
- data = data.set_values(arguments[0][:values_for])
127
- end
128
- data = data.to_json()
129
- elsif data.kind_of?(Array)
130
- data_arr = Array.new()
131
- data.each_with_index { |row, indx|
132
- unless row.kind_of?(Hash)
133
- @logger.fatal("Wrong format on request application/json, be sure is a Hash, Array of Hashes or JSON string")
134
- return :error, :error, :error
135
- end
136
- if arguments[0].include?(:values_for)
137
- if arguments[0][:values_for].is_a?(Array)
138
- data_n = row.set_values(arguments[0][:values_for][indx])
139
- else
140
- data_n = row.set_values(arguments[0][:values_for])
141
- end
142
- else
143
- data_n = row
144
- end
145
- data_arr.push(data_n)
146
- }
147
- data = data_arr.to_json()
148
- else
149
- @logger.fatal("Wrong format on request application/json, be sure is a Hash, Array of Hashes or JSON string")
150
- return :error, :error, :error
151
- end
152
- elsif content_type_included and arguments[0].include?(:values_for)
153
- if arguments[0][:values_for].kind_of?(Hash) and arguments[0][:values_for].keys.size > 0
154
- if !headers_t.nil? and headers_t.kind_of?(Hash) and headers_t["Content-Type"] != "application/x-www-form-urlencoded" and headers_t["content-type"] != "application/x-www-form-urlencoded"
155
- @logger.warn(":values_for key given without a valid content-type or data for request. No values modified on the request")
156
- end
157
- end
158
- end
159
- elsif arguments.size == 1 and arguments[0].kind_of?(String)
160
- #path=arguments[0].to_s()
161
- data = ""
162
- else
163
- @logger.fatal("Invalid number of arguments or wrong arguments in #{method_s}")
164
- return :error, :error, :error
165
- end
166
- if headers_t.keys.include?("Content-Type") and !headers_t["Content-Type"]["multipart/form-data"].nil? and headers_t["Content-Type"] != ["multipart/form-data"] #only for the case raw multipart request
167
- encoding = "UTF-8"
168
- data_s = ""
169
- else
170
- encoding = data.to_s().scan(/encoding='(.*)'/i).join
171
- if encoding.to_s() == ""
172
- encoding = data.to_s().scan(/charset='(.*)'/i).join
173
- end
174
- if encoding.to_s() == "" and headers_t.include?("Content-Type")
175
- encoding = headers_t["Content-Type"].scan(/charset='?(.*)'?/i).join
176
- if encoding.to_s() == ""
177
- encoding = headers_t["Content-Type"].scan(/encoding='?(.*)'?/i).join
178
- end
179
- end
180
-
181
- begin
182
- data_s = JSON.pretty_generate(JSON.parse(data))
183
- rescue
184
- data_s = data
185
- end
186
- data_s = data_s.to_s().gsub("<", "&lt;")
187
- end
188
- if headers_t.keys.include?("Accept-Encoding")
189
- headers_t["Accept-Encoding"].gsub!("gzip", "") #removed so the response is in plain text
190
- end
191
-
192
- headers_ts = ""
193
- headers_t.each { |key, val| headers_ts += key.to_s + ":" + val.to_s() + ", " }
194
- message = "\n\n#{"- " * 25}\n"
195
- if arguments.size == 1 and arguments[0].kind_of?(Hash) and arguments[0].key?(:name)
196
- message += "#{method_s.upcase} Request: #{arguments[0][:name]}"
197
- else
198
- message += "#{method_s.upcase} Request"
199
- end
200
- message += "\n path: " + path.to_s() + "\n"
201
- if @debug or @prev_request[:path] != path or @prev_request[:headers] != headers_t or @prev_request[:data] != data
202
- message += " headers: {" + headers_ts.to_s() + "}\n"
203
- message += " data: " + data_s.to_s() + "\n"
204
- message = @message_server + "\n" + message
205
- else
206
- message += " Same#{" headers" if headers_t != {}}#{" and" if headers_t != {} and data.to_s != ""}#{" data" if data.to_s != ""} as in the previous request."
207
- end
208
- if path.to_s().scan(/^https?:\/\//).size > 0 and path.to_s().scan(/^https?:\/\/#{@host}/).size == 0
209
- # the path is for another server than the current
210
- # todo: identify if it is better to log the request, or if it is done later
211
- else
212
- self.class.last_request = message
213
- @logger.info(message)
214
- end
215
-
216
- if data.to_s() != "" and encoding.to_s().upcase != "UTF-8" and encoding != ""
217
- data = data.to_s().encode(encoding, "UTF-8")
218
- end
219
- headers_t.each do |k,v|
220
- # for lambdas
221
- headers_t[k] = v.call if v.is_a?(Proc)
222
- end
223
- @prev_request[:path] = path
224
- @prev_request[:data] = data
225
- @prev_request[:headers] = headers_t
226
- @prev_request[:method] = method_s.upcase
227
- if arguments.size == 1 and arguments[0].kind_of?(Hash) and arguments[0].key?(:name)
228
- @prev_request[:name] = arguments[0][:name]
229
- end
230
- return path, data, headers_t
231
- rescue Exception => stack
232
- @logger.fatal(stack)
233
- @logger.fatal("manage_request Error on method #{method_s} . path:#{path.to_s()}. data:#{data.to_s()}. headers:#{headers_t.to_s()}")
234
- return :error
235
- end
236
- end
237
- end
1
+ module NiceHttpManageRequest
2
+
3
+ ######################################################
4
+ # private method to manage Request
5
+ # input:
6
+ # 3 args: path, data, headers
7
+ # 1 arg: Hash containg at least keys :path and :data
8
+ # In case :data not supplied and :data_examples array supplied, it will be taken the first example as :data.
9
+ # output:
10
+ # path, data, headers
11
+ ######################################################
12
+ def manage_request(*arguments)
13
+ require "json"
14
+
15
+ @prev_request = Hash.new() if @prev_request.nil?
16
+ begin
17
+ content_type_included = false
18
+ path = ""
19
+ data = ""
20
+
21
+ @response = Hash.new()
22
+ headers_t = @headers.dup()
23
+ cookies_to_set_str = ""
24
+ if arguments.size == 3
25
+ path = arguments[0]
26
+ elsif arguments.size == 1 and arguments[0].kind_of?(Hash)
27
+ path = arguments[0][:path]
28
+ elsif arguments.size == 1 and arguments[0].kind_of?(String)
29
+ path = arguments[0].to_s()
30
+ end
31
+ path = (@prepath + path).gsub("//", "/") unless path.nil? or path.start_with?("http:") or path.start_with?("https:")
32
+ @cookies.each { |cookie_path, cookies_hash|
33
+ cookie_path = "" if cookie_path == "/"
34
+ path_to_check = path
35
+ if path == "/" or path[-1] != "/"
36
+ path_to_check += "/"
37
+ end
38
+ if path_to_check.scan(/^#{cookie_path}\//).size > 0
39
+ cookies_hash.each { |key, value|
40
+ cookies_to_set_str += "#{key}=#{value}; "
41
+ }
42
+ end
43
+ }
44
+ headers_t["Cookie"] = cookies_to_set_str
45
+
46
+ method_s = caller[0].to_s().scan(/:in `(.*)'/).join
47
+
48
+ if arguments.size == 3
49
+ data = arguments[1]
50
+ if arguments[2].kind_of?(Hash)
51
+ headers_t.merge!(arguments[2])
52
+ end
53
+ elsif arguments.size == 1 and arguments[0].kind_of?(Hash)
54
+ if arguments[0][:data].nil?
55
+ if arguments[0].keys.include?(:data)
56
+ data = ""
57
+ elsif arguments[0].keys.include?(:data_examples) and
58
+ arguments[0][:data_examples].kind_of?(Array)
59
+ data = arguments[0][:data_examples][0] #the first example by default
60
+ else
61
+ data = ""
62
+ end
63
+ else
64
+ data = arguments[0][:data]
65
+ end
66
+ if arguments[0].include?(:headers)
67
+ headers_t.merge!(arguments[0][:headers])
68
+ end
69
+
70
+ if headers_t["Content-Type"].to_s() == "" and headers_t["content-type"].to_s() == "" and
71
+ headers_t[:"content-type"].to_s() == "" and headers_t[:"Content-Type"].to_s() == ""
72
+ content_type_included = false
73
+ elsif headers_t["content-type"].to_s() != ""
74
+ content_type_included = true
75
+ headers_t["Content-Type"] = headers_t["content-type"]
76
+ elsif headers_t[:"content-type"].to_s() != ""
77
+ content_type_included = true
78
+ headers_t["Content-Type"] = headers_t[:"content-type"]
79
+ headers_t.delete(:"content-type")
80
+ elsif headers_t[:"Content-Type"].to_s() != ""
81
+ content_type_included = true
82
+ headers_t["Content-Type"] = headers_t[:"Content-Type"]
83
+ headers_t.delete(:"Content-Type")
84
+ elsif headers_t["Content-Type"].to_s() != ""
85
+ content_type_included = true
86
+ end
87
+ if !content_type_included and data.kind_of?(Hash)
88
+ headers_t["Content-Type"] = "application/json"
89
+ content_type_included = true
90
+ end
91
+ # to be backwards compatible since before was :values
92
+ if arguments[0].include?(:values) and !arguments[0].include?(:values_for)
93
+ arguments[0][:values_for] = arguments[0][:values]
94
+ end
95
+
96
+ if @values_for.size > 0
97
+ if arguments[0][:values_for].nil?
98
+ arguments[0][:values_for] = @values_for.dup
99
+ else
100
+ arguments[0][:values_for] = @values_for.merge(arguments[0][:values_for])
101
+ end
102
+ end
103
+
104
+ if content_type_included and (!headers_t["Content-Type"][/text\/xml/].nil? or
105
+ !headers_t["Content-Type"]["application/soap+xml"].nil? or
106
+ !headers_t["Content-Type"][/application\/jxml/].nil?)
107
+ if arguments[0].include?(:values_for)
108
+ arguments[0][:values_for].each { |key, value|
109
+ data = NiceHttpUtils.set_value_xml_tag(key.to_s(), data, value.to_s(), true)
110
+ }
111
+ end
112
+ elsif content_type_included and !headers_t["Content-Type"][/application\/json/].nil? and data.to_s() != ""
113
+ require "json"
114
+ if data.kind_of?(String)
115
+ if arguments[0].include?(:values_for)
116
+ arguments[0][:values_for].each { |key, value|
117
+ data.gsub!(/"(#{key})":\s*"([^"]*)"/, '"\1": "' + value + '"') # "key":"value"
118
+ data.gsub!(/(#{key}):\s*"([^"]*)"/, '\1: "' + value + '"') # key:"value"
119
+ data.gsub!(/(#{key}):\s*'([^']*)'/, '\1: \'' + value + "'") # key:'value'
120
+ data.gsub!(/"(#{key})":\s*(\w+)/, '"\1": ' + value) # "key":456
121
+ data.gsub!(/(#{key}):\s*(\w+)/, '\1: ' + value) # key:456
122
+ }
123
+ end
124
+ elsif data.kind_of?(Hash)
125
+ if arguments[0].include?(:values_for)
126
+ data = data.set_values(arguments[0][:values_for])
127
+ end
128
+ data = data.to_json()
129
+ elsif data.kind_of?(Array)
130
+ data_arr = Array.new()
131
+ data.each_with_index { |row, indx|
132
+ unless row.kind_of?(Hash)
133
+ @logger.fatal("Wrong format on request application/json, be sure is a Hash, Array of Hashes or JSON string")
134
+ return :error, :error, :error
135
+ end
136
+ if arguments[0].include?(:values_for)
137
+ if arguments[0][:values_for].is_a?(Array)
138
+ data_n = row.set_values(arguments[0][:values_for][indx])
139
+ else
140
+ data_n = row.set_values(arguments[0][:values_for])
141
+ end
142
+ else
143
+ data_n = row
144
+ end
145
+ data_arr.push(data_n)
146
+ }
147
+ data = data_arr.to_json()
148
+ else
149
+ @logger.fatal("Wrong format on request application/json, be sure is a Hash, Array of Hashes or JSON string")
150
+ return :error, :error, :error
151
+ end
152
+ elsif content_type_included and arguments[0].include?(:values_for)
153
+ if arguments[0][:values_for].kind_of?(Hash) and arguments[0][:values_for].keys.size > 0
154
+ if !headers_t.nil? and headers_t.kind_of?(Hash) and headers_t["Content-Type"] != "application/x-www-form-urlencoded" and headers_t["content-type"] != "application/x-www-form-urlencoded"
155
+ @logger.warn(":values_for key given without a valid content-type or data for request. No values modified on the request")
156
+ end
157
+ end
158
+ end
159
+ elsif arguments.size == 1 and arguments[0].kind_of?(String)
160
+ #path=arguments[0].to_s()
161
+ data = ""
162
+ else
163
+ @logger.fatal("Invalid number of arguments or wrong arguments in #{method_s}")
164
+ return :error, :error, :error
165
+ end
166
+ if headers_t.keys.include?("Content-Type") and !headers_t["Content-Type"]["multipart/form-data"].nil? and headers_t["Content-Type"] != ["multipart/form-data"] #only for the case raw multipart request
167
+ encoding = "UTF-8"
168
+ data_s = ""
169
+ else
170
+ encoding = data.to_s().scan(/encoding='(.*)'/i).join
171
+ if encoding.to_s() == ""
172
+ encoding = data.to_s().scan(/charset='(.*)'/i).join
173
+ end
174
+ if encoding.to_s() == "" and headers_t.include?("Content-Type")
175
+ encoding = headers_t["Content-Type"].scan(/charset='?(.*)'?/i).join
176
+ if encoding.to_s() == ""
177
+ encoding = headers_t["Content-Type"].scan(/encoding='?(.*)'?/i).join
178
+ end
179
+ end
180
+
181
+ begin
182
+ data_s = JSON.pretty_generate(JSON.parse(data))
183
+ rescue
184
+ data_s = data
185
+ end
186
+ data_s = data_s.to_s().gsub("<", "&lt;")
187
+ end
188
+ if headers_t.keys.include?("Accept-Encoding")
189
+ headers_t["Accept-Encoding"].gsub!("gzip", "") #removed so the response is in plain text
190
+ end
191
+
192
+ headers_ts = ""
193
+ headers_t.each { |key, val| headers_ts += key.to_s + ":" + val.to_s() + ", " }
194
+ message = "\n\n#{"- " * 25}\n"
195
+ if arguments.size == 1 and arguments[0].kind_of?(Hash) and arguments[0].key?(:name)
196
+ message += "#{method_s.upcase} Request: #{arguments[0][:name]}"
197
+ else
198
+ message += "#{method_s.upcase} Request"
199
+ end
200
+ message += "\n path: " + path.to_s() + "\n"
201
+ if @debug or @prev_request[:path] != path or @prev_request[:headers] != headers_t or @prev_request[:data] != data
202
+ message += " headers: {" + headers_ts.to_s() + "}\n"
203
+ message += " data: " + data_s.to_s() + "\n"
204
+ message = @message_server + "\n" + message
205
+ else
206
+ message += " Same#{" headers" if headers_t != {}}#{" and" if headers_t != {} and data.to_s != ""}#{" data" if data.to_s != ""} as in the previous request."
207
+ end
208
+ if path.to_s().scan(/^https?:\/\//).size > 0 and path.to_s().scan(/^https?:\/\/#{@host}/).size == 0
209
+ # the path is for another server than the current
210
+ # todo: identify if it is better to log the request, or if it is done later
211
+ else
212
+ self.class.last_request = message
213
+ @logger.info(message)
214
+ end
215
+
216
+ if data.to_s() != "" and encoding.to_s().upcase != "UTF-8" and encoding != ""
217
+ data = data.to_s().encode(encoding, "UTF-8")
218
+ end
219
+ headers_t.each do |k,v|
220
+ # for lambdas
221
+ headers_t[k] = v.call if v.is_a?(Proc)
222
+ end
223
+ @prev_request[:path] = path
224
+ @prev_request[:data] = data
225
+ @prev_request[:headers] = headers_t
226
+ @prev_request[:method] = method_s.upcase
227
+ if arguments.size == 1 and arguments[0].kind_of?(Hash) and arguments[0].key?(:name)
228
+ @prev_request[:name] = arguments[0][:name]
229
+ end
230
+ return path, data, headers_t
231
+ rescue Exception => stack
232
+ @logger.fatal(stack)
233
+ @logger.fatal("manage_request Error on method #{method_s} . path:#{path.to_s()}. data:#{data.to_s()}. headers:#{headers_t.to_s()}")
234
+ return :error
235
+ end
236
+ end
237
+ end