o
    hHc                     @   s  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m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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& d dl'm(Z( d dl)m*Z* d dl+m,Z, ddl-m.Z. e*e	dre*e	dsd dl'm	Z	 e/ Z0e,dZ1G dd de2Z3G dd de4Z5G dd dZ6G dd deZ7G dd  d eZ8G d!d" d"Z9d#d$ Z:d%d& Z;d'd( Z<d)d* Z=dS )+    N)BytesIO)chain)	parse_qslquote	urlencodeurljoinurlsplit)settings)signing)DisallowedHostImproperlyConfiguredRequestDataTooBigTooManyFieldsSent)uploadhandler)MultiPartParserMultiPartParserError)CaseInsensitiveMappingImmutableListMultiValueDict)RemovedInDjango40Warning)escape_uri_path
iri_to_uri)cached_propertyis_same_domain)func_supports_parameter)_lazy_re_compile   )parse_headermax_num_fields	separator)r   z1^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9\.:]+\])(:\d+)?$c                   @   s   e Zd ZdS )UnreadablePostErrorN)__name__
__module____qualname__ r%   r%   [/var/www/html/magazine_api/magazine_env/lib/python3.10/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                   @   s^  e Zd ZdZdZg Zdd Zdd Zedd Z	ed	d
 Z
dd Zdd Zdd Zdd Zdd ZdGddZdGddZdd ZeddfddZdd  ZdHd!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d0d1 Zed2d3 Z e jd4d3 Z d5d6 Z!ed7d8 Z"d9d: Z#d;d< Z$d=d> Z%d?d@ Z&dAdB Z'dCdD Z(dEdF Z)dS )I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 u s	|  sd| jj S d| jj| j |  f S )Nz<%s>z<%s: %s %r>)r3   get_full_path	__class__r"   r6   r%   r%   r&   __repr__Q   s   zHttpRequest.__repr__c                 C   s
   t | jS N)HttpHeadersr0   r6   r%   r%   r&   headersV      
