o
    ×ŸŽiàe  ã                   @   sn  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.ƒZ/G dd„ dƒZ0G dd„ deƒZ1G dd„ deƒZ2G dd„ dƒZ3dd„ Z4dd„ Z5d d!„ Z6d"d#„ Z7d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\psant\Downloads\Anu Raj Backend\school\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                   @   sj  e Zd ZdZdZg ZeddgƒZdd„ Zdd„ 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dIdd„ZdIdd„Zd d!„ Zed"dfd#d$„ZdJd%d&„Zed'd(„ ƒZd)d*„ Zed+d,„ ƒZd-d.„ Zed/d0„ ƒZej d1d0„ ƒZd2d3„ Z!ed4d5„ ƒZ"e"j d6d5„ ƒZ"d7d8„ Z#ed9d:„ ƒZ$d;d<„ Z%d=d>„ Z&d?d@„ Z'dAdB„ Z(dCdD„ Z)dEdF„ Z*dGdH„ Z+dS )KÚHttpRequestzA basic HTTP request.NÚresolver_matchÚ_streamc                 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Úmethodr%   Ú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>)r0   Úget_full_pathÚ	__class__r   r3   r    r    r!   Ú__repr__N   s   ýzHttpRequest.__repr__c                 C   s(   | j  ¡ }| jD ]	}||v r||= q|S ©N)Ú__dict__ÚcopyÚnon_picklable_attrs)r4   Úobj_dictÚattrr    r    r!   Ú__getstate__W   s   

€zHttpRequest.__getstate__c              	   C   sJ   t   | ¡}| jD ]}t| |ƒrt||t  t| |ƒ|¡ƒ q||t| ƒ< |S r9   )r;   r<   ÚhasattrÚsetattrÚdeepcopyÚgetattrÚid)r4   ÚmemoÚobjr>   r    r    r!   Ú__deepcopy__^   s   


€zHttpRequest.__deepcopy__c                 C   s
   t | jƒS r9   )ÚHttpHeadersr-   r3   r    r    r!   Úheadersf   ó   
