zuora_api 1.7.65c → 1.7.65i

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: 6707b17c4dcf42bc9b1125e2d0cf4060cc92a32f73ada2407d68ac23c3b13c90
4
- data.tar.gz: 59f9d07a0741f61581d85b5b0354f050f81832276cca1a1f8a6a6f974020fde6
3
+ metadata.gz: 2d3a5ce233d3d4b441e52a9d4342db32d616d2bcd23e650ad0e5c09208b5904e
4
+ data.tar.gz: 5c1acb4964d32582cb84a05b0b120bde86d3d572fbeb663dff5ad2a58e228448
5
5
  SHA512:
6
- metadata.gz: aa61a11e859e7a00b82903f2c792a3b9bbe486a24c8774cbe0b049db7ffbf9afe800060c0c41aa782918d3e373f57c45eb0e50143bc7a487c29d5bc09db02458
7
- data.tar.gz: b6bf8efa26d37b295a1ed4db27809833e3821d03fb62d2cc186c11846b504d6b85591800cd105494820b53ef4a76cd36f1e0187f6c94780c836787dd43190c9e
6
+ metadata.gz: 45f208500da4b73e03a91fd9381fb5408f2007d62f698b97c74a46c5e71616e5b312fd0beaf00a19b977aab868850b83c03e4f8910fa1f2292666e13204e8598
7
+ data.tar.gz: '06791a0a95a2031edb03efa889d35f7721f129d3e8318565e7b6a86fef6a2539b361f1ca1fe27e8470b7a43e5d6d29c463de1b0710451f539353b51e599b5903'
@@ -225,13 +225,14 @@ module ZuoraAPI
225
225
  end
226
226
 
227
227
  class ZuoraAPIReadTimeout < Net::ReadTimeout
228
- attr_reader :code, :response
228
+ attr_reader :code, :response, :request
229
229
  attr_writer :default_message
230
230
 
231
- def initialize(message = nil,response=nil, errors = [], successes = [], *args)
231
+ def initialize(message = nil, response = nil, request = nil, errors = [], successes = [], *args)
232
232
  @code = response.class.to_s == "HTTParty::Response" ? response.code : nil
233
233
  @message = message
234
234
  @response = response
235
+ @request = request
235
236
  @default_message = "Authentication type is not supported by this Login"
236
237
  end
237
238
 
