Пример #1
0
 def __init__(self):
     self.__context__ = ssl.SSLCertVerificationError(
         f"hostname '{old_domain}' doesn't match")
Пример #2
0
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,
            ),
        },
    }
Пример #3
0
 def __init__(self):
     self.__context__ = ssl.SSLCertVerificationError(
         "some random message that doesn't match")
Пример #4
0
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