o
    Zzjí3  ã                   @   s–   d Z ddlmZ ddlmZ ddlZddlmZ ddlm	Z	 ddl
mZmZmZ ddlmZmZ dd	lmZ dd
lmZ e	edƒZG dd„ deƒZdS )zSThis module contains methods to make POST and GET requests using the httpx library.é    )Ú
Collection)ÚAnyN)ÚDefaultValue)Ú
get_logger)ÚHTTPVersionÚODVInputÚ	SocketOpt)ÚNetworkErrorÚTimedOut)ÚBaseRequest)ÚRequestDataÚHTTPXRequestc                   @   s:  e Zd ZdZdZ										d%d	ed
edB dedB dedB dedB dedee	 dB de
ejB ejB dB dedB dee
ef dB fdd„Zede
fdd„ƒZededB fdd„ƒZdejfdd„Zd&dd„Zd&dd„Zdejejejejfd e
d!e
d"edB d
ee dee dee dee deeef fd#d$„ZdS )'r   a¶  Implementation of :class:`~telegram.request.BaseRequest` using the library
    `httpx <https://www.python-httpx.org>`_.

    .. versionadded:: 20.0

    .. versionchanged:: 22.0
        Removed the deprecated parameter ``proxy_url``. Use :paramref:`proxy` instead.

    Args:
        connection_pool_size (:obj:`int`, optional): Number of connections to keep in the
            connection pool. Defaults to ``256``.

            .. versionchanged:: 22.4
                Set the default to ``256``.
                Stopped applying to ``httpx.Limits.max_keepalive_connections``. Now only applies to
                ``httpx.Limits.max_connections``. See `Resource Limits
                <https://www.python-httpx.org/advanced/resource-limits/>`_
        read_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum
            amount of time (in seconds) to wait for a response from Telegram's server.
            This value is used unless a different value is passed to :meth:`do_request`.
            Defaults to ``5``.
        write_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum
            amount of time (in seconds) to wait for a write operation to complete (in terms of
            a network socket; i.e. POSTing a request or uploading a file).
            This value is used unless a different value is passed to :meth:`do_request`.
            Defaults to ``5``.

            Hint:
                This timeout is used for all requests except for those that upload media/files.
                For the latter, :paramref:`media_write_timeout` is used.
        connect_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the
            maximum amount of time (in seconds) to wait for a connection attempt to a server
            to succeed. This value is used unless a different value is passed to
            :meth:`do_request`. Defaults to ``5``.
        pool_timeout (:obj:`float` | :obj:`None`, optional): If passed, specifies the maximum
            amount of time (in seconds) to wait for a connection to become available.
            This value is used unless a different value is passed to :meth:`do_request`.
            Defaults to ``1``.

            Warning:
                With a finite pool timeout, you must expect :exc:`telegram.error.TimedOut`
                exceptions to be thrown when more requests are made simultaneously than there are
                connections in the connection pool!
        http_version (:obj:`str`, optional): If ``"2"`` or ``"2.0"``, HTTP/2 will be used instead
            of HTTP/1.1. Defaults to ``"1.1"``.

            .. versionadded:: 20.1
            .. versionchanged:: 20.2
                Reset the default version to 1.1.

            .. versionchanged:: 20.5
                Accept ``"2"`` as a valid value.
        socket_options (Collection[:obj:`tuple`], optional): Socket options to be passed to the
            underlying `library             <https://www.encode.io/httpcore/async/#httpcore.AsyncConnectionPool.__init__>`_.

            Note:
                The values accepted by this parameter depend on the operating system.
                This is a low-level parameter and should only be used if you are familiar with
                these concepts.

            .. versionadded:: 20.7
        proxy (:obj:`str` | ``httpx.Proxy`` | ``httpx.URL``, optional): The URL to a proxy server,
            a ``httpx.Proxy`` object or a ``httpx.URL`` object. For example
            ``'http://127.0.0.1:3128'`` or ``'socks5://127.0.0.1:3128'``. Defaults to :obj:`None`.

            Note:
                * The proxy URL can also be set via the environment variables ``HTTPS_PROXY`` or
                  ``ALL_PROXY``. See `the docs of httpx`_ for more info.
                * HTTPS proxies can be configured by passing a ``httpx.Proxy`` object with
                  a corresponding ``ssl_context``.
                * For Socks5 support, additional dependencies are required. Make sure to install
                  PTB via :command:`pip install "python-telegram-bot[socks]"` in this case.
                * Socks5 proxies can not be set via environment variables.

            .. _the docs of httpx: https://www.python-httpx.org/environment_variables/#proxies

            .. versionadded:: 20.7
        media_write_timeout (:obj:`float` | :obj:`None`, optional): Like :paramref:`write_timeout`,
            but used only for requests that upload media/files. This value is used unless a
            different value is passed to :paramref:`do_request.write_timeout` of
            :meth:`do_request`. Defaults to ``20`` seconds.

            .. versionadded:: 21.0
        httpx_kwargs (dict[:obj:`str`, Any], optional): Additional keyword arguments to be passed
            to the `httpx.AsyncClient <https://www.python-httpx.org/api/#asyncclient>`_
            constructor.

            Warning:
                This parameter is intended for advanced users that want to fine-tune the behavior
                of the underlying ``httpx`` client. The values passed here will override all the
                defaults set by ``python-telegram-bot`` and all other parameters passed to
                :class:`HTTPXRequest`. The only exception is the :paramref:`media_write_timeout`
                parameter, which is not passed to the client constructor.
                No runtime warnings will be issued about parameters that are overridden in this
                way.

            .. versionadded:: 21.6

    )Ú_clientÚ_client_kwargsÚ_http_versionÚ_media_write_timeouté   ç      @ç      ð?ú1.1Nç      4@Úconnection_pool_sizeÚread_timeoutÚwrite_timeoutÚconnect_timeoutÚpool_timeoutÚhttp_versionÚsocket_optionsÚproxyÚmedia_write_timeoutÚhttpx_kwargsc              
   C   sâ   || _ |	| _tj||||d�}tj|d�}|dvrtdƒ‚|dk}|| dœ}|r/tj|d�nd }||||dœ|¥|