@@ -474,12 +474,16 @@ module ZuoraAPI
474
474
  headers = { 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'}
475
475
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
476
476
 
477
- response = HTTParty.post(
477
+ request = HTTParty::Request.new(
478
+ Net::HTTP::Post,
478
479
  self.url,
479
- :body => xml.doc.to_xml(:save_with => XML_SAVE_OPTIONS).strip,
480
- :headers => headers,
481
- :timeout => timeout
480
+ body: xml.doc.to_xml(:save_with => XML_SAVE_OPTIONS).strip,
481
+ headers: headers,
482
+ timeout: timeout,
482
483
  )
484
+
485
+ response = request.perform
486
+
483
487
  output_xml = Nokogiri::XML(response.body)
484
488
  Rails.logger.debug("Response SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
485
489
 
@@ -526,36 +530,26 @@ module ZuoraAPI
526
530
  sleep(timeout_sleep_interval)
527
531
  retry
528
532
  rescue *CONNECTION_READ_EXCEPTIONS => ex
529
- if tries.zero?
530
- if output_exception_messages
531
- if Rails.logger.class.to_s == "Ougai::Logger"
532
- Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
533
- else
534
- Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
535
- end
533
+ if !tries.zero?
534
+ tries -= 1
535
+
536
+ if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
537
+ retry
538
+ elsif timeout_retry
539
+ sleep(timeout_sleep_interval)
540
+ retry
536
541
  end
537
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}") if ex.is_a?(Net::ReadTimeout)
538
- raise ex
539
542
  end
540
543
 
541
- tries -= 1
542
-
543
- if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
544
- retry
545
- elsif timeout_retry
546
- sleep(timeout_sleep_interval)
547
- retry
548
- else
549
- if output_exception_messages
550
- if Rails.logger.class.to_s == "Ougai::Logger"
551
- Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
552
- else
553
- Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
554
- end
544
+ if output_exception_messages
545
+ if Rails.logger.class.to_s == "Ougai::Logger"
546
+ Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
547
+ else
548
+ Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
555
549
  end
556
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}") if ex.is_a?(Net::ReadTimeout)
557
- raise ex
558
550
  end
551
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
552
+ raise ex
559
553
  rescue => ex
560
554
  raise ex
561
555
  else
@@ -563,24 +557,33 @@ module ZuoraAPI
563
557
  end
564
558
 
565
559
  def raise_errors(type: :SOAP, body: nil, response: nil)
566
- request = response.request
567
- match_string = "#{request.http_method.to_s.split("Net::HTTP::").last.upcase}::#{response.code}::#{request.path.path}"
560
+ request_uri, request_path, match_string = "", "", ""
561
+ if response.class.to_s == "HTTP::Message"
562
+ request_uri = response.http_header.request_uri.to_s
563
+ request_path = response.http_header.request_uri.path
564
+ match_string = "#{response.http_header.request_method}::#{response.code}::#{request_uri}"
565
+ else
566
+ request = response.request
567
+ request_uri = response.request.uri
568
+ request_path = request.path.path
569
+ match_string = "#{request.http_method.to_s.split("Net::HTTP::").last.upcase}::#{response.code}::#{request_path}"
570
+ end
568
571
 
569
572
  if [502,503].include?(response.code)
570
- raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from #{response.request.uri}", response)
573
+ raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from #{request_uri}", response)
571
574
  end
572
575
 
573
576
  # Check failure response code
574
577
  case response.code
575
578
  when 504
576
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{response.request.uri}", response)
579
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{request_uri}", response)
577
580
  when 429
578
581
  raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.", response)
579
582
  when 401
580
583
 
581
584
  else
582
585
  if body.class == Hash
583
- case response.request.path.path
586
+ case request_path
584
587
  when /^\/v1\/connections$/
585
588
  response_headers = response.headers.to_h
586
589
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Missing cookies for authentication call", response) if response_headers['set-cookie'].blank?
@@ -604,7 +607,7 @@ module ZuoraAPI
604
607
  reason = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
605
608
  if reason.present?
606
609
  message = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
607
- error = message.match(/^[\w\d]{16}\: (Unexpected error.|No HTTP Response|Socket Timeout)/).present? ? 'UNEXPECTED_ERROR' : 'FATAL_ERROR'
610
+ error = message.match(/^[\w\d]{16}\: (Unexpected error.|No HTTP Response|Socket Timeout|There is an internal error, please try again later)/).present? ? 'UNEXPECTED_ERROR' : 'FATAL_ERROR'
608
611
  else
609
612
  error = 'FATAL_ERROR'
610
613
  message = 'Export failed due to unknown reason. Consult api logs.'
@@ -626,23 +629,10 @@ module ZuoraAPI
626
629
  end
627
630
  end
628
631
 
629
- if (response.code == 400 && response.headers.fetch('content-type', []).include?('text/html'))
630
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
631
- elsif response.code == 500
632
- if response.headers.fetch('content-type', []).include?('application/json')
633
- begin
634
- output_json = JSON.parse(response.body)
635
- self.raise_errors(type: :JSON, body: output_json, response: response)
636
- rescue JSON::ParserError => ex
637
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
638
- end
639
- else
640
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
641
- end
642
- end
643
-
632
+ self.errors_via_content_type(response: response, type: :xml)
633
+
644
634
  when :JSON
645
- case request.path.path
635
+ case request_path
646
636
  when /^\/query\/jobs.*/ #DataQuery Paths
647
637
  return if body.class != Hash
648
638
  case match_string
@@ -662,7 +652,7 @@ module ZuoraAPI
662
652
  if reporting_message&.include?("com.zuora.rest.RestUsageException: The user does not have permissions for this API.")
663
653
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(reporting_message, response)
664
654
  elsif reporting_message&.include?("500 Internal Server Error")
665
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Internal Server Error. The Reporting API is down. Contact Support.")
655
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Internal Server Error. The Reporting API is down. Contact Support.", response)
666
656
  end
667
657
  case match_string
668
658
  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.
@@ -728,7 +718,6 @@ module ZuoraAPI
728
718
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(50)
729
719
  raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{messages_array.join(', ')}", response)
730
720
  end
731
-
732
721
  #Internal Server Error
733
722
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(60)
734
723
  if messages_array.uniq.size == 1
@@ -739,6 +728,11 @@ module ZuoraAPI
739
728
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("#{messages_array.join(', ')}", response)
740
729
  end
741
730
 
731
+ #Retryiable Service Error
732
+ if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(61)
733
+ raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new("#{messages_array.join(', ')}", response)
734
+ end
735
+
742
736
  #Request exceeded limit
743
737
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(70)
744
738
  raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{messages_array.join(', ')}", response)
@@ -791,32 +785,56 @@ module ZuoraAPI
791
785
  end
792
786
  end
793
787
 
788
+ if body.class == Hash && body['message'].present?
789
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(body['message'], response) if response.code == 500
790
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['message'], response) if ![200,201].include?(response.code)
791
+ end
792
+
793
+ self.errors_via_content_type(response: response, type: :json)
794
+
794
795
  #All other errors
