11from datetime import datetime
22from decimal import Decimal
3+ from functools import partial
34from urllib .request import urlopen
45from urllib .error import HTTPError
56from xml .sax import handler , make_parser
@@ -120,43 +121,31 @@ def query(self, query: Union[bytes, str]) -> "Result":
120121 if not isinstance (query , bytes ):
121122 query = query .encode ("utf-8" )
122123
123- retry_num : int = 0
124124 retry_exceptions : List [exception .OverPyException ] = []
125- do_retry : bool = True if self . max_retry_count > 0 else False
126- while retry_num <= self .max_retry_count :
127- if retry_num > 0 :
125+
126+ for run in range ( self .max_retry_count + 1 ) :
127+ if run :
128128 time .sleep (self .retry_timeout )
129- retry_num += 1
129+
130+ response = b""
130131 try :
131- f = urlopen (self .url , query )
132- except HTTPError as e :
133- f = e
134-
135- response = f .read (self .read_chunk_size )
136- while True :
137- data = f .read (self .read_chunk_size )
138- if len (data ) == 0 :
139- break
140- response = response + data
141- f .close ()
132+ with urlopen (self .url , query ) as f :
133+ f_read = partial (f .read , self .read_chunk_size )
134+ for data in iter (f_read , b"" ):
135+ response += data
136+ except HTTPError as exc :
137+ f = exc
142138
143139 current_exception : exception .OverPyException
144140 if f .code == 200 :
145141 content_type = f .getheader ("Content-Type" )
146-
147142 if content_type == "application/json" :
148143 return self .parse_json (response )
149-
150- if content_type == "application/osm3s+xml" :
144+ elif content_type == "application/osm3s+xml" :
151145 return self .parse_xml (response )
152-
153- current_exception = exception .OverpassUnknownContentType (content_type )
154- if not do_retry :
155- raise current_exception
156- retry_exceptions .append (current_exception )
157- continue
158-
159- if f .code == 400 :
146+ else :
147+ current_exception = exception .OverpassUnknownContentType (content_type )
148+ elif f .code == 400 :
160149 msgs : List [str ] = []
161150 for msg_raw in self ._regex_extract_error_msg .finditer (response ):
162151 msg_clean_bytes = self ._regex_remove_tag .sub (b"" , msg_raw .group ("msg" ))
@@ -165,37 +154,17 @@ def query(self, query: Union[bytes, str]) -> "Result":
165154 except UnicodeDecodeError :
166155 msg = repr (msg_clean_bytes )
167156 msgs .append (msg )
168-
169- current_exception = exception .OverpassBadRequest (
170- query ,
171- msgs = msgs
172- )
173- if not do_retry :
174- raise current_exception
175- retry_exceptions .append (current_exception )
176- continue
177-
178- if f .code == 429 :
157+ current_exception = exception .OverpassBadRequest (query , msgs = msgs )
158+ elif f .code == 429 :
179159 current_exception = exception .OverpassTooManyRequests ()
180- if not do_retry :
181- raise current_exception
182- retry_exceptions .append (current_exception )
183- continue
184-
185- if f .code == 504 :
160+ elif f .code == 504 :
186161 current_exception = exception .OverpassGatewayTimeout ()
187- if not do_retry :
188- raise current_exception
189- retry_exceptions .append (current_exception )
190- continue
191-
192- current_exception = exception .OverpassUnknownHTTPStatusCode (f .code )
193- if not do_retry :
162+ else :
163+ current_exception = exception .OverpassUnknownHTTPStatusCode (f .code )
164+ if not self .max_retry_count :
194165 raise current_exception
195166 retry_exceptions .append (current_exception )
196- continue
197-
198- raise exception .MaxRetriesReached (retry_count = retry_num , exceptions = retry_exceptions )
167+ raise exception .MaxRetriesReached (retry_count = run + 1 , exceptions = retry_exceptions )
199168
200169 def parse_json (self , data : Union [bytes , str ], encoding : str = "utf-8" ) -> "Result" :
201170 """
0 commit comments