a
    ÛEb”`  ã                   @   sz  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 m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' ddl(m)Z) e*ƒ Z+e'dƒZ,G dd„ de-ƒZ.G dd„ de/ƒZ0G dd„ dƒZ1G dd„ deƒZ2G dd„ deƒZ3G dd„ dƒZ4dd„ Z5d d!„ Z6d"d#„ Z7d$d%„ Z8dS )&é    N)ÚBytesIO)Úchain)Ú	parse_qslÚquoteÚ	urlencodeÚurljoinÚurlsplit)Úsettings)Úsigning)ÚDisallowedHostÚImproperlyConfiguredÚRequestDataTooBigÚTooManyFieldsSent)Úuploadhandler)ÚMultiPartParserÚMultiPartParserError)ÚCaseInsensitiveMappingÚImmutableListÚMultiValueDict)Úescape_uri_pathÚ
iri_to_uri)Úcached_property©Úis_same_domain)Ú_lazy_re_compileé   )Úparse_headerz1^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9\.:]+\])(:\d+)?$c                   @   s   e Zd ZdS )ÚUnreadablePostErrorN)Ú__name__Ú
__module__Ú__qualname__© r!   r!   úS/home/ja/django-apps/lartica_env/lib/python3.9/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                   @   sN  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dCdd„ZdDdd„Zdd„ Zeddfdd„ZdEdd „Zed!d"„ ƒZd#d$„ Ze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__9   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>)r/   Úget_full_pathÚ	__class__r   r2   r!   r!   r"   Ú__repr__K   s    ýzHttpRequest.__repr__c                 C   s
   t | jƒS ©N)ÚHttpHeadersr,   r2   r!   r!   r"   ÚheadersT   s    zHttpRequest.headersc                 C   s   t | j dd¡ƒS )z%Return a list of MediaType instances.ÚAcceptz*/*)Úparse_accept_headerr:   Úgetr2   r!   r!   r"   Úaccepted_typesX   s    zHttpRequest.accepted_typesc                    s   t ‡ fdd„| jD ƒƒS )Nc                 3   s   | ]}|  ˆ ¡V  qd S r8   )Úmatch)Ú.0Zaccepted_type©Ú
media_typer!   r"   Ú	<genexpr>^   s   z&HttpRequest.accepts.<locals>.<genexpr>)Úanyr>   )r3   rB   r!   rA   r"   Úaccepts]   s    ÿzHttpRequest.acceptsc                 C   s\   t  | dd¡¡\| _| _d| jv rXzt | jd ¡ W n tyJ   Y n0 | jd | _dS )z/Set content_type, content_params, and encoding.ÚCONTENT_TYPEr'   ÚcharsetN)	Úcgir   r=   r0   r1   ÚcodecsÚlookupÚLookupErrorÚencoding)r3   Úmetar!   r!   r"   Ú_set_content_type_paramsb   s    
ÿ
z$HttpRequest._set_content_type_paramsc                 C   sh   t jrd| jv r| jd }nHd| jv 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)r3   ÚhostZserver_portr!   r!   r"   Ú_get_raw_hosto   s    

zHttpRequest._get_raw_hostc                 C   sl   |   ¡ }tj}tjr |s g d¢}t|ƒ\}}|r>t||ƒr>|S d| }|rX|d| 7 }n|d7 }t|ƒ‚dS )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.N)rT   r	   ZALLOWED_HOSTSÚDEBUGÚsplit_domain_portÚvalidate_hostr   )r3   rS   Úallowed_hostsÚdomainÚportÚmsgr!   r!   r"   Úget_host�   s    
ÿzHttpRequest.get_hostc                 C   s.   t jrd| jv 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)r3   rZ   r!   r!   r"   rQ   —   s    
zHttpRequest.get_portFc                 C   s   |   | j|¡S r8   )Ú_get_full_pathr-   ©r3   Úforce_append_slashr!   r!   r"   r5   Ÿ   s    zHttpRequest.get_full_pathc                 C   s   |   | j|¡S r8   )r^   r.   r_   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 )Nú%s%s%sú/r'   ÚQUERY_STRINGú?)r   Úendswithr,   r=   r   )r3   r-   r`   r!   r!   r"   r^   ¥   s    ÿûzHttpRequest._get_full_pathr'   c                 C   s~   z| j | }W n$ ty2   |tur,| Y S ‚ Y n0 ztj|| d�j||d�}W n& tjyx   |turr| Y S ‚ Y n0 |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)r3   ÚkeyÚdefaultrg   rh   Zcookie_valueÚvaluer!   r!   r"   Úget_signed_cookie°   s    ÿ
zHttpRequest.get_signed_cookiec                 C   sš   |du rd|   ¡  }nt|ƒ}t|ƒ}|jr2|js’|j d¡r€|js€|js€d|jvr€d|jvr€| d¡rt|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//%src   z/./z/../z//é   )
r5   r]   r   ÚschemeÚnetlocr-   Ú
startswithÚ_current_scheme_hostr   r   )r3   ÚlocationÚbitsr!   r!   r"   Úbuild_absolute_uriÈ   s(    	
ÿþýüû