795
- if response.code == 500
796
- if body.class == Hash && body['message'].present?
797
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(body['message'], response)
798
- else
799
- response_content_types = response.headers.transform_keys(&:downcase).fetch('content-type', []).first || ''
796
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new(response.body, response) if ![200,201].include?(response.code)
797
+ end
798
+ end
800
799
 
801
- if response_content_types.include?('application/xml') || response_content_types.include?('text/xml')
802
- self.raise_errors(type: :SOAP, body: Nokogiri::XML(response.body), response: response)
803
- else
804
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
805
- end
806
- end
807
- elsif ![200,201].include?(response.code)
808
- if body['message'].present?
809
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['message'], response)
810
- else
811
- if 403 == response.code && response.body.include?("Forbidden")
812
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
813
- else
814
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(response.body, response)
815
- end
800
+ def errors_via_content_type(response: nil, type: :xml)
801
+ response_content_types = response.headers.transform_keys(&:downcase).fetch('content-type', []).first || ""
802
+
803
+ if response_content_types.include?('application/json') && type != :json
804
+ output_json = JSON.parse(response.body)
805
+ self.raise_errors(type: :JSON, body: output_json, response: response)
806
+
807
+ elsif (response_content_types.include?('application/xml') || response_content_types.include?('text/xml')) and type != :xml
808
+ output_xml = Nokogiri::XML(response.body)
809
+ self.raise_errors(type: :SOAP, body: output_xml, response: response)
810
+
811
+ elsif response_content_types.include?('text/html')
812
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Akamai Error", response) if response.headers.fetch('server', '') == 'AkamaiGHost'
813
+
814
+ parse_body = Nokogiri::HTML(response.body)
815
+ error_title = parse_body.xpath('//h2').text
816
+ error_title = parse_body.xpath('//h1').text if error_title.blank?
817
+ error_message = parse_body.xpath('//p').text
818
+
819
+ error_message = error_title if error_message.blank?
820
+
821
+ if error_title.present?
822
+ case error_title
823
+ when /Service Unavailable/
824
+ raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new(error_message, response)
825
+ when /Client sent a bad request./, /Bad Request/, /403 Forbidden/
826
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
827
+ else
828
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
816
829
  end
817
830
  end
831
+
832
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Http response body is missing", response) if response.body.blank?
818
833
  end
834
+
835
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response) if response.code == 500
819
836
  end
837
+
820
838
 
821
839
  def get_soap_error_and_message(body)
822
840
  error = body.xpath('//fns:FaultCode', 'fns' =>'http://fault.api.zuora.com/').text
@@ -880,9 +898,9 @@ module ZuoraAPI
880
898
  when /.*UNEXPECTED_ERROR/
881
899
  raise ZuoraAPI::Exceptions::ZuoraUnexpectedError.new(message, response, errors, success)
882
900
  when /.*soapenv:Server.*/
