U
    a]W                     @   sR  d dl 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	m
Z
mZm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 d d	lmZ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$m%Z% e& Z'e(dZ)G dd de*Z+G dd de,Z-G dd dZ.G dd deZ/G dd deZ0dd Z1dd Z2dd Z3dS )    N)BytesIO)chain)quote	urlencodeurljoinurlsplit)settings)signing)DisallowedHostImproperlyConfiguredRequestDataTooBig)uploadhandler)MultiPartParserMultiPartParserError)CaseInsensitiveMappingImmutableListMultiValueDict)escape_uri_path
iri_to_uri)cached_property)is_same_domainlimited_parse_qslz1^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9\.:]+\])(:\d+)?$c                   @   s   e Zd ZdS )UnreadablePostErrorN)__name__
__module____qualname__ r   r   /home/adriano.carvalho/ftp/files/BrinquedotecaVirtual/brinquedotecavirtual/venv/lib/python3.8/site-packages/django/http/request.pyr      s   r   c                   @   s   e Zd ZdZdS )RawPostDataExceptionz
    You cannot access raw_post_data from a request that has
    multipart/* POST data if it has been accessed via POST,
    FILES, etc..
    N)r   r   r   __doc__r   r   r   r   r      s   r   c                   @   sJ  e Zd ZdZdZg Zdd Zdd Zedd Z	d	d
 Z
dd Zdd Zdd ZdCddZdDddZdd ZeddfddZdd ZdEddZedd  Zd!d" Zed#d$ Zd%d& Zd'd( Zed)d* Zejd+d* Zd,d- Zed.d/ Zejd0d/ Zd1d2 Zed3d4 Z d5d6 Z!d7d8 Z"d9d: Z#d;d< Z$d=d> Z%d?d@ Z&dAdB Z'dS )FHttpRequestzA basic HTTP request.Nc                 C   sT   t dd| _t dd| _i | _i | _t | _d| _d| _d | _	d | _
d | _d | _d S )NT)mutable )	QueryDictGETPOSTCOOKIESMETAr   ZFILESpath	path_infomethodZresolver_matchcontent_typecontent_paramsselfr   r   r   __init__/   s    zHttpRequest.__init__c                 C   s6   | j d ks|  sd| jj S d| jj| j |  f S )Nz<%s>z<%s: %s %r>)r*   get_full_path	__class__r   r-   r   r   r   __repr__A   s    zHttpRequest.__repr__c                 C   s
   t | jS N)HttpHeadersr'   r-   r   r   r   headersF   s    zHttpRequest.headersc                 C   s^   t |dd\| _| _d| jkrZzt| jd  W n tk
rL   Y nX | jd | _dS )z/Set content_type, content_params, and encoding.CONTENT_TYPEr"   charsetN)	cgiparse_headergetr+   r,   codecslookupLookupErrorencoding)r.   metar   r   r   _set_content_type_paramsJ   s    
z$HttpRequest._set_content_type_paramsc                 C   sh   t jrd| jkr| jd }nHd| jkr2| jd }n2| jd }|  }||  rRdndkrdd||f }|S )z
        Return the HTTP host using the environment or request headers. Skip
        allowed hosts protection, so may return an insecure host.
        ZHTTP_X_FORWARDED_HOSTZ	HTTP_HOSTZSERVER_NAME44380z%s:%s)r   ZUSE_X_FORWARDED_HOSTr'   get_port	is_secure)r.   hostZserver_portr   r   r   _get_raw_hostU   s    

zHttpRequest._get_raw_hostc                 C   sn   |   }tj}tjr"|s"dddg}t|\}}|r@t||r@|S d| }|rZ|d| 7 }n|d7 }t|dS )z>Return the HTTP host using the environment or request headers.	localhostz	127.0.0.1z[::1]zInvalid HTTP_HOST header: %r.z) You may need to add %r to ALLOWED_HOSTS.zB The domain name provided is not valid according to RFC 1034/1035.N)rF   r   ZALLOWED_HOSTSDEBUGsplit_domain_portvalidate_hostr
   )r.   rE   allowed_hostsdomainportmsgr   r   r   get_hosth   s    

zHttpRequest.get_hostc                 C   s.   t jrd| jkr| jd }n
| jd }t|S )z3Return the port number for the request as a string.ZHTTP_X_FORWARDED_PORTZSERVER_PORT)r   ZUSE_X_FORWARDED_PORTr'   str)r.   rM   r   r   r   rC   |   s    
zHttpRequest.get_portFc                 C   s   |  | j|S r3   )_get_full_pathr(   r.   force_append_slashr   r   r   r0      s    zHttpRequest.get_full_pathc                 C   s   |  | j|S r3   )rQ   r)   rR   r   r   r   get_full_path_info   s    zHttpRequest.get_full_path_infoc              	   C   sH   dt ||r|dsdnd| jddr@dt| jdd ndf S )Nz%s%s%s/r"   QUERY_STRING?)r   endswithr'   r:   r   )r.   r(   rS   r   r   r   rQ      s
    &zHttpRequest._get_full_pathr"   c                 C   s   z| j | }W n& tk
r4   |tk	r.| Y S  Y nX ztj|| dj||d}W n( tjk
r|   |tk	rv| Y S  Y nX |S )z
        Attempt to return a signed cookie. If the signature fails or the
        cookie has expired, raise an exception, unless the `default` argument
        is provided,  in which case return that value.
        )salt)max_age)r&   KeyErrorRAISE_ERRORr	   Zget_cookie_signerZunsignZBadSignature)r.   keydefaultrY   rZ   Zcookie_valuevaluer   r   r   get_signed_cookie   s      
zHttpRequest.get_signed_cookiec                 C   s   dj | j|  |  dS )z
        Return an absolute URI from variables available in this request. Skip
        allowed hosts protection, so may return insecure URI.
        z{scheme}://{host}{path})schemerE   r(   )formatra   rF   r0   r-   r   r   r   get_raw_uri   s
    zHttpRequest.get_raw_uric                 C   s   |dkrd|    }t|}|jr(|js|jdrv|jsv|jsvd|jkrvd|jkrv|drj|dd }| j| }nt| j| j |}t|S )a  
        Build an absolute URI from the location and the variables available in
        this request. If no ``location`` is specified, build the absolute URI
        using request.get_full_path(). If the location is absolute, convert it
        to an RFC 3987 compliant URI and return it. If location is relative or
        is scheme-relative (i.e., ``//example.com/``), urljoin() it to a base
        URL constructed from the request variables.
        Nz//%srU   z/./z/../z//   )	r0   r   ra   netlocr(   
startswith_current_scheme_hostr   r   )r.   locationbitsr   r   r   build_absolute_uri   s    	
zHttpRequest.build_absolute_uric                 C   s   d | j|  S )Nz{}://{})rb   ra   rO   r-   r   r   r   rg      s    z HttpRequest._current_scheme_hostc                 C   s   dS )zf
        Hook for subclasses like WSGIRequest to implement. Return 'http' by
        default.
        httpr   r-   r   r   r   _get_scheme   s    zHttpRequest._get_schemec                 C   s^   t jrVzt j\}}W n tk
r0   tdY nX | j|}|d k	rV||krRdS dS |  S )NzJThe SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.httpsrk   )r   ZSECURE_PROXY_SSL_HEADER
ValueErrorr   r'   r:   rl   )r.   headerZsecure_valueheader_valuer   r   r   ra      s    
zHttpRequest.schemec                 C   s
   | j dkS )Nrm   )ra   r-   r   r   r   rD      s    zHttpRequest.is_securec                 C   s   | j ddkS )NZHTTP_X_REQUESTED_WITHZXMLHttpRequest)r'   r:   r-   r   r   r   is_ajax   s    zHttpRequest.is_ajaxc                 C   s   | j S r3   	_encodingr-   r   r   r   r>      s    zHttpRequest.encodingc                 C   s&   || _ t| dr| `t| dr"| `dS )z
        Set the encoding used for GET/POST accesses. If the GET or POST
        dictionary has already been created, remove and recreate it on the
        next access (so that it is decoded correctly).
        r$   _postN)rs   hasattrr$   rt   )r.   valr   r   r   r>      s
    

c                    s    fddt jD  _d S )Nc                    s   g | ]}t | qS r   )r   Zload_handler).0handlerr-   r   r   
<listcomp>  s   z4HttpRequest._initialize_handlers.<locals>.<listcomp>)r   ZFILE_UPLOAD_HANDLERS_upload_handlersr-   r   r-   r   _initialize_handlers  s    
z HttpRequest._initialize_handlersc                 C   s   | j s|   | j S r3   )rz   r{   r-   r   r   r   upload_handlers
  s    zHttpRequest.upload_handlersc                 C   s   t | drtd|| _d S )N_fileszGYou cannot set the upload handlers after the upload has been processed.)ru   AttributeErrorrz   )r.   r|   r   r   r   r|     s    
c                 C   s*   t | jdd| _t||| j| j}| S )z9Return a tuple of (POST QueryDict, FILES MultiValueDict).zEYou cannot alter upload handlers after the upload has been processed.)warning)r   r|   r   r>   parse)r.   r'   Z	post_dataparserr   r   r   parse_file_upload  s    zHttpRequest.parse_file_uploadc              
   C   s   t | ds| jrtdtjd k	rDt| jdp2dtjkrDtdz| 	 | _
W n. tk
r } zt|j |W 5 d }~X Y nX t| j
| _| j
S )N_bodyz?You cannot access body after reading from request's data streamCONTENT_LENGTHr   z;Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.)ru   _read_startedr   r   ZDATA_UPLOAD_MAX_MEMORY_SIZEintr'   r:   r   readr   OSErrorr   argsr   _stream)r.   er   r   r   body   s    

zHttpRequest.bodyc                 C   s   t  | _t | _d S r3   )r#   rt   r   r}   r-   r   r   r   _mark_post_parse_error2  s    z"HttpRequest._mark_post_parse_errorc                 C   s   | j dkr&t| jdt  | _| _dS | jrBt| dsB|   dS | j	dkrt| drbt
| j}n| }z| | j|\| _| _W q tk
r   |    Y qX n@| j	dkrt| j| jdt  | _| _nt| jdt  | _| _dS )zFPopulate self._post and self._files if the content-type is a form typer%   )r>   Nr   zmultipart/form-dataz!application/x-www-form-urlencoded)r*   r#   rs   r   rt   r}   r   ru   r   r+   r   r   r   r'   r   r   )r.   datar   r   r   _load_post_and_files6  s$    




z HttpRequest._load_post_and_filesc                 C   s6   t | dr2tdd | j D D ]}|  q$d S )Nr}   c                 s   s   | ]}|d  V  qdS )   Nr   )rw   lr   r   r   	<genexpr>U  s     z$HttpRequest.close.<locals>.<genexpr>)ru   r   from_iterabler}   listsclose)r.   fr   r   r   r   S  s    
zHttpRequest.closec              
   O   sJ   d| _ z| jj||W S  tk
rD } zt|j |W 5 d }~X Y nX d S NT)r   r   r   r   r   r   r.   r   kwargsr   r   r   r   r   `  s
    zHttpRequest.readc              
   O   sJ   d| _ z| jj||W S  tk
rD } zt|j |W 5 d }~X Y nX d S r   )r   r   readliner   r   r   r   r   r   r   r   g  s
    zHttpRequest.readlinec                 C   s   t | jdS )N    )iterr   r-   r   r   r   __iter__n  s    zHttpRequest.__iter__c                 C   s   t | S r3   )listr-   r   r   r   	readlinesq  s    zHttpRequest.readlines)F)F)N)(r   r   r   r   rs   rz   r/   r2   r   r5   r@   rF   rO   rC   r0   rT   rQ   r\   r`   rc   rj   rg   rl   propertyra   rD   rq   r>   setterr{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r    (   sV   


	
!





	
r    c                       s@   e Zd ZdZddhZ fddZ fddZedd	 Z  Z	S )
r4   ZHTTP_r6   r   c                    s<   i }|  D ]\}}| |}|r|||< qt | d S r3   )itemsparse_header_namesuperr/   )r.   environr5   ro   r_   namer1   r   r   r/   z  s    

zHttpHeaders.__init__c                    s   t  |ddS )z:Allow header lookup using underscores in place of hyphens._-)r   __getitem__replacer.   r]   r   r   r   r     s    zHttpHeaders.__getitem__c                 C   s>   | | jr |t| jd  }n|| jkr.d S |dd S )Nr   r   )rf   HTTP_PREFIXlenUNPREFIXED_HEADERSr   title)clsro   r   r   r   r     s
    
zHttpHeaders.parse_header_name)
r   r   r   r   r   r/   r   classmethodr   __classcell__r   r   r   r   r4   u  s   r4   c                       s   e Zd ZdZdZdZd) fdd	Zed*dd	Ze	d
d Z
e
jdd Z
dd Z fddZ fddZdd Zdd Z fddZd+ fdd	Z fddZ fddZ fdd Z fd!d"Zd, fd#d$	Zd%d& Zd-d'd(Z  ZS ).r#   a  
    A specialized MultiValueDict which represents a query string.

    A QueryDict can be used to represent GET or POST data. It subclasses
    MultiValueDict since keys in such data can be repeated, for instance
    in the data from a form with a <select multiple> field.

    By default QueryDicts are immutable, though the copy() method
    will always return a mutable copy.

    Both keys and values set on this class are converted from the given encoding
    (DEFAULT_CHARSET by default) to str.
    TNFc                    s   t    |ptj| _|pd}dtj| jd}t|trhz|| j}W n t	k
rf   |d}Y nX t
|f|D ]\}}| || qt|| _d S )Nr"   T)keep_blank_valuesZfields_limitr>   z
iso-8859-1)r   r/   r   DEFAULT_CHARSETr>   ZDATA_UPLOAD_MAX_NUMBER_FIELDS
isinstancebytesdecodeUnicodeDecodeErrorr   
appendlist_mutable)r.   Zquery_stringr!   r>   Zparse_qsl_kwargsr]   r_   r   r   r   r/     s    

zQueryDict.__init__r"   c                 C   s2   | dd|d}|D ]}| || q|s.d|_|S )zt
        Return a new QueryDict with keys (may be repeated) from an iterable and
        values from value.
        r"   Tr!   r>   F)r   r   )r   iterabler_   r!   r>   qr]   r   r   r   fromkeys  s    zQueryDict.fromkeysc                 C   s   | j d krtj| _ | j S r3   )rs   r   r   r-   r   r   r   r>     s    
zQueryDict.encodingc                 C   s
   || _ d S r3   rr   )r.   r_   r   r   r   r>     s    c                 C   s   | j stdd S )Nz$This QueryDict instance is immutable)r   r~   r-   r   r   r   _assert_mutable  s    zQueryDict._assert_mutablec                    s2   |    t|| j}t|| j}t || d S r3   )r   bytes_to_textr>   r   __setitem__r.   r]   r_   r   r   r   r     s    zQueryDict.__setitem__c                    s   |    t | d S r3   )r   r   __delitem__r   r   r   r   r     s    zQueryDict.__delitem__c                 C   s4   | j dd| jd}|  D ]\}}||| q|S Nr"   Tr   )r1   r>   r   setlist)r.   resultr]   r_   r   r   r   __copy__  s    zQueryDict.__copy__c                 C   sP   | j dd| jd}||t| < |  D ]$\}}|t||t|| q&|S r   )r1   r>   idr   r   copydeepcopy)r.   memor   r]   r_   r   r   r   __deepcopy__  s
    zQueryDict.__deepcopy__c                    s8       t| j} fdd|D }t || d S )Nc                    s   g | ]}t | jqS r   )r   r>   )rw   eltr-   r   r   ry     s     z%QueryDict.setlist.<locals>.<listcomp>)r   r   r>   r   r   )r.   r]   list_r   r-   r   r     s    zQueryDict.setlistc                    s   |    t ||S r3   )r   r   setlistdefault)r.   r]   Zdefault_listr   r   r   r     s    zQueryDict.setlistdefaultc                    s2   |    t|| j}t|| j}t || d S r3   )r   r   r>   r   r   r   r   r   r   r     s    zQueryDict.appendlistc                    s   |    t j|f| S r3   )r   r   pop)r.   r]   r   r   r   r   r     s    zQueryDict.popc                    s   |    t  S r3   )r   r   popitemr-   r   r   r   r     s    zQueryDict.popitemc                    s   |    t   d S r3   )r   r   clearr-   r   r   r   r     s    zQueryDict.clearc                    s.   |    t|| j}t|| j}t ||S r3   )r   r   r>   r   
setdefault)r.   r]   r^   r   r   r   r     s    zQueryDict.setdefaultc                 C   s
   |  i S )z%Return a mutable copy of this object.)r   r-   r   r   r   r     s    zQueryDict.copyc                    sb   g }r" jfdd ndd   D ]$\}| fdd|D  q2d|S )ah  
        Return an encoded string of all query string arguments.

        `safe` specifies characters which don't require quoting, for example::

            >>> q = QueryDict(mutable=True)
            >>> q['next'] = '/a&b/'
            >>> q.urlencode()
            'next=%2Fa%26b%2F'
            >>> q.urlencode(safe='/')
            'next=/a%26b/'
        c                    s   dt |  t | f S )Nz%s=%s)r   kv)safer   r   encode   s    z#QueryDict.urlencode.<locals>.encodec                 S   s   t | |iS r3   )r   r   r   r   r   r   #  s    c                 3   s,   | ]$}  jt| jV  qd S r3   )r   r>   rP   )rw   r   )r   r   r.   r   r   r   &  s   z&QueryDict.urlencode.<locals>.<genexpr>&)r   r>   r   extendjoin)r.   r   outputr   r   )r   r   r   r.   r   r     s    
zQueryDict.urlencode)NFN)r"   FN)N)N)N)r   r   r   r   r   rs   r/   r   r   r   r>   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#     s0   

r#   c                 C   s   t | trt| |dS | S dS )u   
    Convert bytes objects to strings, using the given encoding. Illegally
    encoded input characters are replaced with Unicode "unknown" codepoint
    (�).

    Return any non-bytes objects without change.
    r   N)r   r   rP   )sr>   r   r   r   r   0  s    
r   c                 C   sx   |   } t| sdS | d dkr*| dfS | dd}t|dkrF|n
|d df\}}|d	rl|d
d n|}||fS )z
    Return a (domain, port) tuple from a given host.

    Returned domain is lowercased. If the host is invalid, the domain will be
    empty.
    )r"   r"   ]r"   :r   rd   r   .N)lowerhost_validation_rematchrsplitr   rX   )rE   ri   rL   rM   r   r   r   rI   >  s    
 rI   c                    s   t  fdd|D S )a4  
    Validate the given host for this site.

    Check that the host looks valid and matches a host or host pattern in the
    given list of ``allowed_hosts``. Any pattern beginning with a period
    matches a domain and all its subdomains (e.g. ``.example.com`` matches
    ``example.com`` and any subdomain), ``*`` matches anything, and anything
    else must match exactly.

    Note: This function assumes that the given host is lowercased and has
    already had the port, if any, stripped off.

    Return ``True`` for a valid host, ``False`` otherwise.
    c                 3   s    | ]}|d kpt  |V  qdS )*N)r   )rw   patternrE   r   r   r   c  s     z validate_host.<locals>.<genexpr>)any)rE   rK   r   r   r   rJ   T  s    rJ   )4r8   r;   r   reior   	itertoolsr   urllib.parser   r   r   r   Zdjango.confr   Zdjango.corer	   Zdjango.core.exceptionsr
   r   r   Zdjango.core.filesr   Zdjango.http.multipartparserr   r   Zdjango.utils.datastructuresr   r   r   Zdjango.utils.encodingr   r   Zdjango.utils.functionalr   Zdjango.utils.httpr   r   objectr\   compiler   r   r   	Exceptionr   r    r4   r#   r   rI   rJ   r   r   r   r   <module>   s8   
	  O "