zHttpRequest.headersc                 C   s   t | jddS )z%Return a list of MediaType instances.Acceptz*/*)parse_accept_headerr>   getr6   r%   r%   r&   accepted_typesZ   s   zHttpRequest.accepted_typesc                    s   t  fdd| jD S )Nc                 3   s    | ]}|  V  qd S r<   )match).0Zaccepted_type
media_typer%   r&   	<genexpr>`   s
    
z&HttpRequest.accepts.<locals>.<genexpr>)anyrC   )r7   rG   r%   rF   r&   accepts_   s   zHttpRequest.acceptsc                 C   sb   t |dd\| _| _d| jv r/z
t| jd  W n
 ty&   Y dS w | jd | _dS dS )z/Set content_type, content_params, and encoding.CONTENT_TYPEr+   charsetN)	cgir   rB   r4   r5   codecslookupLookupErrorencoding)r7   metar%   r%   r&   _set_content_type_paramse   s   
z$HttpRequest._set_content_type_paramsc                 C   sl   t jrd| jv r| jd }|S d| jv r| jd }|S | jd }|  }||  r+dndkr4d||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_HOSTr0   get_port	is_secure)r7   hostZserver_portr%   r%   r&   _get_raw_hostp   s   

	


zHttpRequest._get_raw_hostc                 C   sn   |   }tj}tjr|sg d}t|\}}|rt||r|S d| }|r/|d| 7 }t||d7 }t|)z>Return the HTTP host using the environment or request headers.)z
.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.)rY   r	   ZALLOWED_HOSTSDEBUGsplit_domain_portvalidate_hostr   )r7   rX   allowed_hostsdomainportmsgr%   r%   r&   get_host   s   
zHttpRequest.get_hostc                 C   s4   t jrd| jv r| jd }t|S | 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_PORTr0   str)r7   r_   r%   r%   r&   rV      s
   

zHttpRequest.get_portFc                 C      |  | j|S r<   )_get_full_pathr1   r7   force_append_slashr%   r%   r&   r9         zHttpRequest.get_full_pathc                 C   rc   r<   )rd   r2   re   r%   r%   r&   get_full_path_info   rg   zHttpRequest.get_full_path_infoc              	   C   sL   dt ||r|dsdnd| jddr"dt| jdd f S df S )N%s%s%s/r+   ZQUERY_STRING?)r   endswithr0   rB   r   )r7   r1   rf   r%   r%   r&   rd      s   "zHttpRequest._get_full_pathr+   c                 C   st   z| j | }W n ty   |tur| Y S  w ztj|| dj||d}W |S  tjy9   |tur8| Y S  w )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)r7   keydefaultrm   rn   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})schemerX   r1   )formatru   rY   r9   r6   r%   r%   r&   get_raw_uri   s
   zHttpRequest.get_raw_uric                 C   s   |du rd|    }nt|}t|}|jr|jsL|jdrC|jsC|jsCd|jvrCd|jvrC|dr:|dd }| j| }t	|S 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//%srj   z/./z/../z//   )
r9   rb   r   ru   netlocr1   
startswith_current_scheme_hostr   r   )r7   locationbitsr%   r%   r&   build_absolute_uri   s   	

zHttpRequest.build_absolute_uric                 C   s   d | j|  S )Nz{}://{})rv   ru   ra   r6   r%   r%   r&   r{      s   z HttpRequest._current_scheme_hostc                 C   s   dS )zf
        Hook for subclasses like WSGIRequest to implement. Return 'http' by
        default.
        httpr%   r6   r%   r%   r&   _get_scheme   s   zHttpRequest._get_schemec                 C   sX   t jr(zt j\}}W n ty   tdw | j|}|d ur(||kr&dS dS |  S )NzJThe SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.httpsr   )r	   ZSECURE_PROXY_SSL_HEADER
ValueErrorr   r0   rB   r   )r7   headerZsecure_valueheader_valuer%   r%   r&   ru      s   zHttpRequest.schemec                 C   s
   | j dkS )Nr   )ru   r6   r%   r%   r&   rW     s   
zHttpRequest.is_securec                 C   s    t jdtdd | jddkS )Nzfrequest.is_ajax() is deprecated. See Django 3.1 release notes for more details about this deprecation.rx   )
stacklevelZHTTP_X_REQUESTED_WITHZXMLHttpRequest)warningswarnr   r0   rB   r6   r%   r%   r&   is_ajax  s   zHttpRequest.is_ajaxc                 C   s   | j S r<   	_encodingr6   r%   r%   r&   rQ     s   zHttpRequest.encodingc                 C   s*   || _ t| dr
| `t| dr| `dS 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)r   hasattrr-   r   )r7   valr%   r%   r&   rQ     s   

c                    s    fddt jD  _d S )Nc                    s   g | ]}t | qS r%   )r   Zload_handler)rE   handlerr6   r%   r&   
<listcomp>+  s    z4HttpRequest._initialize_handlers.<locals>.<listcomp>)r	   ZFILE_UPLOAD_HANDLERS_upload_handlersr6   r%   r6   r&   _initialize_handlers*  s   
z HttpRequest._initialize_handlersc                 C   s   | j s|   | j S r<   )r   r   r6   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.)r   AttributeErrorr   )r7   r   r%   r%   r&   r   5  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   rQ   parse)r7   r0   Z	post_dataparserr%   r%   r&   parse_file_upload;  s   zHttpRequest.parse_file_uploadc              
   C   s   t | dsB| jrtdtjd ur"t| jdpdtjkr"tdz| 	 | _
W n ty; } zt|j |d }~ww 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.)r   _read_startedr'   r	   ZDATA_UPLOAD_MAX_MEMORY_SIZEintr0   rB   r   readr   OSErrorr!   argsr   _stream)r7   er%   r%   r&   bodyD  s   

zHttpRequest.bodyc                 C   s   t  | _t | _d S r<   )r,   r   r   r   r6   r%   r%   r&   _mark_post_parse_errorV  s   z"HttpRequest._mark_post_parse_errorc                 C   s   | j dkrt| jdt | _| _dS | jr!t| ds!|   dS | j	dkrNt| dr1t
| j}n| }z| | j|\| _| _W dS  tyM   |    w | j	dkrct| j| jdt | _| _dS t| jdt | _| _dS )zFPopulate self._post and self._files if the content-type is a form typer.   )rQ   Nr   zmultipart/form-dataz!application/x-www-form-urlencoded)r3   r,   r   r   r   r   r   r   r   r4   r   r   r   r0   r   r   )r7   datar%   r%   r&   _load_post_and_filesZ  s&   



 z HttpRequest._load_post_and_filesc                 C   s:   t | drtdd | j D D ]}|  qd S d S )Nr   c                 s   s    | ]}|d  V  qdS )r   Nr%   )rE   list_r%   r%   r&   rH   y  s    z$HttpRequest.close.<locals>.<genexpr>)r   r   from_iterabler   listsclose)r7   fr%   r%   r&   r   w  s
   

zHttpRequest.closec              
   O   @   d| _ z
| jj|i |W S  ty } zt|j |d }~ww NT)r   r   r   r   r!   r   r7   r   kwargsr   r%   r%   r&   r        zHttpRequest.readc              
   O   r   r   )r   r   readliner   r!   r   r   r%   r%   r&   r     r   zHttpRequest.readlinec                 C   s   t | jdS )N    )iterr   r6   r%   r%   r&   __iter__     zHttpRequest.__iter__c                 C   s   t | S r<   )listr6   r%   r%   r&   	readlines  s   zHttpRequest.readlines)Fr<   )*r"   r#   r$   r(   r   r   r8   r;   r   r>   rC   rJ   rS   rY   ra   rV   r9   rh   rd   rp   rt   rw   r~   r{   r   propertyru   rW   r   rQ   setterr   r   r   r   r   r   r   r   r   r   r   r%   r%   r%   r&   r)   8   s^    



	
$

	



	
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 )
r=   ZHTTP_rK   r   c                    s<   i }|  D ]\}}| |}|r|||< qt | d S r<   )itemsparse_header_namesuperr8   )r7   environr>   r   rs   namer:   r%   r&   r8     s   
zHttpHeaders.__init__c                    s   t  |ddS )z:Allow header lookup using underscores in place of hyphens._-)r   __getitem__replacer7   rq   r   r%   r&   r        zHttpHeaders.__getitem__c                 C   s>   | | jr|t| jd  }n|| jvrd S |dd S )Nr   r   )rz   HTTP_PREFIXlenUNPREFIXED_HEADERSr   title)clsr   r%   r%   r&   r     s
   
zHttpHeaders.parse_header_name)
r"   r#   r$   r   r   r8   r   classmethodr   __classcell__r%   r%   r   r&   r=     s    r=   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| jtjd}t|tr3z|| j}W n t	y2   |d}Y nw zt
|fi |D ]
\}}| || q<W n tyY } ztd|d }~ww || _d S )Nr+   T)keep_blank_valuesrQ   r   z
iso-8859-1zRThe number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.)r   r8   r	   DEFAULT_CHARSETrQ   ZDATA_UPLOAD_MAX_NUMBER_FIELDS
isinstancebytesdecodeUnicodeDecodeErrorr   
appendlistr   r   _mutable)r7   Zquery_stringr*   rQ   Zparse_qsl_kwargsrq   rs   r   r   r%   r&   r8     s4   


	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*   rQ   F)r   r   )r   iterablers   r*   rQ   qrq   r%   r%   r&   fromkeys  s   zQueryDict.fromkeysc                 C   s   | j d u r	tj| _ | j S r<   )r   r	   r   r6   r%   r%   r&   rQ     s   
zQueryDict.encodingc                 C   s
   || _ d S r<   r   )r7   rs   r%   r%   r&   rQ     r?   c                 C   s   | j stdd S )Nz$This QueryDict instance is immutable)r   r   r6   r%   r%   r&   _assert_mutable  s   zQueryDict._assert_mutablec                    2   |    t|| j}t|| j}t || d S r<   )r   bytes_to_textrQ   r   __setitem__r7   rq   rs   r   r%   r&   r         zQueryDict.__setitem__c                    s   |    t | d S r<   )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   )r:   rQ   r   setlist)r7   resultrq   rs   r%   r%   r&   __copy__
  s   zQueryDict.__copy__c                 C   sP   | j dd| jd}||t| < |  D ]\}}|t||t|| q|S r   )r:   rQ   idr   r   copydeepcopy)r7   memor   rq   rs   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   rQ   )rE   eltr6   r%   r&   r     s    z%QueryDict.setlist.<locals>.<listcomp>)r   r   rQ   r   r   )r7   rq   r   r   r6   r&   r     s   zQueryDict.setlistc                    s   |    t ||S r<   )r   r   setlistdefault)r7   rq   Zdefault_listr   r%   r&   r        zQueryDict.setlistdefaultc                    r   r<   )r   r   rQ   r   r   r   r   r%   r&   r   !  r   zQueryDict.appendlistc                    s   |    t j|g|R  S r<   )r   r   pop)r7   rq   r   r   r%   r&   r   '  s   zQueryDict.popc                    s   |    t  S r<   )r   r   popitemr6   r   r%   r&   r   +  s   
zQueryDict.popitemc                    s   |    t   d S r<   )r   r   clearr6   r   r%   r&   r   /  r   zQueryDict.clearc                    s.   |    t|| j}t|| j}t ||S r<   )r   r   rQ   r   
setdefault)r7   rq   rr   r   r%   r&   r   3  s   zQueryDict.setdefaultc                 C   s
   |  i S )z%Return a mutable copy of this object.)r   r6   r%   r%   r&   r   9  r?   zQueryDict.copyc                    sb   g }r jfdd ndd   D ]\}| fdd|D  qd|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&   encodeN  s   z#QueryDict.urlencode.<locals>.encodec                 S   s   t | |iS r<   )r   r   r%   r%   r&   r   Q  r   c                 3   s.    | ]}  jt| jV  qd S r<   )r   rQ   rb   )rE   r   )r   r   r7   r%   r&   rH   T  s
    
z&QueryDict.urlencode.<locals>.<genexpr>&)r   rQ   r   extendjoin)r7   r   outputr   r%   )r   r   r   r7   r&   r   =  s   

zQueryDict.urlencode)NFN)r+   FNr<   )r"   r#   r$   r(   r   r   r8   r   r   r   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r%   r   r&   r,     s2    

r,   c                   @   s8   e Zd Zdd Zdd Zdd Zedd Zd	d
 ZdS )	MediaTypec                 C   s4   t |r|dnd\}| _|d\| _}| _d S )Nasciir   rj   )r   r   params	partition	main_typesub_type)r7   Zmedia_type_raw_lineZ	full_typer   r%   r%   r&   r8   \  s   
zMediaType.__init__c                 C   s@   d dd | j D }d| j| jrd| j |f S d|f S )Nr+   c                 s   s&    | ]\}}d || df V  qdS )z; %s=%sr   N)r   )rE   r   r   r%   r%   r&   rH   c  s
    
z$MediaType.__str__.<locals>.<genexpr>ri   z/%s)r   r   r   r   r   )r7   
params_strr%   r%   r&   __str__b  s   
zMediaType.__str__c                 C   s   d| j j| f S )Nz<%s: %s>)r:   r$   r6   r%   r%   r&   r;   m  s   zMediaType.__repr__c                 C   s   | j dko	| jdkS )N*)r   r   r6   r%   r%   r&   is_all_typesp  r   zMediaType.is_all_typesc                 C   s6   | j rdS t|}| j|jkr| jd|jhv rdS dS )NTr   F)r  r   r   r   )r7   otherr%   r%   r&   rD   t  s   zMediaType.matchN)	r"   r#   r$   r8   r   r;   r   r  rD   r%   r%   r%   r&   r   [  s    
r   c                 C   s   t | trt| |dS | 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   )r   r   rb   )srQ   r%   r%   r&   r     s   
r   c                 C   sx   |   } t| sdS | d dkr| dfS | dd}t|dkr#|n|d df\}}|d	r6|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   rx   r   .N)lowerhost_validation_rerD   rsplitr   rl   )rX   r}   r^   r_   r%   r%   r&   r[     s   
 r[   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 )r   Nr   )rE   patternrX   r%   r&   rH     s     z validate_host.<locals>.<genexpr>)rI   )rX   r]   r%   r  r&   r\     s   r\   c                 C   s   dd |  dD S )Nc                 S   s   g | ]
}|  rt|qS r%   )stripr   )rE   tokenr%   r%   r&   r     s    z'parse_accept_header.<locals>.<listcomp>,)split)r   r%   r%   r&   rA     s   rA   )>rM   rN   r   r   ior   	itertoolsr   urllib.parser   r   r   r   r   Zdjango.confr	   Zdjango.corer
   Zdjango.core.exceptionsr   r   r   r   Zdjango.core.filesr   Zdjango.http.multipartparserr   r   Zdjango.utils.datastructuresr   r   r   Zdjango.utils.deprecationr   Zdjango.utils.encodingr   r   Zdjango.utils.functionalr   Zdjango.utils.httpr   Zdjango.utils.inspectr   Zdjango.utils.regex_helperr   Zmultipartparserr   objectrp   r	  r   r!   	Exceptionr'   r)   r=   r,   r   r   r[   r\   rA   r%   r%   r%   r&   <module>   sP    	  c )%