@@ -18,6 +18,10 @@ def __init__(self, verbose=False):
18
18
self .verbose = verbose
19
19
self .connections = {} # {(host, port, ssl): (reader, writer)}
20
20
21
+ def close (self ):
22
+ for _ , writer in self .connections .values ():
23
+ writer .close ()
24
+
21
25
@coroutine
22
26
def open_connection (self , host , port , ssl ):
23
27
port = port or (443 if ssl else 80 )
@@ -187,18 +191,21 @@ def read(self):
187
191
@coroutine
188
192
def fetch (url , verbose = True , max_redirect = 10 ):
189
193
pool = ConnectionPool (verbose )
190
- for _ in range (max_redirect ):
191
- request = Request (url , verbose )
192
- yield from request .connect (pool )
193
- yield from request .send_request ()
194
- response = yield from request .get_response ()
195
- body = yield from response .read ()
196
- next_url = response .get_redirect_url ()
197
- if not next_url :
198
- break
199
- url = urllib .parse .urljoin (url , next_url )
200
- print ('redirect to' , url , file = sys .stderr )
201
- return body
194
+ try :
195
+ for _ in range (max_redirect ):
196
+ request = Request (url , verbose )
197
+ yield from request .connect (pool )
198
+ yield from request .send_request ()
199
+ response = yield from request .get_response ()
200
+ body = yield from response .read ()
201
+ next_url = response .get_redirect_url ()
202
+ if not next_url :
203
+ break
204
+ url = urllib .parse .urljoin (url , next_url )
205
+ print ('redirect to' , url , file = sys .stderr )
206
+ return body
207
+ finally :
208
+ pool .close ()
202
209
203
210
204
211
def main ():
0 commit comments