zHttpRequest.headersc                 C   s   t | j dd¡ƒS )z%Return a list of MediaType instances.ÚAcceptz*/*N)Úparse_accept_headerrI   Úgetr3   r    r    r!   Úaccepted_typesj   s   zHttpRequest.accepted_typesc                    s   t ‡ fdd„| jD ƒƒS )Nc                 3   s   � | ]}|  ˆ ¡V  qd S r9   )Úmatch)Ú.0Zaccepted_type©Ú
media_typer    r!   Ú	<genexpr>p   s   € 

ÿz&HttpRequest.accepts.<locals>.<genexpr>)ÚanyrN   )r4   rR   r    rQ   r!   Úacceptso   s   ÿzHttpRequest.acceptsc                 C   s`   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)r   rM   r1   r2   ÚcodecsÚlookupÚLookupErrorÚencoding)r4   Úmetar    r    r!   Ú_set_content_type_paramst   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:%sN)r	   ZUSE_X_FORWARDED_HOSTr-   Úget_portÚ	is_secure)r4   ÚhostZserver_portr    r    r!   Ú_get_raw_host�   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.N)rc   r	   ZALLOWED_HOSTSÚDEBUGÚsplit_domain_portÚvalidate_hostr   )r4   rb   Ú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_PORTN)r	   ZUSE_X_FORWARDED_PORTr-   Ústr)r4   ri   r    r    r!   r`   ©   s
   

ÿzHttpRequest.get_portFc                 C   ó   |   | j|¡S r9   )Ú_get_full_pathr.   ©r4   Úforce_append_slashr    r    r!   r6   ±   ó   zHttpRequest.get_full_pathc                 C   rm   r9   )rn   r/   ro   r    r    r!   Úget_full_path_info´   rq   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(   ÚQUERY_STRINGú?)r   Úendswithr-   rM   r   )r4   r.   rp   r    r    r!   rn   ·   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_ageN)r,   ÚKeyErrorÚRAISE_ERRORr
   Zget_cookie_signerZunsignZBadSignature)r4   ÚkeyÚdefaultrx   ry   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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//%srt   z/./z/../z//é   )
r6   rl   r   ÚschemeÚnetlocr.   Ú
startswithÚ_current_scheme_hostr   r   )r4   ÚlocationÚbitsr    r    r!   Úbuild_absolute_uriÚ   s*   	
ÿþýüû


ÿzHttpRequest.build_absolute_uric                 C   s   d  | j|  ¡ ¡S )Nz{}://{})Úformatr�   rk   r3   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.
        ÚhttpNr    r3   r    r    r!   Ú_get_scheme  s   zHttpRequest._get_schemec                 C   sl   t jr2zt j\}}W n ty   tdƒ‚w | j |¡}|d ur2| dd¡^}}| ¡ |kr0d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   r-   rM   ÚsplitÚstriprŠ   )r4   ÚheaderZsecure_valueÚheader_valueÚ_r    r    r!   r�     s   ÿÿzHttpRequest.schemec                 C   s
   | j dkS )Nr�   )r�   r3   r    r    r!   ra     s   
zHttpRequest.is_securec                 C   s   | j S r9   ©Ú	_encodingr3   r    r    r!   r[   !  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•   r@   r*   r–   )r4   Ú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)rP   Úhandlerr3   r    r!   Ú
<listcomp>3  s    
ÿÿz4HttpRequest._initialize_handlers.<locals>.<listcomp>)r	   ZFILE_UPLOAD_HANDLERSÚ_upload_handlersr3   r    r3   r!   Ú_initialize_handlers2  s   
þz HttpRequest._initialize_handlersc                 C   s   | j s|  ¡  | j S r9   )rš   r›   r3   r    r    r!   Úupload_handlers8  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š   )r4   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.)ÚwarningN)r   rœ   r   r[   Úparse)r4   r-   Z	post_dataÚparserr    r    r!   Úparse_file_uploadH  s   ýzHttpRequest.parse_file_uploadc              
   C   s¦   t | dƒsP| jrtdƒ‚tjd ur"t| j d¡pdƒtjkr"tdƒ‚z!z|  	¡ | _
W n ty< } zt|jŽ |‚d }~ww W | j ¡  n| j ¡  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Úintr-   rM   r   Úreadr£   ÚOSErrorr   Úargsr&   Úcloser   )r4   Úer    r    r!   ÚbodyT  s0   
ÿÿÿþÿ€ÿÿzHttpRequest.bodyc                 C   s   t ƒ | _tƒ | _d S r9   )r)   r–   r   r�   r3   r    r    r!   Ú_mark_post_parse_erroro  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rPt| dƒr1t
| jƒ}n| }z|  | j|¡\| _| _W dS  ttfyO   |  ¡  ‚ w | j	dkret| 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+   )r[   Nr£   zmultipart/form-dataz!application/x-www-form-urlencoded)r0   r)   r•   r   r–   r�   r¥   r@   r­   r1   r   r£   r¢   r-   r   r   r¬   )r4   Údatar    r    r!   Ú_load_post_and_filess  s2   


þ

ú
þ
þ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    )rP   Úlist_r    r    r!   rS   ›  s   € z$HttpRequest.close.<locals>.<genexpr>)r@   r   Úfrom_iterabler�   Úlistsrª   )r4   Úfr    r    r!   rª   ™  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©   ©r4   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¹   r3   r    r    r!   Ú__iter__´  ó   zHttpRequest.__iter__c                 C   s   t | ƒS r9   )Úlistr3   r    r    r!   Ú	readlines·  s   zHttpRequest.readlines)Fr9   ),r   r   r   r#   r•   rš   Ú	frozensetr<   r5   r8   r?   rG   r   rI   rN   rU   r]   rc   rk   r`   r6   rr   rn   r{   r   r‡   r„   rŠ   Úpropertyr�   ra   r[   Úsetterr›   rœ   r¢   r¬   r­   r¯   rª   r§   r¹   r¼   r¿   r    r    r    r!   r$   3   s`    	




)






&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 )rH   ZHTTP_rV   r¤   c                    s<   i }|  ¡ D ]\}}|  |¡}|r|||< qtƒ  |¡ d S r9   )ÚitemsÚparse_header_nameÚsuperr5   )r4   ÚenvironrI   r‘   r~   Úname©r7   r    r!   r5   À  s   
€zHttpHeaders.__init__c                    s   t ƒ  | dd¡¡S )z:Allow header lookup using underscores in place of hyphens.r“   ú-N)rÅ   Ú__getitem__Úreplace©r4   r|   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É   )rƒ   ÚHTTP_PREFIXÚlenÚUNPREFIXED_HEADERSrË   Útitle©Úclsr‘   r    r    r!   rÄ   Ì  s
   
zHttpHeaders.parse_header_namec                 C   s,   |  dd¡ ¡ }|| jv 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                    ó   ‡ fdd„|  ¡ D ƒS )Nc                    ó   i | ]
\}}ˆ   |¡|“qS r    )rÖ   ©rP   Úheader_namer~   ©rÓ   r    r!   Ú
<dictcomp>á  ó    
ÿÿz-HttpHeaders.to_wsgi_names.<locals>.<dictcomp>©rÃ   ©rÓ   rI   r    rÜ   r!   Úto_wsgi_namesß  ó   
þzHttpHeaders.to_wsgi_namesc                    rØ   )Nc                    rÙ   r    )r×   rÚ   rÜ   r    r!   rÝ   è  rÞ   z-HttpHeaders.to_asgi_names.<locals>.<dictcomp>rß   rà   r    rÜ   r!   Úto_asgi_namesæ  râ   zHttpHeaders.to_asgi_names)r   r   r   rÎ   rÐ   r5   rÊ   ÚclassmethodrÄ   rÖ   r×   rá   rã   Ú__classcell__r    r    rÈ   r!   rH   »  s    



rH   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_valuesr[   Úmax_num_fieldsz
iso-8859-1zRThe number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.)rÅ   r5   r	   ÚDEFAULT_CHARSETr[   ZDATA_UPLOAD_MAX_NUMBER_FIELDSÚ
isinstanceÚbytesÚdecodeÚUnicodeDecodeErrorr   Ú
appendlistrŽ   r   Ú_mutable)r4   Zquery_stringr'   r[   Zparse_qsl_kwargsr|   r~   r«   rÈ   r    r!   r5     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'   r[   FN)rí   rî   )rÓ   Úiterabler~   r'   r[   Úqr|   r    r    r!   Úfromkeys   s   zQueryDict.fromkeysc                 C   s   | j d u r	tj| _ | j S r9   )r•   r	   rè   r3   r    r    r!   r[   -  s   
zQueryDict.encodingc                 C   s
   || _ d S r9   r”   )r4   r~   r    r    r!   r[   3  rJ   c                 C   s   | j stdƒ‚d S )Nz$This QueryDict instance is immutable)rî   rž   r3   r    r    r!   Ú_assert_mutable7  s   ÿzQueryDict._assert_mutablec                    ó2   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡ d S r9   )ró   Úbytes_to_textr[   rÅ   Ú__setitem__©r4   r|   r~   rÈ   r    r!   rö   ;  ó   zQueryDict.__setitem__c                    s   |   ¡  tƒ  |¡ d S r9   )ró   rÅ   Ú__delitem__rÌ   rÈ   r    r!   rù   A  s   zQueryDict.__delitem__c                 C   s4   | j dd| jd�}|  ¡ D ]
\}}| ||¡ q|S ©Nr(   Trï   )r7   r[   r²   Úsetlist)r4   Úresultr|   r~   r    r    r!   Ú__copy__E  s   zQueryDict.__copy__c                 C   sP   | j dd| jd�}||t| ƒ< |  ¡ D ]\}}| t ||¡t ||¡¡ q|S rú   )r7   r[   rD   r²   rû   r;   rB   )r4   rE   rü   r|   r~   r    r    r!   rG   K  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[   )rP   Úeltr3   r    r!   r™   U  s    z%QueryDict.setlist.<locals>.<listcomp>)ró   rõ   r[   rÅ   rû   )r4   r|   r°   rÈ   r3   r!   rû   R  s   zQueryDict.setlistc                    s   |   ¡  tƒ  ||¡S r9   )ró   rÅ   Úsetlistdefault)r4   r|   Zdefault_listrÈ   r    r!   rÿ   X  ó   zQueryDict.setlistdefaultc                    rô   r9   )ró   rõ   r[   rÅ   rí   r÷   rÈ   r    r!   rí   \  rø   zQueryDict.appendlistc                    s   |   ¡  tƒ j|g|¢R Ž S r9   )ró   rÅ   Úpop)r4   r|   r©   rÈ   r    r!   r  b  s   zQueryDict.popc                    s   |   ¡  tƒ  ¡ S r9   )ró   rÅ   Úpopitemr3   rÈ   r    r!   r  f  s   
zQueryDict.popitemc                    s   |   ¡  tƒ  ¡  d S r9   )ró   rÅ   Úclearr3   rÈ   r    r!   r  j  r   zQueryDict.clearc                    s.   |   ¡  t|| jƒ}t|| jƒ}tƒ  ||¡S r9   )ró   rõ   r[   rÅ   Ú
setdefault)r4   r|   r}   rÈ   r    r!   r  n  s   zQueryDict.setdefaultc                 C   s
   |   i ¡S )z%Return a mutable copy of this object.N)rG   r3   r    r    r!   r;   t  rJ   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!   Úencode‰  s   z#QueryDict.urlencode.<locals>.encodec                 S   s   t | |iƒS r9   )r   r  r    r    r!   r	  Ž  r½   c                 3   s.   � | ]}ˆ ˆ  ˆj¡t|ƒ  ˆj¡ƒV  qd S r9   )r	  r[   rl   )rP   r  )r	  r  r4   r    r!   rS   ’  s
   € ÿ
ÿz&QueryDict.urlencode.<locals>.<genexpr>ú&N)r	  r[   r²   ÚextendÚjoin)r4   r  Úoutputr°   r    )r	  r  r  r4   r!   r   x  s   
þ
zQueryDict.urlencode)NFN)r(   FNr9   )r   r   r   r#   rî   r•   r5   rä   rò   rÁ   r[   rÂ   ró   rö   rù   rý   rG   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   s.   t |r|ndƒ\}| _| d¡\| _}| _d S )Nr(   rt   )r   ÚparamsÚ	partitionÚ	main_typeÚsub_type)r4   Zmedia_type_raw_lineZ	full_typer“   r    r    r!   r5   š  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 ||f V  qdS )z; %s=%sNr    )rP   r  r  r    r    r!   rS   ¡  s   € z$MediaType.__str__.<locals>.<genexpr>rs   z/%s)r  r  rÃ   r  r  )r4   Ú
params_strr    r    r!   Ú__str__   s   ýýzMediaType.__str__c                 C   s   d| j j| f S )Nz<%s: %s>)r7   r   r3   r    r    r!   r8   ¨  s   zMediaType.__repr__c                 C   s   | j dko	| jdkS )NÚ*)r  r  r3   r    r    r!   Úis_all_types«  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  )r4   Úotherr    r    r!   rO   ¯  s   zMediaType.matchN)	r   r   r   r5   r  r8   rÁ   r  rO   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Ë   N)ré   rê   rl   )Úsr[   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Œ   r€   r   Ú.N)ÚlowerÚhost_validation_rerO   ÚrsplitrÏ   rw   )rb   r†   rh   ri   r    r    r!   re   É  s   
 re   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   )rP   Úpattern©rb   r    r!   rS   î  s   € 
ÿz validate_host.<locals>.<genexpr>N)rT   )rb   rg   r    r!  r!   rf   ß  s   ÿrf   c                 C   s   dd„ |   d¡D ƒS )Nc                 S   s   g | ]
}|  ¡ rt|ƒ‘qS r    )r�   r  )rP   Útokenr    r    r!   r™   ô  s    z'parse_accept_header.<locals>.<listcomp>r‹   )r�   )r‘   r    r    r!   rL   ó  s   rL   )8rX   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   Úobjectr{   r  r¨   r   Ú	Exceptionr"   r$   rH   r)   r  rõ   re   rf   rL   r    r    r    r!   Ú<module>   sB    ÿ
   3 ,"