@@ -71,15 +71,19 @@ def decode_params(params, options = {})
7171 end
7272
7373 reference_values = [ ]
74+ sanitize_values = { }
7475 # Replace reference parameters by the actual values. Use backslash to escape a reference parameter, e.g: \${not_a_param},
7576 # the ${not_a_param} will not be replaced
7677 if options [ :resolve_reference_params ]
77- data_params , reference_values = resolve_reference_params ( data_params , params )
78+ data_params , reference_values , sanitize_values = resolve_reference_params ( data_params , params )
7879 hidden_data_params , = resolve_reference_params ( hidden_data_params , params )
7980 end
8081
8182 begin
8283 parsed_data_params = data_params . is_a? ( Hash ) ? data_params : JSON . parse ( data_params )
84+ # Invalid ascii characters in data_params make json parse fails. So after escape the invalid ascii
85+ # characters to json parse success then We need recover them to origin value
86+ recover_sanitize_value ( parsed_data_params , sanitize_values ) if sanitize_values . any?
8387 rescue JSON ::ParserError => exception
8488 reason = exception . message
8589 reference_values . each { |secret_value | reason . gsub! ( "\" #{ secret_value } \" " , '"***"' ) }
@@ -240,8 +244,23 @@ def stringify_values(value)
240244
241245 private
242246
247+ def invalid_ascii_value ( data )
248+ data . include? ( "\n " )
249+ end
250+
251+ def recover_sanitize_value ( parsed_data_params , sanitize_values )
252+ parsed_data_params . map do |k , v |
253+ if v . is_a? ( Hash )
254+ recover_sanitize_value ( v , sanitize_values )
255+ else
256+ parsed_data_params [ k ] = sanitize_values [ v ] if sanitize_values . include? ( v )
257+ end
258+ end
259+ end
260+
243261 def resolve_reference_params ( data_params , params )
244262 reference_values = [ ]
263+ sanitize_values = { }
245264 regexps = Regexp . union ( /\\ \\ / , /\\ \$ / , /\$ \{ ([^\n \{ \} ]+)\} / )
246265 resolve_reference = lambda do |v |
247266 if v . is_a? Hash
@@ -266,7 +285,13 @@ def resolve_reference_params(data_params, params)
266285 val = params [ "#{ $1} " ]
267286 if val
268287 reference_values << val
269- val
288+ if invalid_ascii_value ( val )
289+ escape_value = val . gsub ( "\n " , "\\ n" )
290+ sanitize_values [ escape_value ] = val
291+ escape_value
292+ else
293+ val
294+ end
270295 else
271296 GoodData . logger . warn "Reference '#{ $1} ' is not found!"
272297 match
@@ -284,7 +309,7 @@ def resolve_reference_params(data_params, params)
284309 resolve_reference . call ( data_params )
285310 end
286311
287- [ data_params , reference_values ]
312+ [ data_params , reference_values , sanitize_values ]
288313 end
289314 end
290315 end
0 commit comments