zHttpRequest.build_absolute_uric                 C   s   d  | j|  ¡ ¡S )Nz{}://{})Úformatrp   r\   r2   r!   r!   r"   rs   ñ   s    z HttpRequest._current_scheme_hostc                 C   s   dS )zf
        Hook for subclasses like WSGIRequest to implement. Return 'http' by
        default.
        Úhttpr!   r2   r!   r!   r"   Ú_get_schemeõ   s    zHttpRequest._get_schemec                 C   s\   t jrTzt j\}}W n ty.   tdƒ‚Y n0 | j |¡}|d urT||krPdS dS |  ¡ S )NzJThe SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.Úhttpsrx   )r	   ZSECURE_PROXY_SSL_HEADERÚ
ValueErrorr   r,   r=   ry   )r3   ÚheaderZsecure_valueÚheader_valuer!   r!   r"   rp   ü   s    ÿ
zHttpRequest.schemec                 C   s
   | j dkS )Nrz   )rp   r2   r!   r!   r"   rR     s    zHttpRequest.is_securec                 C   s   | j S r8   ©Ú	_encodingr2   r!   r!   r"   rL     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)r   Úhasattrr)   r€   )r3   Úvalr!   r!   r"   rL     s
    

c                    s   ‡ fdd„t jD ƒˆ _d S )Nc                    s   g | ]}t  |ˆ ¡‘qS r!   )r   Zload_handler)r@   Úhandlerr2   r!   r"   Ú
<listcomp>   s   ÿz4HttpRequest._initialize_handlers.<locals>.<listcomp>)r	   ZFILE_UPLOAD_HANDLERSÚ_upload_handlersr2   r!   r2   r"   Ú_initialize_handlers  s    
þz HttpRequest._initialize_handlersc                 C   s   | j s|  ¡  | j S r8   )r…   r†   r2   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…   )r3   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   rL   Úparse)r3   r,   Z	post_dataÚparserr!   r!   r"   Úparse_file_upload5  s    ýzHttpRequest.parse_file_uploadc              
   C   s–   t | dƒs�| jrtdƒ‚tjd urDt| j d¡p2dƒtjkrDtdƒ‚z|  	¡ | _
W n0 ty‚ } zt|jŽ |‚W Y d }~n
d }~0 0 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Úintr,   r=   r   ÚreadrŽ   ÚOSErrorr   Úargsr   Ú_stream)r3   Úer!   r!   r"   ÚbodyA  s(    
ÿÿÿþÿ"zHttpRequest.bodyc                 C   s   t ƒ | _tƒ | _d S r8   )r(   r€   r   rˆ   r2   r!   r!   r"   Ú_mark_post_parse_errorZ  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r t| dƒrbt
| jƒ}n| }z|  | j|¡\| _| _W qà tyœ   |  ¡  ‚ Y qà0 n@| j	dkrÈt| 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*   )rL   NrŽ   zmultipart/form-dataz!application/x-www-form-urlencoded)r/   r(   r   r   r€   rˆ   r�   r�   r˜   r0   r   rŽ   r�   r,   r   r—   )r3   Údatar!   r!   r"   Ú_load_post_and_files^  s0    

þ




þ
þ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 )r   Nr!   )r@   Úlist_r!   r!   r"   rC   †  ó    z$HttpRequest.close.<locals>.<genexpr>)r�   r   Úfrom_iterablerˆ   ÚlistsÚclose)r3   Úfr!   r!   r"   rŸ   „  s    
zHttpRequest.closec              
   O   sP   d| _ z| jj|i |¤ŽW S  tyJ } zt|jŽ |‚W Y d }~n
d }~0 0 d S ©NT)r�   r•   r’   r“   r   r”   ©r3   r”   Úkwargsr–   r!   r!   r"   r’   ‘  s
    zHttpRequest.readc              
   O   sP   d| _ z| jj|i |¤ŽW S  tyJ } zt|jŽ |‚W Y d }~n
