def __init__(self): self.__context__ = ssl.SSLCertVerificationError( f"hostname '{old_domain}' doesn't match")
async def test_announcer_collect( mocker: MockerFixture, root: Path, config: Config, post: Post, ) -> None: """ Test collecting interactions on posts and sites. """ builder = Builder(root, config, "gemini://example.com/", "gemini") Client = mocker.patch("nefelibata.announcers.gemlog.Client") Client.return_value.get = mocker.AsyncMock() Client.return_value.get.return_value.read.side_effect = [ b""" => gemini://example.com/reply.gmi Re: This is your first post """, b""" => gemini://example.com/first/index.gmi """, ] announcer = CAPCOMAnnouncer(root, config, builders=[builder]) # post collect is no-op interactions = await announcer.collect_post(post) assert interactions == {} interactions = await announcer.collect_site() assert interactions == { Path("/path/to/blog/posts/first/index.mkd"): { "reply,gemini://example.com/reply.gmi": Interaction( id="reply,gemini://example.com/reply.gmi", name="Re: This is your first post", url="gemini://example.com/reply.gmi", type="reply", timestamp=None, ), }, } # test no backlink Client.return_value.get.return_value.read.side_effect = [ b""" => gemini://example.com/reply.gmi Re: This is your first post """, b"", ] announcer = CAPCOMAnnouncer(root, config, builders=[builder]) interactions = await announcer.collect_site() assert interactions == {} # test SSL error response = mocker.AsyncMock() response.read.return_value = b""" => gemini://example.com/reply.gmi Re: This is your first post """ Client.return_value.get.side_effect = [ response, ssl.SSLCertVerificationError("A wild error appears!"), ] announcer = CAPCOMAnnouncer(root, config, builders=[builder]) interactions = await announcer.collect_site() assert interactions == { Path("/path/to/blog/posts/first/index.mkd"): { "reply,gemini://example.com/reply.gmi": Interaction( id="reply,gemini://example.com/reply.gmi", name="Re: This is your first post", url="gemini://example.com/reply.gmi", type="reply", timestamp=None, ), }, }
def __init__(self): self.__context__ = ssl.SSLCertVerificationError( "some random message that doesn't match")
def _intercept_http_request(self, uri, method="GET", headers={}, **kwargs): if not headers.get('X-Request-Id'): headers['X-Request-Id'] = self._request_id() try: if (self.max_request_size and kwargs.get('body') and self.max_request_size < len(kwargs['body'])): raise apiclient_errors.MediaUploadSizeError( "Request size %i bytes exceeds published limit of %i bytes" % (len(kwargs['body']), self.max_request_size)) if config.get("ARVADOS_EXTERNAL_CLIENT", "") == "true": headers['X-External-Client'] = '1' headers['Authorization'] = 'OAuth2 %s' % self.arvados_api_token retryable = method in ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT'] retry_count = self._retry_count if retryable else 0 if (not retryable and time.time() - self._last_request_time > self._max_keepalive_idle): # High probability of failure due to connection atrophy. Make # sure this request [re]opens a new connection by closing and # forgetting all cached connections first. for conn in self.connections.values(): conn.close() self.connections.clear() delay = self._retry_delay_initial for _ in range(retry_count): self._last_request_time = time.time() try: return self.orig_http_request(uri, method, headers=headers, **kwargs) except http.client.HTTPException: _logger.debug( "[%s] Retrying API request in %d s after HTTP error", headers['X-Request-Id'], delay, exc_info=True) except ssl.SSLCertVerificationError as e: raise ssl.SSLCertVerificationError( e.args[0], "Could not connect to %s\n%s\nPossible causes: remote SSL/TLS certificate expired, or was issued by an untrusted certificate authority." % (uri, e)) from None except socket.error: # This is the one case where httplib2 doesn't close the # underlying connection first. Close all open # connections, expecting this object only has the one # connection to the API server. This is safe because # httplib2 reopens connections when needed. _logger.debug( "[%s] Retrying API request in %d s after socket error", headers['X-Request-Id'], delay, exc_info=True) for conn in self.connections.values(): conn.close() time.sleep(delay) delay = delay * self._retry_delay_backoff self._last_request_time = time.time() return self.orig_http_request(uri, method, headers=headers, **kwargs) except Exception as e: # Prepend "[request_id] " to the error message, which we # assume is the first string argument passed to the exception # constructor. for i in range(len(e.args or ())): if type(e.args[i]) == type(""): e.args = e.args[:i] + ("[{}] {}".format( headers['X-Request-Id'], e.args[i]), ) + e.args[i + 1:] raise type(e)(*e.args) raise