(
self,
curl: pycurl.Curl,
curl_error: Optional[int] = None,
curl_message: Optional[str] = None,
)
| 255 | break |
| 256 | |
| 257 | def _finish( |
| 258 | self, |
| 259 | curl: pycurl.Curl, |
| 260 | curl_error: Optional[int] = None, |
| 261 | curl_message: Optional[str] = None, |
| 262 | ) -> None: |
| 263 | info = curl.info # type: ignore |
| 264 | curl.info = None # type: ignore |
| 265 | self._multi.remove_handle(curl) |
| 266 | self._free_list.append(curl) |
| 267 | buffer = info["buffer"] |
| 268 | if curl_error: |
| 269 | assert curl_message is not None |
| 270 | error = CurlError(curl_error, curl_message) # type: Optional[CurlError] |
| 271 | assert error is not None |
| 272 | code = error.code |
| 273 | effective_url = None |
| 274 | buffer.close() |
| 275 | buffer = None |
| 276 | else: |
| 277 | error = None |
| 278 | code = curl.getinfo(pycurl.HTTP_CODE) |
| 279 | effective_url = curl.getinfo(pycurl.EFFECTIVE_URL) |
| 280 | buffer.seek(0) |
| 281 | # the various curl timings are documented at |
| 282 | # http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html |
| 283 | time_info = dict( |
| 284 | queue=info["curl_start_ioloop_time"] - info["queue_start_time"], |
| 285 | namelookup=curl.getinfo(pycurl.NAMELOOKUP_TIME), |
| 286 | connect=curl.getinfo(pycurl.CONNECT_TIME), |
| 287 | appconnect=curl.getinfo(pycurl.APPCONNECT_TIME), |
| 288 | pretransfer=curl.getinfo(pycurl.PRETRANSFER_TIME), |
| 289 | starttransfer=curl.getinfo(pycurl.STARTTRANSFER_TIME), |
| 290 | total=curl.getinfo(pycurl.TOTAL_TIME), |
| 291 | redirect=curl.getinfo(pycurl.REDIRECT_TIME), |
| 292 | ) |
| 293 | try: |
| 294 | info["callback"]( |
| 295 | HTTPResponse( |
| 296 | request=info["request"], |
| 297 | code=code, |
| 298 | headers=info["headers"], |
| 299 | buffer=buffer, |
| 300 | effective_url=effective_url, |
| 301 | error=error, |
| 302 | reason=info["headers"].get("X-Http-Reason", None), |
| 303 | request_time=self.io_loop.time() - info["curl_start_ioloop_time"], |
| 304 | start_time=info["curl_start_time"], |
| 305 | time_info=time_info, |
| 306 | ) |
| 307 | ) |
| 308 | except Exception: |
| 309 | self.handle_callback_exception(info["callback"]) |
| 310 | |
| 311 | def handle_callback_exception(self, callback: Any) -> None: |
| 312 | app_log.error("Exception in callback %r", callback, exc_info=True) |
no test coverage detected