U
    R+|jÑh  ã                   @   sv  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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' 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ÚTooManyFilesSent)ÚCaseInsensitiveMappingÚImmutableListÚMultiValueDict)Úescape_uri_pathÚ
iri_to_uri)Úcached_property)Úis_same_domainÚparse_header_parameters)Ú_lazy_re_compilez4^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9\.:]+\])(:[0-9]+)?$c                   @   s   e Zd ZdS )ÚUnreadablePostErrorN)Ú__name__Ú
__module__Ú__qualname__© r    r    ú[c:\users\snmko\desktop\web_content\django_cbt\venv\Lib\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                   @   sV  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dEdd„ZdFdd„Zdd„ Zeddfdd„ZdGd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'dCdD„ Z(dS )HÚ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   r1   r    r    r!   Ú__repr__M   s    ýzHttpRequest.__repr__c                 C   s
   t | jƒS ©N)ÚHttpHeadersr+   r1   r    r    r!   ÚheadersV   s    zHttpRequest.headersc                 C   s   t | j dd¡ƒS )z%Return a list of MediaType instances.ÚAcceptz*/*)Úparse_accept_headerr9   Úgetr1   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 r7   )Úmatch)Ú.0Zaccepted_type©Ú
media_typer    r!   Ú	<genexpr>`   s    z&HttpRequest.accepts.<locals>.<genexpr>)Úanyr=   )r2   rA   r    r@   r!   Úaccepts_   s    ÿzHttpRequest.acceptsc                 C   s\   t | dd¡ƒ\| _| _d| jkrXzt | jd ¡ W n tk
rJ   Y nX | jd | _dS )z/Set content_type, content_params, and encoding.ÚCONTENT_TYPEr&   ÚcharsetN)r   r<   r/   r0   ÚcodecsÚlookupÚLookupErrorÚencoding)r2   Úmetar    r    r!   Ú_set_content_type_paramsd   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)r2   ÚhostZserver_portr    r    r!   Ú_get_raw_hostq   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.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)rR   r	   ZALLOWED_HOSTSÚDEBUGÚsplit_domain_portÚvalidate_hostr   )r2   rQ   Úallowed_hostsÚdomainÚportÚmsgr    r    r!   Úget_hostƒ   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)r2   rX   r    r    r!   rO   ™   s    
zHttpRequest.get_portFc                 C   s   |   | j|¡S r7   )Ú_get_full_pathr,   ©r2   Úforce_append_slashr    r    r!   r4   ¡   s    zHttpRequest.get_full_pathc                 C   s   |   | j|¡S r7   )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   )r2   r,   r^   r    r    r!   r\   §   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)r2   ÚkeyÚdefaultre   rf   Zcookie_valueÚvaluer    r    r!   Úget_signed_cookie²   s      ÿ
zHttpRequest.get_signed_cookiec                 C   sš   |dkrd|   ¡  }nt|ƒ}t|ƒ}|jr2|js’|j d¡r€|js€|js€d|jkr€d|jk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//%sra   z/./z/../z//é   )
r4   r[   r   ÚschemeÚnetlocr,   Ú
startswithÚ_current_scheme_hostr   r   )r2   ÚlocationÚbitsr    r    r!   Úbuild_absolute_uriÊ   s(    	
ÿþýüû

zHttpRequest.build_absolute_uric                 C   s   d  | j|  ¡ ¡S )Nz{}://{})Úformatrn   rZ   r1   r    r    r!   rq   ó   s    z HttpRequest._current_scheme_hostc                 C   s   dS )zf
        Hook for subclasses like WSGIRequest to implement. Return 'http' by
        default.
        Úhttpr    r1   r    r    r!   Ú_get_scheme÷   s    zHttpRequest._get_schemec                 C   sr   t jrjzt j\}}W n tk
r0   tdƒ‚Y nX | j |¡}|d k	rj| dd¡^}}| ¡ |krfdS dS |  ¡ S )NzJThe SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.ú,é   Úhttpsrv   )	r	   ZSECURE_PROXY_SSL_HEADERÚ
ValueErrorr   r+   r<   ÚsplitÚstriprw   )r2   ÚheaderZsecure_valueÚheader_valueÚ_r    r    r!   rn   þ   s    ÿ
zHttpRequest.schemec                 C   s
   | j dkS )Nrz   )rn   r1   r    r    r!   rP     s    zHttpRequest.is_securec                 C   s   | j S r7   ©Ú	_encodingr1   r    r    r!   rJ     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ƒ   )r2   Úvalr    r    r!   rJ     s
    

c                    s   ‡ fdd„t jD ƒˆ _d S )Nc                    s   g | ]}t  |ˆ ¡‘qS r    )r   Zload_handler)r?   Úhandlerr1   r    r!   Ú
<listcomp>#  s   ÿz4HttpRequest._initialize_handlers.<locals>.<listcomp>)r	   ZFILE_UPLOAD_HANDLERSÚ_upload_handlersr1   r    r1   r!   Ú_initialize_handlers"  s    
þz HttpRequest._initialize_handlersc                 C   s   | j s|  ¡  | j S r7   )rˆ   r‰   r1   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ˆ   )r2   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   rJ   Úparse)r2   r+   Z	post_dataÚparserr    r    r!   Úparse_file_upload8  s    ýzHttpRequest.parse_file_uploadc              
   C   s*  t | dƒ�s$| jrtdƒ‚|  t| j d¡p.dƒ¡ t | jdƒrv| j ¡ rv| j 	dt
j¡}|  |¡ | j 	d¡ d}nd}zdz0tjd k	r |s |  tjd ¡| _n
|  ¡ | _W n. tk
rÚ } zt|jŽ |‚W 5 d }~X Y nX W 5 | j ¡  X t| jƒ| _|�s$| j 	dt
j¡}|  |¡ | j 	d¡ | jS )	NÚ_bodyz?You cannot access body after reading from request's data streamÚCONTENT_LENGTHr   ÚseekableTFry   )r„   Ú_read_startedr"   Ú_check_data_too_bigÚintr+   r<   Ú_streamr“   ÚseekÚosÚSEEK_ENDÚcloser	   ÚDATA_UPLOAD_MAX_MEMORY_SIZEÚreadr‘   ÚOSErrorr   Úargsr   )r2   Zstream_sizeZ	did_checkÚer    r    r!   ÚbodyD  s2    ÿ
"
zHttpRequest.bodyc                 C   s$   t jd k	r |t jkr d}t|ƒ‚d S )Nz;Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.)r	   rœ   r   )r2   ÚlengthrY   r    r    r!   r•   o  s    ÿþzHttpRequest._check_data_too_bigc                 C   s   t ƒ | _tƒ | _d S r7   )r'   rƒ   r   r‹   r1   r    r    r!   Ú_mark_post_parse_errorw  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tfk
r¢   |  ¡  ‚ Y qæX 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)   )rJ   Nr‘   zmultipart/form-dataz!application/x-www-form-urlencoded)r.   r'   r‚   r   rƒ   r‹   r”   r„   r£   r/   r   r‘   r�   r+   r   r   r¡   )r2   Ú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 )ry   Nr    )r?   Úlist_r    r    r!   rB   £  s     z$HttpRequest.close.<locals>.<genexpr>)r„   r   Úfrom_iterabler‹   Úlistsr›   )r2   Úfr    r    r!   r›   ¡  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Ÿ   ©r2   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­   µ  s
    zHttpRequest.readlinec                 C   s   t | jdƒS )Nó    )Úiterr­   r1   r    r    r!   Ú__iter__¼  s    zHttpRequest.__iter__c                 C   s   t | ƒS r7   )Úlistr1   r    r    r!   Ú	readlines¿  s    zHttpRequest.readlines)F)F)N))r   r   r   r#   r‚   rˆ   r3   r6   r   r9   r=   rD   rL   rR   rZ   rO   r4   r_   r\   rh   rl   rt   rq   rw   Úpropertyrn   rP   rJ   Úsetterr‰   rŠ   r�   r¡   r•   r£   r¥   r›   r�   r­   r°   r²   r    r    r    r!   r$   4   sZ   	




)






*&r$   c                       sp   e Zd ZdZddhZ‡ fdd„Z‡ fdd„Zedd	„ ƒZed
d„ ƒZ	edd„ ƒZ
edd„ ƒZedd„ ƒZ‡  ZS )r8   ZHTTP_rE   r’   c                    s<   i }|  ¡ D ]\}}|  |¡}|r|||< qtƒ  |¡ d S r7   )ÚitemsÚparse_header_nameÚsuperr3   )r2   Úenvironr9   r~   rk   Úname©r5   r    r!   r3   È  s    

zHttpHeaders.__init__c                    s   t ƒ  | dd¡¡S )z:Allow header lookup using underscores in place of hyphens.r€   ú-)r·   Ú__getitem__Úreplace©r2   ri   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»   )rp   ÚHTTP_PREFIXÚlenÚUNPREFIXED_HEADERSr½   Útitle©Úclsr~   r    r    r!   r¶   Ô  s
    
zHttpHeaders.parse_header_namec                 C   s,   |  dd¡ ¡ }|| jkr|S | j› |› �S ©Nr»   r€   )r½   ÚupperrÁ   r¿   rÃ   r    r    r!   Úto_wsgi_nameÜ  s    
zHttpHeaders.to_wsgi_namec                 C   s   |  dd¡ ¡ S rÅ   )r½   rÆ   rÃ   r    r    r!   Úto_asgi_nameã  s    zHttpHeaders.to_asgi_namec                    s   ‡ fdd„|  ¡ D ƒS )Nc                    s   i | ]\}}ˆ   |¡|“qS r    )rÇ   ©r?   Úheader_namerk   ©rÄ   r    r!   Ú
<dictcomp>é  s   ÿ z-HttpHeaders.to_wsgi_names.<locals>.<dictcomp>©rµ   ©rÄ   r9   r    rË   r!   Úto_wsgi_namesç  s    
þzHttpHeaders.to_wsgi_namesc                    s   ‡ fdd„|  ¡ D ƒS )Nc                    s   i | ]\}}ˆ   |¡|“qS r    )rÈ   rÉ   rË   r    r!   rÌ   ð  s   ÿ z-HttpHeaders.to_asgi_names.<locals>.<dictcomp>rÍ   rÎ   r    rË   r!   Úto_asgi_namesî  s    
þzHttpHeaders.to_asgi_names)r   r   r   r¿   rÁ   r3   r¼   Úclassmethodr¶   rÇ   rÈ   rÏ   rÐ   Ú__classcell__r    r    rº   r!   r8   Ã  s   



r8   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ƒrhz| | j¡}W n t	k
rf   | d¡}Y nX z&t
|f|ŽD ]\}}|  ||¡ qvW n, tk
rº } ztdƒ|‚W 5 d }~X Y nX || _d S )Nr&   T)Úkeep_blank_valuesrJ   Úmax_num_fieldsz
iso-8859-1zRThe number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.)r·   r3   r	   ÚDEFAULT_CHARSETrJ   ZDATA_UPLOAD_MAX_NUMBER_FIELDSÚ
isinstanceÚbytesÚdecodeÚUnicodeDecodeErrorr   Ú
appendlistr{   r   Ú_mutable)r2   Zquery_stringr%   rJ   Zparse_qsl_kwargsri   rk   r    rº   r    r!   r3   
  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%   rJ   F)rÚ   rÛ   )rÄ   Úiterablerk   r%   rJ   Úqri   r    r    r!   Úfromkeys(  s    zQueryDict.fromkeysc                 C   s   | j d krtj| _ | j S r7   )r‚   r	   rÕ   r1   r    r    r!   rJ   5  s    
zQueryDict.encodingc                 C   s
   || _ d S r7   r�   )r2   rk   r    r    r!   rJ   ;  s    c                 C   s   | j stdƒ‚d S )Nz$This QueryDict instance is immutable)rÛ   rŒ   r1   r    r    r!   Ú_assert_mutable?  s    zQueryDict._assert_mutablec                    s2   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡ d S r7   )rà   Úbytes_to_textrJ   r·   Ú__setitem__©r2   ri   rk   rº   r    r!   râ   C  s    zQueryDict.__setitem__c                    s   |   ¡  tƒ  |¡ d S r7   )rà   r·   Ú__delitem__r¾   rº   r    r!   rä   I  s    zQueryDict.__delitem__c                 C   s4   | j dd| jd�}|  ¡ D ]\}}| ||¡ q|S ©Nr&   TrÜ   )r5   rJ   r¨   Úsetlist)r2   Úresultri   rk   r    r    r!   Ú__copy__M  s    zQueryDict.__copy__c                 C   sP   | j dd| jd�}||t| ƒ< |  ¡ D ]$\}}| t ||¡t ||¡¡ q&|S rå   )r5   rJ   Úidr¨   ræ   ÚcopyÚdeepcopy)r2   Úmemorç   ri   rk   r    r    r!   Ú__deepcopy__S  s
    zQueryDict.__deepcopy__c                    s8   ˆ   ¡  t|ˆ jƒ}‡ fdd„|D ƒ}tƒ  ||¡ d S )Nc                    s   g | ]}t |ˆ jƒ‘qS r    )rá   rJ   )r?   Úeltr1   r    r!   r‡   ]  s     z%QueryDict.setlist.<locals>.<listcomp>)rà   rá   rJ   r·   ræ   )r2   ri   r¦   rº   r1   r!   ræ   Z  s    zQueryDict.setlistc                    s   |   ¡  tƒ  ||¡S r7   )rà   r·   Úsetlistdefault)r2   ri   Zdefault_listrº   r    r!   rï   `  s    zQueryDict.setlistdefaultc                    s2   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡ d S r7   )rà   rá   rJ   r·   rÚ   rã   rº   r    r!   rÚ   d  s    zQueryDict.appendlistc                    s   |   ¡  tƒ j|f|žŽ S r7   )rà   r·   Úpop)r2   ri   rŸ   rº   r    r!   rð   j  s    zQueryDict.popc                    s   |   ¡  tƒ  ¡ S r7   )rà   r·   Úpopitemr1   rº   r    r!   rñ   n  s    zQueryDict.popitemc                    s   |   ¡  tƒ  ¡  d S r7   )rà   r·   Úclearr1   rº   r    r!   rò   r  s    zQueryDict.clearc                    s.   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡S r7   )rà   rá   rJ   r·   Ú
setdefault)r2   ri   rj   rº   r    r!   ró   v  s    zQueryDict.setdefaultc                 C   s
   |   i ¡S )z%Return a mutable copy of this object.)rí   r1   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 r7   )r   rô   r    r    r!   rø   –  s    c                 3   s,   | ]$}ˆ ˆ  ˆj¡t|ƒ  ˆj¡ƒV  qd S r7   )rø   rJ   r[   )r?   rö   )rø   rõ   r2   r    r!   rB   š  s   ÿz&QueryDict.urlencode.<locals>.<genexpr>ú&)rø   rJ   r¨   ÚextendÚjoin)r2   r÷   Úoutputr¦   r    )rø   rõ   r÷   r2   r!   r   €  s    þ
zQueryDict.urlencode)NFN)r&   FN)N)N)N)r   r   r   r#   rÛ   r‚   r3   rÑ   rß   r³   rJ   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   s.   t |r
|ndƒ\}| _| d¡\| _}| _d S )Nr&   ra   )r   ÚparamsÚ	partitionÚ	main_typeÚsub_type)r2   Zmedia_type_raw_lineZ	full_typer€   r    r    r!   r3   ¢  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 ||f V  qdS )z; %s=%sNr    )r?   rõ   rö   r    r    r!   rB   ©  s     z$MediaType.__str__.<locals>.<genexpr>r`   z/%s)rû   rþ   rµ   r   r  )r2   Z
params_strr    r    r!   Ú__str__¨  s    ýzMediaType.__str__c                 C   s   d| j j| f S )Nz<%s: %s>)r5   r   r1   r    r    r!   r6   °  s    zMediaType.__repr__c                 C   s   | j dko| jdkS )NÚ*)r   r  r1   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kr2dS dS )NTr  F)r  rý   r   r  )r2   Úotherr    r    r!   r>   ·  s    zMediaType.matchN)	r   r   r   r3   r  r6   r³   r  r>   r    r    r    r!   rý   ¡  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[   )ÚsrJ   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&   ú:ry   rm   r   Ú.N)ÚlowerÚhost_validation_rer>   ÚrsplitrÀ   rd   )rQ   rs   rW   rX   r    r    r!   rT   Ñ  s    
 rT   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  N)r   )r?   Úpattern©rQ   r    r!   rB   ö  s    z validate_host.<locals>.<genexpr>)rC   )rQ   rV   r    r  r!   rU   ç  s    ÿrU   c                 C   s   dd„ |   d¡D ƒS )Nc                 S   s   g | ]}|  ¡ rt|ƒ‘qS r    )r}   rý   )r?   Útokenr    r    r!   r‡   ü  s      z'parse_accept_header.<locals>.<listcomp>rx   )r|   )r~   r    r    r!   r;   û  s    r;   )9rG   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   r   Zdjango.utils.datastructuresr   r   r   Zdjango.utils.encodingr   r   Zdjango.utils.functionalr   Zdjango.utils.httpr   r   Zdjango.utils.regex_helperr   Úobjectrh   r  rž   r   Ú	Exceptionr"   r$   r8   r'   rý   rá   rT   rU   r;   r    r    r    r!   Ú<module>   sB   ÿ
   3 ,"