d }~0 0 d S r¡   )r�   r•   Úreadliner“   r   r”   r¢   r!   r!   r"   r¤   ˜  s
    zHttpRequest.readlinec                 C   s   t | jdƒS )Nrœ   )Úiterr¤   r2   r!   r!   r"   Ú__iter__Ÿ  s    zHttpRequest.__iter__c                 C   s   t | ƒS r8   )Úlistr2   r!   r!   r"   Ú	readlines¢  s    zHttpRequest.readlines)F)F)N)(r   r   r    r$   r   r…   r4   r7   r   r:   r>   rE   rN   rT   r\   rQ   r5   ra   r^   rj   rn   rv   rs   ry   Úpropertyrp   rR   rL   Úsetterr†   r‡   r�   r—   r˜   rš   rŸ   r’   r¤   r¦   r¨   r!   r!   r!   r"   r%   2   sX   	




)






&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 )
r9   ZHTTP_rF   r�   c                    s<   i }|  ¡ D ]\}}|  |¡}|r|||< qtƒ  |¡ d S r8   )ÚitemsÚparse_header_nameÚsuperr4   )r3   Úenvironr:   r|   rm   Úname©r6   r!   r"   r4   «  s    

zHttpHeaders.__init__c                    s   t ƒ  | dd¡¡S )z:Allow header lookup using underscores in place of hyphens.Ú_ú-)r­   Ú__getitem__Úreplace©r3   rk   r°   r!   r"   r³   ³  s    zHttpHeaders.__getitem__c                 C   s>   |  | j¡r |t| jƒd … }n|| jvr.d S | dd¡ ¡ S )Nr±   r²   )rr   ÚHTTP_PREFIXÚlenÚUNPREFIXED_HEADERSr´   Útitle)Úclsr|   r!   r!   r"   r¬   ·  s
    
zHttpHeaders.parse_header_name)
r   r   r    r¶   r¸   r4   r³   Úclassmethodr¬   Ú__classcell__r!   r!   r°   r"   r9   ¦  s   r9   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ƒrfz| | j¡}W n t	yd   | d¡}Y n0 z*t
|fi |¤ŽD ]\}}|  ||¡ qxW n. ty¾ } ztdƒ|‚W Y d }~n
d }~0 0 || _d S )Nr'   T)Úkeep_blank_valuesrL   Úmax_num_fieldsz
iso-8859-1zRThe number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.)r­   r4   r	   ÚDEFAULT_CHARSETrL   ZDATA_UPLOAD_MAX_NUMBER_FIELDSÚ
isinstanceÚbytesÚdecodeÚUnicodeDecodeErrorr   Ú
appendlistr{   r   Ú_mutable)r3   Zquery_stringr&   rL   Zparse_qsl_kwargsrk   rm   r–   r°   r!   r"   r4   Ô  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&   rL   F)rÄ   rÅ   )rº   Úiterablerm   r&   rL   Úqrk   r!   r!   r"   Úfromkeysò  s    zQueryDict.fromkeysc                 C   s   | j d u rtj| _ | j S r8   )r   r	   r¿   r2   r!   r!   r"   rL   ÿ  s    
zQueryDict.encodingc                 C   s
   || _ d S r8   r~   )r3   rm   r!   r!   r"   rL     s    c                 C   s   | j stdƒ‚d S )Nz$This QueryDict instance is immutable)rÅ   r‰   r2   r!   r!   r"   Ú_assert_mutable	  s    zQueryDict._assert_mutablec                    s2   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡ d S r8   )rÊ   Úbytes_to_textrL   r­   Ú__setitem__©r3   rk   rm   r°   r!   r"   rÌ     s    zQueryDict.__setitem__c                    s   |   ¡  tƒ  |¡ d S r8   )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Æ   )r6   rL   rž   Úsetlist)r3   Úresultrk   rm   r!   r!   r"   Ú__copy__  s    zQueryDict.__copy__c                 C   sP   | j dd| jd�}||t| ƒ< |  ¡ D ]$\}}| t ||¡t ||¡¡ q&|S rÏ   )r6   rL   Úidrž   rÐ   ÚcopyÚdeepcopy)r3   ÚmemorÑ   rk   rm   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Ë   rL   )r@   Úeltr2   r!   r"   r„   '  rœ   z%QueryDict.setlist.<locals>.<listcomp>)rÊ   rË   rL   r­   rÐ   )r3   rk   r›   r°   r2   r"   rÐ   $  s    zQueryDict.setlistc                    s   |   ¡  tƒ  ||¡S r8   )rÊ   r­   Úsetlistdefault)r3   rk   Zdefault_listr°   r!   r"   rÙ   *  s    zQueryDict.setlistdefaultc                    s2   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡ d S r8   )rÊ   rË   rL   r­   rÄ   rÍ   r°   r!   r"   rÄ   .  s    zQueryDict.appendlistc                    s   |   ¡  tƒ j|g|¢R Ž S r8   )rÊ   r­   Úpop)r3   rk   r”   r°   r!   r"   rÚ   4  s    zQueryDict.popc                    s   |   ¡  tƒ  ¡ S r8   )rÊ   r­   Úpopitemr2   r°   r!   r"   rÛ   8  s    zQueryDict.popitemc                    s   |   ¡  tƒ  ¡  d S r8   )rÊ   r­   Úclearr2   r°   r!   r"   rÜ   <  s    zQueryDict.clearc                    s.   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡S r8   )rÊ   rË   rL   r­   Ú
