zuora_api 1.7.65 → 1.7.66

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: 2f825e33478662937ab98762bab71f5d10b55acedc5f14f51022f4e9a66bfb0e
4
- data.tar.gz: 8a0edd6a1c0a7b11353b1057e14eb8d40cb47e85f3b7faac832532b1253e5ce5
3
+ metadata.gz: ff05150108e2fbba1a069083c46b53d4b43d95d95d4cfb4bcd82d10881e80091
4
+ data.tar.gz: b8543c688b33ee85357716df5e1f93b7cafef3702074914355aa30960b8726dd
5
5
  SHA512:
6
- metadata.gz: c7846e3e6df13eee656df3d122d98bf1f5694c83751836bd93810d6e3ec6ca6f88ba69b80d67cb04c9f30f4f94d2338c576eacd6d4401be0e27f9c2721f51fce
7
- data.tar.gz: '0543405827032e0d71cf4f9462d565fb94ffb8ccdd76df9e59ccf2fd099ba8f608ff3ec057f1aa2b5577bb4448c583971e550cf69c1285b47736edc1ad3b9b1f'
6
+ metadata.gz: 9b2a8309a4a1c88a13be63df6eb96c08d27e25076b379c740b7eddd1898a60f46249388e7279d98e67fd72469e49f1a6abdc5c7f3a62aa32905909c100de46ad
7
+ data.tar.gz: 0a706abfa46ed54f332f903a2af7c118dfda2aaa6f61a280b9c2f989fb19790484aefcabed72bbcdc9b5ab37a2befb46913d2771ab6a924095c34ec80a8a595c
@@ -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,34 +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 ex
538
542
  end
539
543
 
540
- tries -= 1
541
-
542
- if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
543
- retry
544
- elsif timeout_retry
545
- sleep(timeout_sleep_interval)
546
- retry
547
- else
548
- if output_exception_messages
549
- if Rails.logger.class.to_s == "Ougai::Logger"
550
- Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
551
- else
552
- Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
553
- 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")
554
549
  end
555
- raise ex
556
550
  end
551
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
552
+ raise ex
557
553
  rescue => ex
558
554
  raise ex
559
555
  else
@@ -561,24 +557,33 @@ module ZuoraAPI
561
557
  end
562
558
 
563
559
  def raise_errors(type: :SOAP, body: nil, response: nil)
564
- request = response.request
565
- 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
566
571
 
567
572
  if [502,503].include?(response.code)
568
- 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)
569
574
  end
570
575
 
571
576
  # Check failure response code
572
577
  case response.code
573
578
  when 504
574
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{response.request.uri}", response)
579
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{request_uri}", response)
575
580
  when 429
576
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)
577
582
  when 401
578
583
 
579
584
  else
580
585
  if body.class == Hash
581
- case response.request.path.path
586
+ case request_path
582
587
  when /^\/v1\/connections$/
583
588
  response_headers = response.headers.to_h
584
589
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Missing cookies for authentication call", response) if response_headers['set-cookie'].blank?
@@ -602,7 +607,7 @@ module ZuoraAPI
602
607
  reason = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
603
608
  if reason.present?
604
609
  message = body.xpath('//ns2:StatusReason', 'ns2' => 'http://object.api.zuora.com/').text
605
- error = message.match(/^[\w\d]{16}\: (Unexpected error.|No HTTP Response)/).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'
606
611
  else
607
612
  error = 'FATAL_ERROR'
608
613
  message = 'Export failed due to unknown reason. Consult api logs.'
@@ -624,23 +629,10 @@ module ZuoraAPI
624
629
  end
625
630
  end
626
631
 
627
- if (response.code == 400 && response.headers.fetch('content-type', []).include?('text/html'))
628
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
629
- elsif response.code == 500
630
- if response.headers.fetch('content-type', []).include?('application/json')
631
- begin
632
- output_json = JSON.parse(response.body)
633
- self.raise_errors(type: :JSON, body: output_json, response: response)
634
- rescue JSON::ParserError => ex
635
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
636
- end
637
- else
638
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
639
- end
640
- end
641
-
632
+ self.errors_via_content_type(response: response, type: :xml)
633
+
642
634
  when :JSON
643
- case request.path.path
635
+ case request_path
644
636
  when /^\/query\/jobs.*/ #DataQuery Paths