883
- if /^Invalid value.*for type.*|^Id is invalid/.match(message).present?
901
+ if /^Invalid value.*for type.*|^Id is invalid|^date string can not be less than 19 charactors$/.match(message).present?
884
902
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
885
- elsif /^Invalid white space character \(.*\) in text to output$/.match(message).present?
903
+ elsif /^Invalid white space character \(.*\) in text to output$|^Invalid null character in text to output$/.match(message).present?
886
904
  raise ZuoraAPI::Exceptions::ZuoraAPIUnkownError.new(message, response, errors, success)
887
905
  end
888
906
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(message, response, errors, success)
@@ -1033,7 +1051,7 @@ module ZuoraAPI
1033
1051
  modified_headers = {'Content-Type' => "application/json; charset=utf-8"}.merge(authentication_headers).merge(headers)
1034
1052
 
1035
1053
  begin
1036
- response = HTTParty::Request.new(
1054
+ request = HTTParty::Request.new(
1037
1055
  "Net::HTTP::#{method.to_s.capitalize}".constantize,
1038
1056
  url,
1039
1057
  body: body,
@@ -1041,7 +1059,9 @@ module ZuoraAPI
1041
1059
  timeout: timeout,
1042
1060
  multipart: multipart,
1043
1061
  stream_body: stream_body
1044
- ).perform(&block)
1062
+ )
1063
+
1064
+ response = request.perform(&block)
1045
1065
 
1046
1066
  Rails.logger.debug("Response Code: #{response.code}") if debug
1047
1067
  begin
@@ -1108,36 +1128,25 @@ module ZuoraAPI
1108
1128
  sleep(timeout_sleep_interval)
1109
1129
  retry
1110
1130
  rescue *CONNECTION_READ_EXCEPTIONS => ex
1111
- if tries.zero?
1112
- if output_exception_messages
1113
- if Rails.logger.class.to_s == "Ougai::Logger"
1114
- Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1115
- else
1116
- Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1117
- end
1131
+ if !tries.zero?
1132
+ tries -= 1
1133
+ if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
1134
+ retry
1135
+ elsif timeout_retry
1136
+ sleep(timeout_sleep_interval)
1137
+ retry
1118
1138
  end
1119
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}") if ex.is_a?(Net::ReadTimeout)
1120
- raise ex
1121
1139
  end
1122
-
1123
- tries -= 1
1124
-
1125
- if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
1126
- retry
1127
- elsif timeout_retry
1128
- sleep(timeout_sleep_interval)
1129
- retry
1130
- else
1131
- if output_exception_messages
1132
- if Rails.logger.class.to_s == "Ougai::Logger"
1133
- Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1134
- else
1135
- Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1136
- end
1140
+
1141
+ if output_exception_messages
1142
+ if Rails.logger.class.to_s == "Ougai::Logger"
1143
+ Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1144
+ else
1145
+ Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1137
1146
  end
1138
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}") if ex.is_a?(Net::ReadTimeout)
1139
- raise ex
1140
1147
  end
1148
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
1149
+ raise ex
1141
1150
  rescue => ex
1142
1151
  raise ex
1143
1152
  else
@@ -1319,75 +1328,122 @@ module ZuoraAPI
1319
1328
  end
1320
1329
  end
1321
1330
 
1322
- def getDataSourceExport(query, extract: true, encrypted: false, zip: true)
1323
- request = Nokogiri::XML::Builder.new do |xml|
1324
- xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1325
- xml['SOAP-ENV'].Header do
1326
- xml['ns1'].SessionHeader do
1327
- xml['ns1'].session self.get_session(prefix: false, auth_type: :basic)
1331
+ def getDataSourceExport(query, extract: true, encrypted: false, zip: true, z_track_id: "")
1332
+ begin
1333
+ tries ||= 3
1334
+ request = Nokogiri::XML::Builder.new do |xml|
1335
+ xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1336
+ xml['SOAP-ENV'].Header do
1337
+ xml['ns1'].SessionHeader do
1338
+ xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1339
+ end
1328
1340
  end
