######################################################################
#
# File: b2sdk/v1/b2http.py
#
# Copyright 2021 Backblaze Inc. All Rights Reserved.
#
# License https://www.backblaze.com/using_b2_code.html
#
######################################################################
from __future__ import annotations

import requests

from b2sdk import v2


# Overridden to retain old-style __init__ signature
class B2Http(v2.B2Http):
    """
    A wrapper for the requests module.  Provides the operations
    needed to access B2, and handles retrying when the returned
    status is 503 Service Unavailable, 429 Too Many Requests, etc.

    The operations supported are:

    - post_json_return_json
    - post_content_return_json
    - get_content

    The methods that return JSON either return a Python dict or
    raise a subclass of B2Error.  They can be used like this:

    .. code-block:: python

       try:
           response_dict = b2_http.post_json_return_json(url, headers, params)
           ...
       except B2Error as e:
           ...

    """

    # timeout for HTTP GET/POST requests
    TIMEOUT = 1200  # 20 minutes as server-side copy can take time

    def __init__(self, requests_module=None, install_clock_skew_hook=True, user_agent_append=None):
        """
        Initialize with a reference to the requests module, which makes
        it easy to mock for testing.

        :param requests_module: a reference to requests module
        :param bool install_clock_skew_hook: if True, install a clock skew hook
        :param str user_agent_append: if provided, the string will be appended to the User-Agent
        """
        super().__init__(
            v2.B2HttpApiConfig(
                http_session_factory=(requests_module or requests).Session,
                install_clock_skew_hook=install_clock_skew_hook,
                user_agent_append=user_agent_append,
            )
        )