setdefault)r3   rk   rl   r°   r!   r"   rÝ   @  s    zQueryDict.setdefaultc                 C   s
   |   i ¡S )z%Return a mutable copy of this object.)r×   r2   r!   r!   r"   rÔ   F  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 r8   )r   rÞ   r!   r!   r"   râ   `  s    c                 3   s,   | ]$}ˆ ˆ  ˆj¡t|ƒ  ˆj¡ƒV  qd S r8   )râ   rL   r]   )r@   rà   )râ   rß   r3   r!   r"   rC   d  s   ÿz&QueryDict.urlencode.<locals>.<genexpr>ú&)râ   rL   rž   ÚextendÚjoin)r3   rá   Úoutputr›   r!   )râ   rß   rá   r3   r"   r   J  s    þ
zQueryDict.urlencode)NFN)r'   FN)N)N)N)r   r   r    r$   rÅ   r   r4   r»   rÉ   r©   rL   rª   rÊ   rÌ   rÎ   rÒ   r×   rÐ   rÙ   rÄ   rÚ   rÛ   rÜ   rÝ   rÔ   r   r¼   r!   r!   r°   r"   r(   À  s0   

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œ   rc   )r   râ   ÚparamsÚ	partitionÚ	main_typeÚsub_type)r3   Zmedia_type_raw_lineZ	full_typer±   r!   r!   r"   r4   l  s    ÿ
zMediaType.__init__c                 C   s:   d  dd„ | j ¡ D ƒ¡}d| j| jr0d| j nd|f S )Nr'   c                 s   s$   | ]\}}d ||  d¡f V  qdS )z; %s=%srè   N)rÂ   )r@   rß   rà   r!   r!   r"   rC   s  s   z$MediaType.__str__.<locals>.<genexpr>rb   z/%s)rå   ré   r«   rë   rì   )r3   Ú
params_strr!   r!   r"   Ú__str__r  s    
ÿýzMediaType.__str__c                 C   s   d| j j| f S )Nz<%s: %s>)r6   r    r2   r!   r!   r"   r7   |  s    zMediaType.__repr__c                 C   s   | j dko| jdkS )NÚ*)rë   rì   r2   r!   r!   r"   Úis_all_types  s    zMediaType.is_all_typesc                 C   s6   | j r
dS t|ƒ}| j|jkr2| jd|jhv r2dS dS )NTrï   F)rð   rç   rë   rì   )r3   Úotherr!   r!   r"   r?   ƒ  s    zMediaType.matchN)	r   r   r    r4   rî   r7   r©   rð   r?   r!   r!   r!   r"   rç   k  s   

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Á   r]   )ÚsrL   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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   ro   r   Ú.N)ÚlowerÚhost_validation_rer?   Úrsplitr·   rf   )rS   ru   rY   rZ   r!   r!   r"   rV   �  s    
 rV   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   )r@   Úpattern©rS   r!   r"   rC   Â  s   z validate_host.<locals>.<genexpr>)rD   )rS   rX   r!   rû   r"   rW   ³  s    ÿrW   c                 C   s   dd„ |   d¡D ƒS )Nc                 S   s   g | ]}|  ¡ rt|ƒ‘qS r!   )Ústriprç   )r@   Útokenr!   r!   r"   r„   È  rœ   z'parse_accept_header.<locals>.<listcomp>ú,)Úsplit)r|   r!   r!   r"   r<   Ç  s    r<   )9rH   rI   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.encodingr   r   Zdjango.utils.functionalr   Zdjango.utils.httpr   Zdjango.utils.regex_helperr   Zmultipartparserr   Úobjectrj   rø   r“   r   Ú	Exceptionr#   r%   r9   r(   rç   rË   rV   rW   r<   r!   r!   r!   r"   Ú<module>   sB   ÿ
  v ,$