zuora_api 1.7.65c → 1.7.65i
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/zuora_api/exceptions.rb +3 -2
- data/lib/zuora_api/login.rb +213 -157
- data/lib/zuora_api/logins/oauth.rb +13 -19
- data/lib/zuora_api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d3a5ce233d3d4b441e52a9d4342db32d616d2bcd23e650ad0e5c09208b5904e
|
4
|
+
data.tar.gz: 5c1acb4964d32582cb84a05b0b120bde86d3d572fbeb663dff5ad2a58e228448
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45f208500da4b73e03a91fd9381fb5408f2007d62f698b97c74a46c5e71616e5b312fd0beaf00a19b977aab868850b83c03e4f8910fa1f2292666e13204e8598
|
7
|
+
data.tar.gz: '06791a0a95a2031edb03efa889d35f7721f129d3e8318565e7b6a86fef6a2539b361f1ca1fe27e8470b7a43e5d6d29c463de1b0710451f539353b51e599b5903'
|
data/lib/zuora_api/exceptions.rb
CHANGED
@@ -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
|
|
data/lib/zuora_api/login.rb
CHANGED
@@ -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
|
-
|
477
|
+
request = HTTParty::Request.new(
|
478
|
+
Net::HTTP::Post,
|
478
479
|
self.url,
|
479
|
-
:
|
480
|
-
:
|
481
|
-
:
|
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
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
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
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
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
|
-
|
567
|
-
|
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 #{
|
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 #{
|
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
|
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
|
-
|
630
|
-
|
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
|
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
|
796
|
-
|
797
|
-
|
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
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
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
|
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
|
-
|
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
|
-
)
|
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
|
-
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
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
|
-
|
1124
|
-
|
1125
|
-
|
1126
|
-
|
1127
|
-
|
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
|
-
|
1324
|
-
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
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
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
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
|
-
|
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
|
-
|
1347
|
-
|
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
|
-
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
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
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
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
|
-
|
1364
|
-
result = 'Waiting'
|
1378
|
+
result = 'Waiting'
|
1365
1379
|
|
1366
|
-
|
1367
|
-
|
1368
|
-
|
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
|
-
|
1371
|
-
|
1372
|
-
|
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
|
-
|
1377
|
-
|
1378
|
-
|
1379
|
-
|
1380
|
-
|
1381
|
-
|
1382
|
-
|
1383
|
-
|
1384
|
-
|
1385
|
-
|
1386
|
-
|
1387
|
-
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
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
|
-
|
59
|
-
|
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
|
-
|
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)
|
data/lib/zuora_api/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2020-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|