zuora_api 1.7.65g → 1.7.66d

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 844d4f29e48548bf298907952d760386687b8d9f0cc4b6f1ce26defe42d9ce30
4
- data.tar.gz: 38661f9da6c4032fe418941f1dddb1581680df7297e6eb8164deab377f82c54a
3
+ metadata.gz: 899b9f7281ac70fc96cedd3a94fefd95184be57b4b8e596d3a33c4d140252faf
4
+ data.tar.gz: c1c3a2fac114b367e084208b806fe30e64a5441710b85e4d1c3a74ac24f5a6c1
5
5
  SHA512:
6
- metadata.gz: 7c149b5fbb73d911e7b55dd10bf3f2d2149695a2d42866936dc43eeb1916191b54d3f666e187c08db69d84467f6e90e13750ab8f5c127b7d3610cc0484b07853
7
- data.tar.gz: ab1ecee455a237c5b2077a8e331b25d9aa2fbc82ec46ad5be9579898d1b8c4c879f8c213efe2dd494c3941f9376557af1ee5d698ec093f60729b8f198ac8b174
6
+ metadata.gz: '09d7e01c4c7592705644eafc7310de8de7c02b9d3f938cd6aa7388aa05cc64ca8d43f1485680f2f17210744073ee7a0e541525eaad83d7b0c7548fd626fb38cb'
7
+ data.tar.gz: 1831e616a849cc266b126fe085b8765a6493dcc578d5875315f44ef53c698908ede7eb1b47bcff254e71ff1c27eaee2abbdabcc35994f78f89d7d8894c5a6978
@@ -35,6 +35,7 @@ rspec-testing:
35
35
  script:
36
36
  - bundle install
37
37
  - rspec
38
+ coverage: '/\(\d+.\d+\%\) covered/'
38
39
 
39
40
  rubygems-deploy:
40
41
  stage: deploy
@@ -177,14 +177,15 @@ module ZuoraAPI
177
177
  end
178
178
 
179
179
  class ZuoraAPITemporaryError < Error
180
- attr_reader :code, :response
180
+ attr_reader :code, :response, :errors
181
181
  attr_writer :default_message
182
182
 
183
- def initialize(message = nil,response=nil, errors = [], successes = [], *args)
183
+ def initialize(message = nil, response = nil, errors = [], successes = [], *args)
184
184
  @code = response.class.to_s == "HTTParty::Response" ? response.code : nil
185
185
  @message = parse_message(message)
186
186
  @response = response
187
187
  @default_message = "There is a temporary error with zuora system."
188
+ @errors = errors
188
189
  end
189
190
 
190
191
  def to_s
@@ -39,8 +39,8 @@ module ZuoraAPI
39
39
 
40
40
  ZUORA_SERVER_ERRORS = [
41
41
  ZuoraAPI::Exceptions::ZuoraAPIInternalServerError,
42
- ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout,
43
- ZuoraAPI::Exceptions::ZuoraAPIReadTimeout,
42
+ ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout,
43
+ ZuoraAPI::Exceptions::ZuoraAPIReadTimeout,
44
44
  ZuoraAPI::Exceptions::ZuoraUnexpectedError
45
45
  ].freeze
46
46
 