p<i ¥| _z|  ¡ | _	W d S  t
yp } zd	t|ƒvr\d
t|ƒvr\‚ d
t|ƒv rgtdƒ|‚tdƒ|‚d }~ww )N©ÚconnectÚreadÚwriteÚpool)Úmax_connections)r   Ú2z2.0z2`http_version` must be either '1.1', '2.0' or '2'.r   )Úhttp1Úhttp2)r   )Útimeoutr   ÚlimitsÚ	transportzhttpx[http2]zhttpx[socks]z\To use Socks5 proxies, PTB must be installed via `pip install "python-telegram-bot[socks]"`.zTTo use HTTP/2, PTB must be installed via `pip install "python-telegram-bot[http2]"`.)r   r   ÚhttpxÚTimeoutÚLimitsÚ
ValueErrorÚAsyncHTTPTransportr   Ú_build_clientr   ÚImportErrorÚstrÚRuntimeError)Úselfr   r   r   r   r   r   r   r   r   r    r*   r+   r(   Úhttp_kwargsr,   Úexc© r9   úY/var/www/kodo/tsheker/venv/lib/python3.10/site-packages/telegram/request/_httpxrequest.pyÚ__init__‘   s`   üÿýÿûüûú	ÿýÿý€÷zHTTPXRequest.__init__Úreturnc                 C   s   | j S )zn
        :obj:`str`: Used HTTP version, see :paramref:`http_version`.

        .. versionadded:: 20.2
        )r   ©r6   r9   r9   r:   r   Ï   s   zHTTPXRequest.http_versionc                 C   s
   | j jjS )zÐSee :attr:`BaseRequest.read_timeout`.

        Returns:
            :obj:`float` | :obj:`None`: The default read timeout in seconds as passed to
                :paramref:`HTTPXRequest.read_timeout`.
        )r   r*   r#   r=   r9   r9   r:   r   Ø   s   
zHTTPXRequest.read_timeoutc                 C   s   t jdi | j¤ŽS )Nr9   )r-   ÚAsyncClientr   r=   r9   r9   r:   r2   â   s   zHTTPXRequest._build_clientc                 Ã   s   �| j jr|  ¡ | _ dS dS )z#See :meth:`BaseRequest.initialize`.N)r   Ú	is_closedr2   r=   r9   r9   r:   Ú
initializeå   s   €ÿzHTTPXRequest.initializec                 Ã   s,   �| j jrt d¡ dS | j  ¡ I dH  dS )z!See :meth:`BaseRequest.shutdown`.z2This HTTPXRequest is already shut down. Returning.N)r   r?   Ú_LOGGERÚdebugÚacloser=   r9   r9   r:   Úshutdownê   s
   €
zHTTPXRequest.shutdownÚurlÚmethodÚrequest_datac              
   Ã   s:  �| j jr	tdƒ‚|r|jnd}|r|jnd}	t|tƒr!| j jj}t|tƒr+| j jj	}t|tƒr5| j jj
}t|tƒrD|sA| j jjn| j}tj||||d�}
z| j j||d| ji|
||	d�I dH }W n5 tjy} } zt|tjƒrvtdd�|‚t|‚d}~w tjy– } ztd|jj› d	|› �ƒ|‚d}~ww |j|jfS )
z#See :meth:`BaseRequest.do_request`.z%This HTTPXRequest is not initialized!Nr!   z
User-Agent)rF   rE   Úheadersr*   ÚfilesÚdataz§Pool timeout: All connections in the connection pool are occupied. Request was *not* sent to Telegram. Consider adjusting the connection pool size or the pool timeout.)Úmessagezhttpx.z: )r   r?   r5   Úmultipart_dataÚjson_parametersÚ
isinstancer   r*   r#   r"   r%   r$   r   r-   r.   ÚrequestÚ
USER_AGENTÚTimeoutExceptionÚPoolTimeoutr
   Ú	HTTPErrorr	   Ú	__class__Ú__name__Ústatus_codeÚcontent)r6   rE   rF   rG   r   r   r   r   rI   rJ   r*   ÚresÚerrr9   r9   r:   Ú
do_requestò   sT   €






üúþú€€úzHTTPXRequest.do_request)
r   r   r   r   r   r   NNr   N)r<   N)rU   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__ÚintÚfloatr   r   r   r4   r-   ÚProxyÚURLÚdictr   r;   Úpropertyr   r   r>   r2   r@   rD   r   ÚDEFAULT_NONEr   r   ÚtupleÚbytesrZ   r9   r9   r9   r:   r   )   s~    eõþýüûúù
ø	÷
ö
õ>	

øþýüûúùø
	÷)r]   Úcollections.abcr   Útypingr   r-   Útelegram._utils.defaultvaluer   Útelegram._utils.loggingr   Útelegram._utils.typesr   r   r   Útelegram.errorr	   r
   Útelegram.request._baserequestr   Útelegram.request._requestdatar   rU   rA   r   r9   r9   r9   r:   Ú<module>   s   