645
637
  return if body.class != Hash
646
638
  case match_string
@@ -660,7 +652,7 @@ module ZuoraAPI
660
652
  if reporting_message&.include?("com.zuora.rest.RestUsageException: The user does not have permissions for this API.")
661
653
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(reporting_message, response)
662
654
  elsif reporting_message&.include?("500 Internal Server Error")
663
- 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)
664
656
  end
665
657
  case match_string
666
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.
@@ -726,7 +718,6 @@ module ZuoraAPI
726
718
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(50)
727
719
  raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{messages_array.join(', ')}", response)
728
720
  end
729
-
730
721
  #Internal Server Error
731
722
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(60)
732
723
  if messages_array.uniq.size == 1
@@ -737,6 +728,11 @@ module ZuoraAPI
737
728
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("#{messages_array.join(', ')}", response)
738
729
  end
739
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
+
740
736
  #Request exceeded limit
741
737
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(70)
742
738
  raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{messages_array.join(', ')}", response)
@@ -789,26 +785,56 @@ module ZuoraAPI
789
785
  end
790
786
  end
791
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
+
792
795
  #All other errors
793
- if response.code == 500
794
- if body.class == Hash && body['message'].present?
795
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(body['message'], response)
796
- else
797
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
798
- end
799
- elsif ![200,201].include?(response.code)
800
- if body['message'].present?
801
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['message'], response)
802
- else
803
- if 403 == response.code && response.body.include?("Forbidden")
804
- raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response)
805
- else
806
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(response.body, response)
807
- end
796
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new(response.body, response) if ![200,201].include?(response.code)
797
+ end
798
+ end
799
+
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)
808
829
  end
809
830
  end
831
+
832
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new("Http response body is missing", response) if response.body.blank?
810
833
  end
834
+
835
+ raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(response.body, response) if response.code == 500
811
836
  end
837
+
812
838
 
813
839
  def get_soap_error_and_message(body)
814
840
  error = body.xpath('//fns:FaultCode', 'fns' =>'http://fault.api.zuora.com/').text
@@ -872,9 +898,9 @@ module ZuoraAPI
872
898
  when /.*UNEXPECTED_ERROR/
873
899
  raise ZuoraAPI::Exceptions::ZuoraUnexpectedError.new(message, response, errors, success)
874
900
  when /.*soapenv:Server.*/
875
- 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?
876
902
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new(message, response, errors, success)
877
- 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?
878
904
  raise ZuoraAPI::Exceptions::ZuoraAPIUnkownError.new(message, response, errors, success)
879
905
  end
880
906
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(message, response, errors, success)
@@ -1025,7 +1051,7 @@ module ZuoraAPI
1025
1051
  modified_headers = {'Content-Type' => "application/json; charset=utf-8"}.merge(authentication_headers).merge(headers)
1026
1052
 
1027
1053
  begin
1028
- response = HTTParty::Request.new(
1054
+ request = HTTParty::Request.new(
1029
1055
  "Net::HTTP::#{method.to_s.capitalize}".constantize,
1030
1056
  url,
1031
1057
  body: body,
@@ -1033,7 +1059,9 @@ module ZuoraAPI
1033
1059
  timeout: timeout,
1034
1060
  multipart: multipart,
1035
1061
  stream_body: stream_body
1036
- ).perform(&block)
1062
+ )
1063
+
1064
+ response = request.perform(&block)
1037
1065
 
1038
1066
  Rails.logger.debug("Response Code: #{response.code}") if debug
1039
1067
  begin
@@ -1100,34 +1128,25 @@ module ZuoraAPI
1100
1128
  sleep(timeout_sleep_interval)
1101
1129
  retry
1102
1130
  rescue *CONNECTION_READ_EXCEPTIONS => ex
1103
- if tries.zero?
1104
- if output_exception_messages
1105
- if Rails.logger.class.to_s == "Ougai::Logger"
1106
- Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1107
- else
1108
- Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1109
- 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
1110
1138
  end
1111
- raise ex
1112
1139
  end
1113
-
1114
- tries -= 1
1115
-
1116
- if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
1117
- retry
1118
- elsif timeout_retry
1119
- sleep(timeout_sleep_interval)
1120
- retry
1121
- else
1122
- if output_exception_messages
1123
- if Rails.logger.class.to_s == "Ougai::Logger"
1124
- Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1125
- else
1126
- Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1127
- 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")
1128
1146
  end
