55#
66from __future__ import absolute_import
77
8+ from ns1 .helpers import get_next_page
89from ns1 .rest .transport .base import TransportBase
910from ns1 .rest .errors import (
1011 ResourceException ,
@@ -54,30 +55,7 @@ def _set_opener(self):
5455 return build_opener (HTTPSHandler (context = context ))
5556 return build_opener (HTTPSHandler )
5657
57- def send (
58- self ,
59- method ,
60- url ,
61- headers = None ,
62- data = None ,
63- files = None ,
64- params = None ,
65- callback = None ,
66- errback = None ,
67- ):
68- if headers is None :
69- headers = {}
70- if files is not None :
71- # XXX
72- raise Exception ("file uploads not supported in BasicTransport yet" )
73- self ._logHeaders (headers )
74- self ._log .debug ("%s %s %s" % (method , url , data ))
75-
76- if sys .version_info .major >= 3 and isinstance (data , str ):
77- data = data .encode ("utf-8" )
78- request = Request (url , headers = headers , data = data )
79- request .get_method = lambda : method
80-
58+ def _send (self , url , headers , data , method , errback ):
8159 def handleProblem (code , resp , msg ):
8260 if errback :
8361 errback ((resp , msg ))
@@ -103,6 +81,9 @@ def handleProblem(code, resp, msg):
10381 body = msg ,
10482 )
10583
84+ request = Request (url , headers = headers , data = data )
85+ request .get_method = lambda : method
86+
10687 # Handle error and responses the same so we can
10788 # always pass the body to the handleProblem function
10889 try :
@@ -127,22 +108,54 @@ def handleProblem(code, resp, msg):
127108 except AttributeError :
128109 pass
129110 try :
130- jsonOut = json .loads (body )
111+ return headers , json .loads (body )
131112 except ValueError :
132113 if errback :
133114 errback (resp )
134- return
135115 else :
136116 raise ResourceException (
137117 "invalid json in response" , resp , body
138118 )
139119 else :
140- jsonOut = None
120+ return headers , None
121+
122+ def send (
123+ self ,
124+ method ,
125+ url ,
126+ headers = None ,
127+ data = None ,
128+ files = None ,
129+ params = None ,
130+ callback = None ,
131+ errback = None ,
132+ pagination_handler = None ,
133+ ):
134+ if headers is None :
135+ headers = {}
136+ if files is not None :
137+ # XXX
138+ raise Exception ("file uploads not supported in BasicTransport yet" )
139+ self ._logHeaders (headers )
140+ self ._log .debug ("%s %s %s" % (method , url , data ))
141+
142+ if sys .version_info .major >= 3 and isinstance (data , str ):
143+ data = data .encode ("utf-8" )
144+
145+ resp_headers , jsonOut = self ._send (url , headers , data , method , errback )
146+ if self ._follow_pagination and pagination_handler is not None :
147+ next_page = get_next_page (resp_headers )
148+ while next_page is not None :
149+ self ._log .debug ("following pagination to: %s" % (next_page ))
150+ next_headers , next_json = self ._send (
151+ next_page , headers , data , method , errback
152+ )
153+ jsonOut = pagination_handler (jsonOut , next_json )
154+ next_page = get_next_page (next_headers )
141155
142156 if callback :
143157 return callback (jsonOut )
144- else :
145- return jsonOut
158+ return jsonOut
146159
147160 def _get_headers (self , response ):
148161 # works for 2 and 3
0 commit comments