1329
- end
1330
- xml['SOAP-ENV'].Body do
1331
- xml['ns1'].create do
1332
- xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1333
- xml['ns2'].Format 'csv'
1334
- xml['ns2'].Zip zip
1335
- xml['ns2'].Name 'googman'
1336
- xml['ns2'].Query query
1337
- xml['ns2'].Encrypted encrypted
1341
+ xml['SOAP-ENV'].Body do
1342
+ xml['ns1'].create do
1343
+ xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1344
+ xml['ns2'].Format 'csv'
1345
+ xml['ns2'].Zip zip
1346
+ xml['ns2'].Name 'googman'
1347
+ xml['ns2'].Query query
1348
+ xml['ns2'].Encrypted encrypted
1349
+ end
1338
1350
  end
1339
1351
  end
1340
1352
  end
1341
1353
  end
1342
- end
1343
1354
 
1344
- response_query = HTTParty.post(self.url, body: request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8"}, :timeout => 120)
1355
+ response_query = HTTParty.post(self.url, body: request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 120)
1345
1356
 
1346
- output_xml = Nokogiri::XML(response_query.body)
1347
- raise 'Export Creation Unsuccessful : ' + output_xml.xpath('//ns1:Message', 'ns1' =>'http://api.zuora.com/').text if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1348
- id = output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
1357
+ output_xml = Nokogiri::XML(response_query.body)
1358
+ raise_errors(type: :SOAP, body: output_xml, response: response_query) if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1349
1359
 
1350
- confirmRequest = Nokogiri::XML::Builder.new do |xml|
1351
- xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1352
- xml['SOAP-ENV'].Header do
1353
- xml['ns1'].SessionHeader do
1354
- xml['ns1'].session self.get_session(prefix: false, auth_type: :basic)
1360
+ # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1361
+
1362
+ id = output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
1363
+
1364
+ confirmRequest = Nokogiri::XML::Builder.new do |xml|
1365
+ xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1366
+ xml['SOAP-ENV'].Header do
1367
+ xml['ns1'].SessionHeader do
1368
+ xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1369
+ end
1355
1370
  end
1356
- end
1357
- xml['SOAP-ENV'].Body do
1358
- xml['ns1'].query do
1359
- xml['ns1'].queryString "SELECT Id, CreatedById, CreatedDate, Encrypted, FileId, Format, Name, Query, Size, Status, StatusReason, UpdatedById, UpdatedDate, Zip From Export where Id = '#{id}'"
1371
+ xml['SOAP-ENV'].Body do
1372
+ xml['ns1'].query do
1373
+ xml['ns1'].queryString "SELECT Id, CreatedById, CreatedDate, Encrypted, FileId, Format, Name, Query, Size, Status, StatusReason, UpdatedById, UpdatedDate, Zip From Export where Id = '#{id}'"
1374
+ end
1360
1375
  end
1361
1376
  end
1362
1377
  end
1363
- end
1364
- result = 'Waiting'
1378
+ result = 'Waiting'
1365
1379
 
1366
- while result != "Completed"
1367
- sleep 3
1368
- response_query = HTTParty.post(self.url, body: confirmRequest.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8"}, :timeout => 120)
1380
+ while result != "Completed"
1381
+ sleep 3
1382
+ response_query = HTTParty.post(self.url, body: confirmRequest.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 120)
1369
1383
 
1370
- output_xml = Nokogiri::XML(response_query.body)
1371
- result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
1372
- status_code = response_query.code if response_query
1373
- raise "Export Creation Unsuccessful : #{output_xml.xpath('//ns1:Message', 'ns1' =>'http://api.zuora.com/').text}" if result.blank? || result == "Failed"
1374
- end
1384
+ output_xml = Nokogiri::XML(response_query.body)
1385
+ result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
1386
+ status_code = response_query.code if response_query
1375
1387
 
1376
- file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
1377
- export_file = get_file(:url => self.fileURL(file_id))
1378
- export_file_path = export_file.path
1379
- Rails.logger.debug("=====> Export path #{export_file.path}")
1380
-
1381
- if extract && zip
1382
- require "zip"
1383
- new_path = export_file_path.partition('.zip').first
1384
- zipped = Zip::File.open(export_file_path)
1385
- file_handle = zipped.entries.first
1386
- file_handle.extract(new_path)
1387
- File.delete(export_file_path)
1388
- return new_path
1389
- else
1390
- return export_file_path
1388
+ raise_errors(type: :SOAP, body: output_xml, response: response_query) if result.blank? || result == "Failed"
1389
+ # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if result.blank? || result == "Failed"
1390
+ end
1391
+
1392
+ file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
1393
+ export_file = get_file(:url => self.fileURL(file_id))
1394
+ export_file_path = export_file.path
1395
+ Rails.logger.debug("=====> Export path #{export_file.path}")
1396
+
1397
+ if extract && zip
1398
+ require "zip"
1399
+ new_path = export_file_path.partition('.zip').first
1400
+ zipped = Zip::File.open(export_file_path)
1401
+ file_handle = zipped.entries.first
1402
+ file_handle.extract(new_path)
1403
+ File.delete(export_file_path)
1404
+ return new_path
1405
+ else
1406
+ return export_file_path
1407
+ end
1408
+ rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1409
+ if !(tries -= 1).zero?
1410
+ Rails.logger.info("Export call failed - Trace ID: #{z_track_id}")
1411
+ self.new_session
1412
+ retry
1413
+ else
1414
+ raise ex
1415
+ end
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
+
1426
+ rescue *ZUORA_API_ERRORS => ex
1427
+ raise ex
1428
+
1429
+ rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
1430
+ if !(tries -= 1).zero?
1431
+ Rails.logger.info("Trace ID: #{z_track_id} Timed out will retry after 5 seconds")
1432
+ sleep 5
1433
+ retry
1434
+ else
1435
+ raise ex
1436
+ end
1437
+
1438
+ rescue Errno::ECONNRESET => ex
1439
+ if !(tries -= 1).zero? && ex.message.include?('SSL_connect')
1440
+ retry
1441
+ else
1442
+ raise ex
1443
+ end
1444
+
1445
+ rescue ZuoraAPI::Exceptions::BadEntityError => ex
1446
+ raise ex
1391
1447
  end
1392
1448
  end
1393
1449
 
@@ -46,34 +46,28 @@ module ZuoraAPI
46
46
  Rails.logger.debug {"Session Invalid"}
47
47
  self.new_session(auth_type: :bearer)
48
48
  retry
49
- else
50
- if errors.include?(ex.class)
51
- raise ex
52
- else
53
- return [output_json, response]
54
- end
55
49
  end
50
+ raise ex if errors.include?(ex.class)
51
+ return [output_json, response]
52
+
56
53
  rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
57
- if errors.include?(ex.class)
58
- raise ex
59
- else
60
- return [output_json, response]
61
- end
54
+ raise ex if errors.include?(ex.class)
55
+ return [output_json, response]
56
+
62
57
  rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
63
58
  if !tries.zero?
64
59
  tries -= 1
65
60
  sleep(self.timeout_sleep)
66
61
  retry
62
+ end
63
+ if Rails.logger.class.to_s == "Ougai::Logger"
64
+ Rails.logger.error("OAuthLogin - Timed out", ex)
67
65
  else
68
- if Rails.logger.class.to_s == "Ougai::Logger"
69
- Rails.logger.error("OAuthLogin - Timed out", ex)
70
- else
71
- Rails.logger.error("OAuthLogin - #{ex.class} Timed out")
72
- end
73
- self.current_error = "Request timed out. Try again"
74
- self.status = 'Timeout'
75
- return self.status
66
+ Rails.logger.error("OAuthLogin - #{ex.class} Timed out")
76
67
  end
68
+ self.current_error = "Request timed out. Try again"
69
+ self.status = 'Timeout'
70
+ return self.status
77
71
  end
78
72
 
79
73
  def get_bearer_token(zuora_track_id: nil)
@@ -1,3 +1,3 @@
1
1
  module ZuoraAPI
2
- VERSION = "1.7.65c"
2
+ VERSION = "1.7.65i"
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.65c
4
+ version: 1.7.65i
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-04-28 00:00:00.000000000 Z
11
+ date: 2020-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler