
    !)fJ%                       d dl mZ d dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ej0                  rddlmZmZ  ej8                  e      Ze	 G d d             Z G d de      Z y)    )annotationsN)contextmanager)	dataclass)HTTPException)BytesIOIOBase   )InvalidHeaderTimeoutError)BaseHTTPResponse)Retry   )EmscriptenRequest)BaseHTTPConnectionBaseHTTPSConnectionc                  6    e Zd ZU ded<   ded<   ded<   ded<   y	)
EmscriptenResponseintstatus_codezdict[str, str]headerszIOBase | bytesbodyr   requestN)__name__
__module____qualname____annotations__     `/var/www/html/flask-app/venv/lib/python3.12/site-packages/urllib3/contrib/emscripten/response.pyr   r      s    
r   r   c                  J    e Zd Z	 	 d	 	 	 	 	 d fdZedd       Zej                  dd       Zedd       Zedd       Zej                  dd       Z	 d	 	 	 	 	 ddZ	ddZ
	 	 	 d	 	 	 	 	 	 	 dd	Z	 	 d	 	 	 	 	 dd
ZddZddZedd       ZddZddZed d       Z xZS )!EmscriptenHttpResponseWrapperc                "   d | _         d | _        || _        || _        || _        d| _        t        |   |j                  |j                  |ddd       | j                  | j                  j                  j                        | _        d| _        y )NFr    T)r   statusrequest_urlversionreasondecode_content)_pool_body	_response_url_connection_closedsuper__init__r   r   _init_lengthr   methodlength_remaininglength_is_certain)selfinternal_responseurl
connection	__class__s       r   r0   z&EmscriptenHttpResponseWrapper.__init__   s     

*	%%--$00 	 	
 !% 1 1$..2H2H2O2O P!&r   c                    | j                   S Nr,   r5   s    r   r7   z!EmscriptenHttpResponseWrapper.url6   s    yyr   c                    || _         y r;   r<   )r5   r7   s     r   r7   z!EmscriptenHttpResponseWrapper.url:   s	    	r   c                    | j                   S r;   )r-   r=   s    r   r8   z(EmscriptenHttpResponseWrapper.connection>   s    r   c                    | j                   S r;   _retriesr=   s    r   retriesz%EmscriptenHttpResponseWrapper.retriesB   s    }}r   c                    || _         y r;   rA   )r5   rC   s     r   rC   z%EmscriptenHttpResponseWrapper.retriesF   s      r   c              #  D   K   	 | j                  ||      }|r| nyw)a_  
        A generator wrapper for the read() method. A call will block until
        ``amt`` bytes have been read from the connection or until the
        connection is closed.

        :param amt:
            How much of the content to read. The generator will return up to
            much data per iteration, but may return less. This is particularly
            likely when using compressed data. However, the empty string will
            never be returned.

        :param decode_content:
            If True, will attempt to decode the body based on the
            'content-encoding' header.
        )amtr(   Nread)r5   rF   r(   datas       r   streamz$EmscriptenHttpResponseWrapper.streamK   s-     $ 99^9DD
 s    c                   | j                   j                  d      }|\	 |j                  d      D ch c]  }t        |       }}t	        |      dkD  rt        d|z        |j                         }|dk  rd }nd }| j                  dv sd| j                  cxk  rdk  sn |d	k(  rd}|S c c}w # t        $ r d }Y @w xY w)
Nzcontent-length,r   z8Content-Length contained multiple unmatching values (%s)r   )   i0  d      HEAD)	r   getsplitr   lenr
   pop
ValueErrorr$   )r5   request_methodcontent_lengthvallengthslengths         r   r1   z*EmscriptenHttpResponseWrapper._init_lengthe   s    %)\\%5%56F%G%" 0>/C/CC/HI3s8IIw<!#'13AB  ! A:!F F KK:%dkk'C''F1 J  s"   B/ B*.B/ *B/ /B=<B=c                (   | j                   sP| j                  Dt        | j                  j                  t              r!| j                  j                  j
                  ry| j                         5  t        | j                  j                  t              sYt        | j                  j                        | _        d| _	        t        | j                  j                        | j                  _        |d}| j                  j                  j                  |      }| j                  't        | j                  t        |      z
  d      | _        | j                  r| j                  dk(  st        |      |k  r$| j                  j                  j                          t        j                  t         |      cd d d        S | j                  j                  j                         }|r|| _        | j                  't        | j                  t        |      z
  d      | _        t        |      dk(  s| j                  r3| j                  dk(  r$| j                  j                  j                          t        j                  t         |      cd d d        S # 1 sw Y   y xY w)Nr   TFr   )r.   r+   
isinstancer   r   closed_error_catcherrS   r3   r4   r   rH   maxclosetypingcastbytesr*   )r5   rF   r(   cache_contentrI   s        r   rH   z"EmscriptenHttpResponseWrapper.read   s    LL~~%4>>..7DNN<O<O<V<V  " 	0dnn116:(+DNN,?,?(@%)-&&-dnn.A.A&B# %~~**//4((4,/0E0ED	0QST,UD)**t/D/D/IcOO NN''--/{{5$/%	0 	0( ~~**//1 !%DJ((4,/0E0ED	0QST,UD)t9>**t/D/D/I NN''--/{{5$/=	0 	0 	0s   .E J8CJJc              #  @   K   	 | j                  ||      }|sy | wr;   rG   )r5   rF   r(   rc   s       r   read_chunkedz*EmscriptenHttpResponseWrapper.read_chunked   s+      IIc>2EK	 s   c                    | j                   r| j                  sy | j                   j                  | j                         d | _        y r;   )r)   r-   	_put_connr=   s    r   release_connz*EmscriptenHttpResponseWrapper.release_conn   s4    zz!1!1

T--.r   c                $    | j                          y r;   )r`   r=   s    r   
drain_connz(EmscriptenHttpResponseWrapper.drain_conn   s    

r   c                V    | j                   r| j                   S | j                  d      S )NT)rd   )r*   rH   r=   s    r   rI   z"EmscriptenHttpResponseWrapper.data   s$    ::::994900r   c                b    | j                   j                  d      }t        j                  |      S )a  
        Parses the body of the HTTP response as JSON.

        To use a custom JSON decoder pass the result of :attr:`HTTPResponse.data` to the decoder.

        This method can raise either `UnicodeDecodeError` or `json.JSONDecodeError`.

        Read more :ref:`here <json>`.
        zutf-8)rI   decode_jsonloads)r5   rI   s     r   jsonz"EmscriptenHttpResponseWrapper.json   s'     yy({{4  r   c                   | j                   s}t        | j                  j                  t              r$| j                  j                  j                          | j                  r!| j                  j                          d | _        d| _         y y )NT)r.   r\   r+   r   r   r`   r-   r=   s    r   r`   z#EmscriptenHttpResponseWrapper.close   sb    ||$..--v6##))+  &&(#' DL r   c              #    K   ddl m}m} d}	 d d}	 |syt        | j                  j                  t              rD| j                  j                  j                  s$| j                  j                  j                          | j                          yt        | j                  j                  t              r2| j                  j                  j                  r| j                          yyy# |$ r}t        t	        |            d}~w|$ r}t        t	        |            d}~ww xY w# |syt        | j                  j                  t              rD| j                  j                  j                  s$| j                  j                  j                          | j                          w t        | j                  j                  t              r2| j                  j                  j                  r| j                          w w w xY ww)z
        Catch Emscripten specific exceptions thrown by fetch.py,
        instead re-raising urllib3 variants, so that low-level exceptions
        are not leaked in the high-level api.

        On exit, release the connection back to the pool.
        r   )_RequestError_TimeoutErrorFNT)fetchrt   ru   r   strr   r\   r+   r   r   r]   r`   ri   )r5   rt   ru   
clean_exites        r   r^   z,EmscriptenHttpResponseWrapper._error_catcher   sv     	8
	( J  t~~22F; NN//66NN''--/!!#
 t~~22F;++22%%' 3 <+  	's1v&& 	(A''	(
  t~~22F; NN//66NN''--/!!#
 t~~22F;++22%%' 3 <sA   G:C' CG:'D!,D  D!DD!!D$ $CG77G:)NN)r6   r   r7   
str | Noner8   /BaseHTTPConnection | BaseHTTPSConnection | None)returnrz   )r7   rz   r|   None)r|   r{   )r|   Retry | None)rC   r~   r|   r}   )i   N)rF   
int | Noner(   bool | Noner|   z#typing.Generator[bytes, None, None])rV   rz   r|   r   )NNF)rF   r   r(   r   rd   boolr|   rc   )r|   r}   )r|   rc   )r|   z
typing.Any)r|   z"typing.Generator[None, None, None])r   r   r   r0   propertyr7   setterr8   rC   rJ   r1   rH   rf   ri   rk   rI   rq   r`   r   r^   __classcell__)r9   s   @r   r!   r!      s_    FJ	'-' ' D	'.   	ZZ        ^^   
 FJ7B	,4#N &*#	+0+0 $+0 	+0
 
+0^ &*

 $
 
-	
  1 1!  )( )(r   r!   )!
__future__r   rq   ro   loggingra   
contextlibr   dataclassesr   http.clientr   ior   r   
exceptionsr
   r   responser   
util.retryr   r   r   TYPE_CHECKING_base_connectionr   r   	getLoggerr   logr   r!   r   r   r   <module>r      so    "    % ! 6  5 (  &	Kg!   v($4 v(r   