1129
- raise ex
1130
1147
  end
1148
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
1149
+ raise ex
1131
1150
  rescue => ex
1132
1151
  raise ex
1133
1152
  else
@@ -1183,6 +1202,8 @@ module ZuoraAPI
1183
1202
  def get_file(url: nil, headers: {}, z_session: true, tempfile: true, output_file_name: nil, zuora_track_id: nil, add_timestamp: true, file_path: defined?(Rails.root.join('tmp')) ? Rails.root.join('tmp') : Pathname.new(Dir.pwd), timeout_retries: 3, timeout: 120, session_type: :basic, **execute_params)
1184
1203
  raise "file_path must be of class Pathname" if file_path.class != Pathname
1185
1204
 
1205
+ retry_count ||= timeout_retries
1206
+
1186
1207
  #Make sure directory exists
1187
1208
  require 'fileutils'
1188
1209
  FileUtils.mkdir_p(file_path) unless File.exists?(file_path)
@@ -1200,7 +1221,6 @@ module ZuoraAPI
1200
1221
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
1201
1222
 
1202
1223
  response_save = nil
1203
- retry_count ||= timeout_retries
1204
1224
  http.request_get(uri.request_uri, headers) do |response|
1205
1225
  response_save = response
1206
1226
  status_code = response.code if response
@@ -1308,75 +1328,122 @@ module ZuoraAPI
1308
1328
  end
1309
1329
  end
1310
1330
 
1311
- def getDataSourceExport(query, extract: true, encrypted: false, zip: true)
1312
- request = Nokogiri::XML::Builder.new do |xml|
1313
- 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
1314
- xml['SOAP-ENV'].Header do
1315
- xml['ns1'].SessionHeader do
1316
- 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
1317
1340
  end
1318
- end
1319
- xml['SOAP-ENV'].Body do
1320
- xml['ns1'].create do
1321
- xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1322
- xml['ns2'].Format 'csv'
1323
- xml['ns2'].Zip zip
1324
- xml['ns2'].Name 'googman'
1325
- xml['ns2'].Query query
1326
- 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
1327
1350
  end
1328
1351
  end
1329
1352
  end
1330
1353
  end
1331
- end
1332
1354
 
1333
- 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)
1334
1356
 
1335
- output_xml = Nokogiri::XML(response_query.body)
1336
- 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"
1337
- 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"
1338
1359
 
1339
- confirmRequest = Nokogiri::XML::Builder.new do |xml|
1340
- 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
1341
- xml['SOAP-ENV'].Header do
1342
- xml['ns1'].SessionHeader do
1343
- 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
1344
1370
  end
1345
- end
1346
- xml['SOAP-ENV'].Body do
1347
- xml['ns1'].query do
1348
- 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
1349
1375
  end
1350
1376
  end
1351
1377
  end
1352
- end
1353
- result = 'Waiting'
1378
+ result = 'Waiting'
1354
1379
 
1355
- while result != "Completed"
1356
- sleep 3
1357
- 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)
1358
1383
 
1359
- output_xml = Nokogiri::XML(response_query.body)
1360
- result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
1361
- status_code = response_query.code if response_query
1362
- raise "Export Creation Unsuccessful : #{output_xml.xpath('//ns1:Message', 'ns1' =>'http://api.zuora.com/').text}" if result.blank? || result == "Failed"
1363
- 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
1364
1387
 
1365
- file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
1366
- export_file = get_file(:url => self.fileURL(file_id))
1367
- export_file_path = export_file.path
1368
- Rails.logger.debug("=====> Export path #{export_file.path}")
1369
-
1370
- if extract && zip
1371
- require "zip"
1372
- new_path = export_file_path.partition('.zip').first
1373
- zipped = Zip::File.open(export_file_path)
1374
- file_handle = zipped.entries.first
1375
- file_handle.extract(new_path)
1376
- File.delete(export_file_path)
1377
- return new_path
1378
- else
1379
- 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
1380
1447
  end
1381
1448
  end
1382
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.65"
2
+ VERSION = "1.7.66"
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.65
4
+ version: 1.7.66
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-24 00:00:00.000000000 Z
11
+ date: 2020-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler