Skip to content

Commit 742fc7e

Browse files
committed
src - Refactor querying
1 parent d74c1ff commit 742fc7e

File tree

1 file changed

+23
-54
lines changed

1 file changed

+23
-54
lines changed

overpy/__init__.py

Lines changed: 23 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from datetime import datetime
22
from decimal import Decimal
3+
from functools import partial
34
from urllib.request import urlopen
45
from urllib.error import HTTPError
56
from 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

Comments
 (0)