@@ -428,7 +428,8 @@ module ZuoraAPI
428
428
  def soap_call(
429
429
  ns1: 'ns1',
430
430
  ns2: 'ns2',
431
- batch_size: nil,
431
+ batch_size: nil,
432
+ headers: {},
432
433
  single_transaction: false,
433
434
  debug: false,
434
435
  zuora_track_id: nil,
@@ -471,7 +472,7 @@ module ZuoraAPI
471
472
  input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
472
473
  Rails.logger.debug("Request SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
473
474
 
474
- headers = { 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'}
475
+ headers.merge!({ 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'})
475
476
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
476
477
 
477
478
  request = HTTParty::Request.new(
@@ -500,20 +501,18 @@ module ZuoraAPI
500
501
  end
501
502
 
502
503
  retry
503
- else
504
- if errors.include?(ex.class)
505
- raise ex
506
- else
507
- return output_xml, input_xml, response
508
- end
509
504
  end
505
+
506
+ raise ex if errors.include?(ex.class)
507
+
508
+ return output_xml, input_xml, response
509
+
510
510
  rescue *ZUORA_API_ERRORS => ex
511
- if errors.include?(ex.class)
512
- raise ex
513
- else
514
- response = ex.response unless response
515
- return output_xml, input_xml, response
516
- end
511
+ raise ex if errors.include?(ex.class)
512
+
513
+ response = ex.response unless response
514
+ return output_xml, input_xml, response
515
+
517
516
  rescue *CONNECTION_EXCEPTIONS => ex
518
517
  if tries.zero?
519
518
  if output_exception_messages
@@ -629,21 +628,8 @@ module ZuoraAPI
629
628
  end
630
629
  end
631
630
 
632
- if (response.code == 400 && response.headers.fetch('content-type', []).include?('text/html'))
633
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
634
- elsif response.code == 500
635
- if response.headers.fetch('content-type', []).include?('application/json')
636
- begin
637
- output_json = JSON.parse(response.body)
638
- self.raise_errors(type: :JSON, body: output_json, response: response)
639
- rescue JSON::ParserError => ex
640
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
641
- end
642
- else
643
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
644
- end
645
- end
646
-
631
+ self.errors_via_content_type(response: response, type: :xml)
632
+
647
633
  when :JSON
648
634
  case request_path
649
635
  when /^\/query\/jobs.*/ #DataQuery Paths
@@ -671,6 +657,10 @@ module ZuoraAPI
671
657
  when /^GET::400::\/api\/rest\/v1\/reports\/(reportlabels\/)?([a-zA-Z0-9\-_]+)\/report-details$/ # Get report, capture of the id is present if needed in future error responses.
672
658
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(reporting_message, response) if reporting_message.present?
673
659
  end
660
+ when /\/objects\/batch\//
661
+ if body['code'].present? && /61$/.match(body['code'].to_s).present? # if last 2 digits of code are 61
662
+ raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new(body['message'], nil, body['details'])
663
+ end
674
664
  end
675
665
 
676
666
  body = body.dig("results").present? ? body["results"] : body if body.class == Hash
@@ -731,7 +721,6 @@ module ZuoraAPI
731
721
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(50)
732
722
  raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{messages_array.join(', ')}", response)
733
723
  end
734
-
735
724
  #Internal Server Error
736
725
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(60)
737
726
  if messages_array.uniq.size == 1
@@ -742,6 +731,11 @@ module ZuoraAPI
742
731
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("#{messages_array.join(', ')}", response)
743
732
  end
744
733
 
734
+ #Retryiable Service Error
735
+ if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(61)
736
+ raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new("#{messages_array.join(', ')}", response)
737
+ end
738
+
745
739
  #Request exceeded limit
746
740
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(70)
747
741
  raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{messages_array.join(', ')}", response)
@@ -794,32 +788,56 @@ module ZuoraAPI
794
788
  end
795
789
  end
796
790
 
791
+ if body.class == Hash && body['message'].present?
792
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(body['message'], response) if response.code == 500
793
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['message'], response) if ![200,201].include?(response.code)
794
+ end
795
+
796
+ self.errors_via_content_type(response: response, type: :json)
797
+
797
798
  #All other errors
798
- if response.code == 500
799
- if body.class == Hash && body['message'].present?
800
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(body['message'], response)
801
- else
802
- response_content_types = response.headers.transform_keys(&:downcase).fetch('content-type', []).first || ''
799
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new(response.body, response) if ![200,201].include?(response.code)
800
+ end
801
+ end
803
802
 
804
- if response_content_types.include?('application/xml') || response_content_types.include?('text/xml')
805
- self.raise_errors(type: :SOAP, body: Nokogiri::XML(response.body), response: response)
806
- else
807
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
808
- end
809
- end
810
- elsif ![200,201].include?(response.code)
811
- if body['message'].present?
812
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['message'], response)
813
- else
814
- if 403 == response.code && response.body.include?("Forbidden")
815
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
816
- else
817
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(response.body, response)
818
- end
803
+ def errors_via_content_type(response: nil, type: :xml)
804
+ response_content_types = response.headers.transform_keys(&:downcase).fetch('content-type', []).first || ""
805
+
806
+ if response_content_types.include?('application/json') && type != :json
807
+ output_json = JSON.parse(response.body)
808
+ self.raise_errors(type: :JSON, body: output_json, response: response)
809
+
810
+ elsif (response_content_types.include?('application/xml') || response_content_types.include?('text/xml')) and type != :xml
811
+ output_xml = Nokogiri::XML(response.body)
812
+ self.raise_errors(type: :SOAP, body: output_xml, response: response)
813
+
814
+ elsif response_content_types.include?('text/html')
815
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Akamai Error", response) if response.headers.fetch('server', '') == 'AkamaiGHost'
816
+
817
+ parse_body = Nokogiri::HTML(response.body)
818
+ error_title = parse_body.xpath('//h2').text
819
+ error_title = parse_body.xpath('//h1').text if error_title.blank?
820
+ error_message = parse_body.xpath('//p').text
821
+
822
+ error_message = error_title if error_message.blank?
823
+
824
+ if error_title.present?
825
+ case error_title
826
+ when /Service Unavailable/
827
+ raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new(error_message, response)
828
+ when /Client sent a bad request./, /Bad Request/, /403 Forbidden/
829
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
830
+ else
831
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
819
832
  end
820
833
  end
834
+
835
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Http response body is missing", response) if response.body.blank?
821
836
  end
837
+
838
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response) if response.code == 500
822
839
  end
840
+
823
841
 
824
842
  def get_soap_error_and_message(body)
825
843
  error = body.xpath('//fns:FaultCode', 'fns' =>'http://fault.api.zuora.com/').text
@@ -885,7 +903,7 @@ module ZuoraAPI
885
903
  when /.*soapenv:Server.*/
886
904
  if /^Invalid value.*for type.*|^Id is invalid|^date string can not be less than 19 charactors$/.match(message).present?
887
905
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
888
- elsif /^Invalid white space character \(.*\) in text to output$/.match(message).present?
906
+ elsif /^Invalid white space character \(.*\) in text to output$|^Invalid null character in text to output$/.match(message).present?
889
907
  raise ZuoraAPI::Exceptions::ZuoraAPIUnkownError.new(message, response, errors, success)
890
908
  end
891
909
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(message, response, errors, success)
@@ -1065,10 +1083,10 @@ module ZuoraAPI
1065
1083
  if self.class.to_s == 'ZuoraAPI::Oauth' && ex.message.include?("Authentication type is not supported by this Login")
1066
1084
  session_type = :bearer
1067
1085
  retry
1068
- else
1069
- Rails.logger.debug("Rest Call - Session Bad Auth type")
1070
- raise ex
1071
1086
  end
1087
+ Rails.logger.debug("Rest Call - Session Bad Auth type")
1088
+ raise ex
1089
+
1072
1090
  rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1073
1091
  if !tries.zero? && z_session
1074
1092
  tries -= 1
@@ -1081,20 +1099,17 @@ module ZuoraAPI
1081
1099
  end
1082
1100
 
1083
1101
  retry
1084
- else
1085
- if errors.include?(ex.class)
1086
- raise ex
1087
- else
1088
- return [output_json, response]
1089
- end
1090
1102
  end
1103
+
1104
+ raise ex if errors.include?(ex.class)
1105
+ return [output_json, response]
1106
+
1091
1107
  rescue *ZUORA_API_ERRORS => ex
1092
- if errors.include?(ex.class)
1093
- raise ex
1094
- else
1095
- response = ex.response unless response
1096
- return [output_json, response]
1097
- end
1108
+ raise ex if errors.include?(ex.class)
1109
+
1110
+ response = ex.response unless response
1111
+ return [output_json, response]
1112
+
1098
1113
  rescue ZuoraAPI::Exceptions::BadEntityError => ex
1099
1114
  raise ex
1100
1115
  rescue *CONNECTION_EXCEPTIONS => ex
@@ -1313,7 +1328,7 @@ module ZuoraAPI
1313
1328
  end
1314
1329
  end
1315
1330
 
1316
- def getDataSourceExport(query, extract: true, encrypted: false, zip: true, z_track_id: nil)
1331
+ def getDataSourceExport(query, extract: true, encrypted: false, zip: true, z_track_id: "")
1317
1332
  begin
1318
1333
  tries ||= 3
1319
1334
  request = Nokogiri::XML::Builder.new do |xml|
@@ -1399,6 +1414,15 @@ module ZuoraAPI
1399
1414
  raise ex
1400
1415
  end
1401
1416
 
1417
+ rescue ZuoraAPI::Exceptions::ZuoraUnexpectedError => ex
1418
+ if !(tries -= 1).zero?
1419
+ Rails.logger.info("Trace ID: #{z_track_id} UnexpectedError, will retry after 10 seconds")
1420
+ sleep 10
1421
+ retry
1422
+ else
1423
+ raise ex
1424
+ end
1425
+
1402
1426
  rescue *ZUORA_API_ERRORS => ex
1403
1427
  raise ex
1404
1428
 
@@ -37,7 +37,13 @@ module ZuoraAPI
37
37
  begin
38
38
  self.current_session = response.headers.to_h['set-cookie'][0].split(';')[0].split('=',2)[1].gsub('%3D', '=')
39
39
  rescue NoMethodError => ex
40
- Rails.logger.fatal("Failure Parsing Cookie Headers", response.headers.to_s)
40
+ Rails.logger.fatal("Failure Parsing Cookie Headers", {
41
+ response: {
42
+ status: response.code,
43
+ params: response.body.to_s,
44
+ headers: response.headers.to_s,
45
+ }
46
+ })
41
47
  raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Failure Parsing Cookie Headers")
42
48
  end
43
49
  rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
@@ -47,12 +53,10 @@ module ZuoraAPI
47
53
  self.new_session(auth_type: :bearer)
48
54
  retry
49
55
  end
50
- raise ex if errors.include?(ex.class)
51
- return [output_json, response]
56
+ raise ex
52
57
 
53
- rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
54
- raise ex if errors.include?(ex.class)
55
- return [output_json, response]
58
+ rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
59
+ raise ex
56
60
 
57
61
  rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
58
62
  if !tries.zero?
@@ -1,3 +1,3 @@
1
1
  module ZuoraAPI
2
- VERSION = "1.7.65g"
2
+ VERSION = "1.7.66d"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zuora_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.65g
4
+ version: 1.7.66d
5
5
  platform: ruby
6
6
  authors:
7
7
  - Zuora Strategic Solutions Group
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-14 00:00:00.000000000 Z
11
+ date: 2020-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler