
     h`                        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$m%Z% d dl&m'Z' ddl(m)Z)  e*            Z+ e'd          Z, G d de-          Z. G d de/          Z0 G d d          Z1 G d de          Z2 G d de          Z3 G d d          Z4d Z5d Z6d  Z7d! 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parse_header_parameters)_lazy_re_compile   )parse_headerz4^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9\.:]+\])(:[0-9]+)?$c                       e Zd ZdS )UnreadablePostErrorN)__name__
__module____qualname__     O/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/django/http/request.pyr   r   #   s        Dr$   r   c                       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          	Dr$   r'   c                      e Zd ZdZdZg Zd Zd Zed             Z	ed             Z
d Zd Zd	 Zd
 Zd Zd%dZd%dZd ZeddfdZd&dZed             Zd Zed             Zd Zed             Zej        d             Zd Zed             Zej        d             Zd Zed             Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'dS )'HttpRequestzA basic HTTP request.Nc                     t          d          | _        t          d          | _        i | _        i | _        t                      | _        d| _        d| _        d | _	        d | _
        d | _        d | _        d S )NT)mutable )	QueryDictGETPOSTCOOKIESMETAr   FILESpath	path_infomethodresolver_matchcontent_typecontent_paramsselfs    r%   __init__zHttpRequest.__init__8   sv    
 T***d+++		#%%
	" "r$   c                     | j         |                                 sd| j        j        z  S d| j        j        d| j         d|                                 dS )Nz<%s><:  >)r6   get_full_path	__class__r    r:   s    r%   __repr__zHttpRequest.__repr__J   sh    ;d&8&8&:&:DN333  N###KKK    
 	
r$   c                 *    t          | j                  S N)HttpHeadersr2   r:   s    r%   headerszHttpRequest.headersS   s    49%%%r$   c                 R    t          | j                            dd                    S )z%Return a list of MediaType instances.Acceptz*/*)parse_accept_headerrH   getr:   s    r%   accepted_typeszHttpRequest.accepted_typesW   s$     #4<#3#3He#D#DEEEr$   c                 D    t          fd| j        D                       S )Nc              3   B   K   | ]}|                               V  d S rF   )match).0accepted_type
media_types     r%   	<genexpr>z&HttpRequest.accepts.<locals>.<genexpr>]   sB       
 
0=M
++
 
 
 
 
 
r$   )anyrM   )r;   rS   s    `r%   acceptszHttpRequest.accepts\   s>     
 
 
 
AEAT
 
 
 
 
 	
r$   c                    t          |                    dd                    \  | _        | _        d| j        v rE	 t	          j        | j        d                    | j        d         | _        dS # t          $ r Y dS w xY wdS )z/Set content_type, content_params, and encoding.CONTENT_TYPEr-   charsetN)r   rL   r8   r9   codecslookupencodingLookupError)r;   metas     r%   _set_content_type_paramsz$HttpRequest._set_content_type_paramsa   s    1HHH^R((2
 2
.4. +++?d1)<=== !% 3I >     ,+s   A. .
A<;A<c                    t           j        rd| j        v r| j        d         }n[d| j        v r| j        d         }nD| j        d         }|                                 }||                                 rdndk    r|d|}|S )z
        Return the HTTP host using the environment or request headers. Skip
        allowed hosts protection, so may return an insecure host.
        HTTP_X_FORWARDED_HOST	HTTP_HOSTSERVER_NAME44380:)r
   USE_X_FORWARDED_HOSTr2   get_port	is_secure)r;   hostserver_ports      r%   _get_raw_hostzHttpRequest._get_raw_hostn   s     ( 		5.E.R.R945DDDI%%9[)DD 9]+D--//K(8(8BuudCC"&$$4r$   c                     |                                  }t          j        }t          j        r|sg d}t	          |          \  }}|rt          ||          r|S d|z  }|r	|d|z  z  }n|dz  }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.)rl   r
   ALLOWED_HOSTSDEBUGsplit_domain_portvalidate_hostr   )r;   rj   allowed_hostsdomainportmsgs         r%   get_hostzHttpRequest.get_host   s    !!## !.> 	A- 	A@@@M(.. 
	&mFM:: 
	&K1D8C BVKKX !%%%r$   c                     t           j        rd| j        v r| j        d         }n| j        d         }t          |          S )z3Return the port number for the request as a string.HTTP_X_FORWARDED_PORTSERVER_PORT)r
   USE_X_FORWARDED_PORTr2   str)r;   rt   s     r%   rh   zHttpRequest.get_port   sA    ( 	,-D	-Q-Q945DD9]+D4yyr$   Fc                 8    |                      | j        |          S rF   )_get_full_pathr4   r;   force_append_slashs     r%   rB   zHttpRequest.get_full_path   s    ""49.@AAAr$   c                 8    |                      | j        |          S rF   )r}   r5   r~   s     r%   get_full_path_infozHttpRequest.get_full_path_info   s    ""4>3EFFFr$   c           	          t          |          |r|                    d          sdnd| j                            dd          r+dt	          | j                            dd                    z   ndS )N/r-   QUERY_STRING?)r   endswithr2   rL   r   )r;   r4   r   s      r%   r}   zHttpRequest._get_full_path   s~     D!!!%HdmmC.@.@HCCbHy}}^R00S:dimmNB??@@@@
 	
r$   r-   c                     	 | j         |         }n# t          $ r |t          ur|cY S  w xY w	 t          j        ||z                                 ||          }n!# t          j        $ r |t          ur|cY S  w xY w|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)r1   KeyErrorRAISE_ERRORr   get_cookie_signerunsignBadSignature)r;   keydefaultr   r   cookie_valuevalues          r%   get_signed_cookiezHttpRequest.get_signed_cookie   s    	<,LL 	 	 	k))		
	-3:>>>EEg F  EE # 	 	 	k))		
 s    ))-A A97A9c                    |d|                                  z  }nt          |          }t          |          }|j        r|j        s|j                            d          rJ|j        sC|j        s<d|j        vr3d|j        vr*|                    d          r
|dd         }| j        |z   }nt          | j        | j        z   |          }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//%sr   z/./z/../z//   )
rB   r{   r	   schemenetlocr4   
startswith_current_scheme_hostr   r   )r;   locationbitss      r%   build_absolute_urizHttpRequest.build_absolute_uri   s       2 2 4 44HH 8}}H!! 	T 	T
 	$$S))TT T **$)++
 &&t,, ,'|H4x?
 #4#<ty#H(SS(###r$   c                 \    d                     | j        |                                           S )Nz{}://{})formatr   rv   r:   s    r%   r   z HttpRequest._current_scheme_host   s"    T]]__===r$   c                     dS )zf
        Hook for subclasses like WSGIRequest to implement. Return 'http' by
        default.
        httpr#   r:   s    r%   _get_schemezHttpRequest._get_scheme   s	    
 vr$   c                 >   t           j        r~	 t           j        \  }}n# t          $ r t          d          w xY w| j                            |          }|4|                    dd          ^}}|                                |k    rdndS |                                 S )NzJThe SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.,r   httpsr   )	r
   SECURE_PROXY_SSL_HEADER
ValueErrorr   r2   rL   splitstripr   )r;   headersecure_valueheader_value_s        r%   r   zHttpRequest.scheme   s    + 	S'/'G$   *"  
  9==00L'#/#5#5c1#=#= q"."4"4"6"6,"F"FwwFR!!!s    8c                     | j         dk    S )Nr   )r   r:   s    r%   ri   zHttpRequest.is_secure  s    {g%%r$   c                     | j         S rF   	_encodingr:   s    r%   r\   zHttpRequest.encoding  s
    ~r$   c                 `    || _         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   )r;   vals     r%   r\   zHttpRequest.encoding  sG     4 	4!! 	


	 	r$   c                 B      fdt           j        D              _        d S )Nc                 :    g | ]}t          j        |          S r#   )r   load_handler)rQ   handlerr;   s     r%   
<listcomp>z4HttpRequest._initialize_handlers.<locals>.<listcomp>   s6     !
 !
 !
 &w55!
 !
 !
r$   )r
   FILE_UPLOAD_HANDLERS_upload_handlersr:   s   `r%   _initialize_handlersz HttpRequest._initialize_handlers  s7    !
 !
 !
 !
#8!
 !
 !
r$   c                 F    | j         s|                                  | j         S rF   )r   r   r:   s    r%   upload_handlerszHttpRequest.upload_handlers%  s(    $ 	(%%'''$$r$   c                 R    t          | d          rt          d          || _        d S )N_fileszGYou cannot set the upload handlers after the upload has been processed.)r   AttributeErrorr   )r;   r   s     r%   r   zHttpRequest.upload_handlers,  s;    4"" 	    !0r$   c                     t          | j        d          | _        t          ||| j        | j                  }|                                S )z9Return a tuple of (POST QueryDict, FILES MultiValueDict).zEYou cannot alter upload handlers after the upload has been processed.)warning)r   r   r   r\   parse)r;   r2   	post_dataparsers       r%   parse_file_uploadzHttpRequest.parse_file_upload5  sL    ,  
  
  
 !y$2FVV||~~r$   c                    t          | d          s| j        rt          d          t          j        Ft          | j                            d          pd          t          j        k    rt          d          	 | 	                                | _
        n!# t          $ r}t          |j         |d }~ww xY 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
   DATA_UPLOAD_MAX_MEMORY_SIZEintr2   rL   r   readr   OSErrorr   argsr   _stream)r;   es     r%   bodyzHttpRequest.bodyA  s    tW%% 	/! *U   4@	&677<1==67 7 (Q  :!YY[[

 : : :)1629:"4:..DLzs   :B 
B2B--B2c                 R    t                      | _        t                      | _        d S rF   )r.   r   r   r   r:   s    r%   _mark_post_parse_errorz"HttpRequest._mark_post_parse_errorZ  s    [[
$&&r$   c                    | j         dk    r0t          | j                  t                      c| _        | _        dS | j        r&t          | d          s|                                  dS | j	        dk    rut          | d          rt          | j                  }n| }	 |                     | j        |          \  | _        | _        dS # t          $ r |                                   w xY w| j	        dk    r6t          | j        | j                  t                      c| _        | _        dS t          | j                  t                      c| _        | _        dS )zFPopulate self._post and self._files if the content-type is a form typer0   )r\   Nr   zmultipart/form-dataz!application/x-www-form-urlencoded)r6   r.   r   r   r   r   r   r   r   r8   r   r   r   r2   r   r   )r;   datas     r%   _load_post_and_filesz HttpRequest._load_post_and_files^  sl   ;&  4>222   $DJ F 	gdG&<&< 	'')))F 555tW%% tz***.*@*@D*Q*Q'
DKKK'   
 ++--- "EEE$)dn===   $DJ 4>222   $DJs   (C  C&c                     t          | d          rLt          j        d | j                                        D                       D ]}|                                 d S d S )Nr   c              3   &   K   | ]}|d          V  dS )r   Nr#   )rQ   list_s     r%   rT   z$HttpRequest.close.<locals>.<genexpr>  s&      (S(Seq(S(S(S(S(S(Sr$   )r   r   from_iterabler   listsclose)r;   fs     r%   r   zHttpRequest.close  sn    4"" 	((S(St{?P?P?R?R(S(S(SSS  					 	 r$   c                 x    d| _         	  | j        j        |i |S # t          $ r}t	          |j         |d }~ww xY wNT)r   r   r   r   r   r   r;   r   kwargsr   s       r%   r   zHttpRequest.read  sW    !	6$4<$d5f555 	6 	6 	6%qv.A5	6    
949c                 x    d| _         	  | j        j        |i |S # t          $ r}t	          |j         |d }~ww xY wr   )r   r   readliner   r   r   r   s       r%   r   zHttpRequest.readline  sW    !	6(4<($9&999 	6 	6 	6%qv.A5	6r   c                 ,    t          | j        d          S )Nr$   )iterr   r:   s    r%   __iter__zHttpRequest.__iter__  s    DM3'''r$   c                      t          |           S rF   )listr:   s    r%   	readlineszHttpRequest.readlines  s    Dzzr$   )FrF   )(r    r!   r"   r(   r   r   r<   rD   r   rH   rM   rV   r_   rl   rv   rh   rB   r   r}   r   r   r   r   r   propertyr   ri   r\   setterr   r   r   r   r   r   r   r   r   r   r   r#   r$   r%   r*   r*   1   s        I# # #$
 
 
 & & _& F F _F
 
 

? ? ?  $& & &,  B B B BG G G G	
 	
 	
 .9r4    0'$ '$ '$ '$R > > _>   " " X"& & &   X _
 
 _

 
 
 % % X% 0 0 0
 
 
   X0' ' '$ $ $L  6 6 66 6 6( ( (    r$   r*   c                   J     e Zd ZdZddhZ fdZ fdZed             Z xZ	S )rG   HTTP_rX   r   c                     i }|                                 D ]!\  }}|                     |          }|r|||<   "t                                          |           d S rF   )itemsparse_header_namesuperr<   )r;   environrH   r   r   namerC   s         r%   r<   zHttpHeaders.__init__  sf    $]]__ 	& 	&MFE))&11D & %!!!!!r$   c                 n    t                                          |                    dd                    S )z:Allow header lookup using underscores in place of hyphens.r   -)r   __getitem__replacer;   r   rC   s     r%   r   zHttpHeaders.__getitem__  s)    ww""3;;sC#8#8999r$   c                     |                     | j                  r|t          | j                  d          }n|| j        vrd S |                    dd                                          S )Nr   r   )r   HTTP_PREFIXlenUNPREFIXED_HEADERSr   title)clsr   s     r%   r   zHttpHeaders.parse_header_name  si    S_-- 	C00223FF31114~~c3''--///r$   )
r    r!   r"   r   r   r<   r   classmethodr   __classcell__rC   s   @r%   rG   rG     s}        K(*:;" " " " ": : : : : 0 0 [0 0 0 0 0r$   rG   c                        e Zd ZdZdZdZd fd	Zedd            Ze	d             Z
e
j        d	             Z
d
 Z fdZ fdZd Zd Z fdZd fd	Z fdZ fdZ fdZ fdZd fd	Zd ZddZ x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                    t                                                       |pt          j        | _        |pd}d| j        t          j        d}t          |t                    rA	 |                    | j                  }n%# t          $ r |                    d          }Y nw xY w	 t          |fi |D ]\  }}|                     ||           n"# t          $ r}t          d          |d }~ww xY 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   r<   r
   DEFAULT_CHARSETr\   DATA_UPLOAD_MAX_NUMBER_FIELDS
isinstancebytesdecodeUnicodeDecodeErrorr   
appendlistr   r   _mutable)	r;   query_stringr,   r\   parse_qsl_kwargsr   r   r   rC   s	           r%   r<   zQueryDict.__init__  sD    <H$<#)r!%&D
 

 lE** 	AA+224=AA% A A A+22<@@A	'II8HII , ,
UU++++, 	 	 	
 $:  	  s*   $A? ?B! B!%)C 
C.C))C.r-   c                 j     | dd|          }|D ]}|                     ||           |sd|_        |S )zt
        Return a new QueryDict with keys (may be repeated) from an iterable and
        values from value.
        r-   Tr,   r\   F)r  r  )r  iterabler   r,   r\   qr   s          r%   fromkeyszQueryDict.fromkeys  sT     CD8444 	% 	%CLLe$$$$ 	AJr$   c                 @    | j         t          j        | _         | j         S rF   )r   r
   r	  r:   s    r%   r\   zQueryDict.encoding  s    >!%5DN~r$   c                     || _         d S rF   r   )r;   r   s     r%   r\   zQueryDict.encoding  s    r$   c                 2    | j         st          d          d S )Nz$This QueryDict instance is immutable)r  r   r:   s    r%   _assert_mutablezQueryDict._assert_mutable	  s(    } 	I !GHHH	I 	Ir$   c                     |                                   t          || j                  }t          || j                  }t                                          ||           d S rF   )r  bytes_to_textr\   r   __setitem__r;   r   r   rC   s      r%   r  zQueryDict.__setitem__  sW    C//eT]33C'''''r$   c                 r    |                                   t                                          |           d S rF   )r  r   __delitem__r   s     r%   r!  zQueryDict.__delitem__  s3    C     r$   c                     |                      dd| j                  }|                                 D ]\  }}|                    ||           |S Nr-   Tr  )rC   r\   r   setlist)r;   resultr   r   s       r%   __copy__zQueryDict.__copy__  sR    D4=II**,, 	' 	'JCNN3&&&&r$   c                    |                      dd| j                  }||t          |           <   |                                 D ]A\  }}|                    t          j        ||          t          j        ||                     B|S r#  )rC   r\   idr   r$  copydeepcopy)r;   memor%  r   r   s        r%   __deepcopy__zQueryDict.__deepcopy__  s{    D4=IIRXX**,, 	Q 	QJCNN4=d33T]5$5O5OPPPPr$   c                                                         t          | j                  } fd|D             }t                                          ||           d S )Nc                 :    g | ]}t          |j                  S r#   )r  r\   )rQ   eltr;   s     r%   r   z%QueryDict.setlist.<locals>.<listcomp>'  s%    DDDssDM22DDDr$   )r  r  r\   r   r$  )r;   r   r   rC   s   `  r%   r$  zQueryDict.setlist$  s^    C//DDDDeDDDU#####r$   c                 p    |                                   t                                          ||          S rF   )r  r   setlistdefault)r;   r   default_listrC   s      r%   r1  zQueryDict.setlistdefault*  s/    ww%%c<888r$   c                     |                                   t          || j                  }t          || j                  }t                                          ||           d S rF   )r  r  r\   r   r  r  s      r%   r  zQueryDict.appendlist.  sW    C//eT]333&&&&&r$   c                 `    |                                    t                      j        |g|R  S rF   )r  r   pop)r;   r   r   rC   s      r%   r5  zQueryDict.pop4  s3    uww{3&&&&&r$   c                 l    |                                   t                                                      S rF   )r  r   popitemr;   rC   s    r%   r7  zQueryDict.popitem8  s)    ww   r$   c                 p    |                                   t                                                       d S rF   )r  r   clearr8  s    r%   r:  zQueryDict.clear<  s*    r$   c                     |                                   t          || j                  }t          || j                  }t                                          ||          S rF   )r  r  r\   r   
setdefault)r;   r   r   rC   s      r%   r<  zQueryDict.setdefault@  sQ    C//77ww!!#w///r$   c                 ,    |                      i           S )z%Return a mutable copy of this object.)r,  r:   s    r%   r)  zQueryDict.copyF  s      $$$r$   c                      g }r                       j                  fdnd                                  D ](\  }|                     fd|D                        )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                 J    t          |           dt          |          S )N=)r   )kvsafes     r%   encodez#QueryDict.urlencode.<locals>.encode[  s$    #(D>>>>5D>>>CCr$   c                 $    t          | |i          S rF   )r   )rA  rB  s     r%   rD  z#QueryDict.urlencode.<locals>.encode`  s     !Q(((r$   c              3      K   | ]M}                      j                  t          |                               j                            V  Nd S rF   )rD  r\   r{   )rQ   rB  rD  rA  r;   s     r%   rT   z&QueryDict.urlencode.<locals>.<genexpr>d  se         qxx..Adm0L0LMM     r$   &)rD  r\   r   extendjoin)r;   rC  outputr   rD  rA  s   ``  @@r%   r   zQueryDict.urlencodeJ  s      		);;t}--DD D D D D D
) ) ) 

 	 	HAuMM             xxr$   )NFN)r-   FNrF   )r    r!   r"   r(   r  r   r<   r  r  r   r\   r   r  r  r!  r&  r,  r$  r1  r  r5  r7  r:  r<  r)  r   r  r  s   @r%   r.   r.     s          HI           < 
 
 
 [
   X
 _  _I I I( ( ( ( (! ! ! ! !    $ $ $ $ $9 9 9 9 9 9' ' ' ' '' ' ' ' '! ! ! ! !    0 0 0 0 0 0% % %               r$   r.   c                   <    e Zd Zd Zd Zd Zed             Zd ZdS )	MediaTypec                     t          |r|                    d          nd          \  }| _        |                    d          \  | _        }| _        d S )Nasciir$   r   )r   rD  params	partition	main_typesub_type)r;   media_type_raw_line	full_typer   s       r%   r<   zMediaType.__init__l  sX    !-3FO&&w///C"
 "
	4; ,5+>+>s+C+C(4===r$   c                     d                     d | j                                        D                       }| j        | j        r
d| j        z  nd|S )Nr-   c              3   R   K   | ]"\  }}d |d|                     d          V  #dS )z; r@  rN  N)r  )rQ   rA  rB  s      r%   rT   z$MediaType.__str__.<locals>.<genexpr>s  sQ       
 
371aaAHHW---.
 
 
 
 
 
r$   z/%s)rI  rO  r   rQ  rR  )r;   
params_strs     r%   __str__zMediaType.__str__r  sp    WW 
 
;?;;L;L;N;N
 
 
 
 

 NN'+}<UT]"""<J
 	
r$   c                 (    d| j         j        d| dS )Nr>   r?   rA   )rC   r"   r:   s    r%   rD   zMediaType.__repr__|  s     !^888$$$??r$   c                 .    | j         dk    o
| j        dk    S )N*)rQ  rR  r:   s    r%   is_all_typeszMediaType.is_all_types  s    ~$=#)==r$   c                 z    | j         rdS t          |          }| j        |j        k    r| j        d|j        hv rdS dS )NTr[  F)r\  rL  rQ  rR  )r;   others     r%   rP   zMediaType.match  sK     	4%  >U_,,3BW1W1W4ur$   N)	r    r!   r"   r<   rX  rD   r   r\  rP   r#   r$   r%   rL  rL  k  sq        D D D
 
 
@ @ @ > > X>    r$   rL  c                 R    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  r{   )sr\   s     r%   r  r    s-     !U 1h	***r$   c                 <   |                                  } t                              |           sdS | d         dk    r| dfS |                     dd          }t	          |          dk    r|n	|d         df\  }}|                    d	          r
|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-   rf   r   r   r   .N)lowerhost_validation_rerP   rsplitr   r   )rj   r   rs   rt   s       r%   rp   rp     s     ::<<D##D)) vBx3Rx;;sADt99>>44Q}LFD"OOC00<VCRC[[fF4<r$   c                 :     t           f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   D   K   | ]}|d k    pt          |          V  dS )r[  N)r   )rQ   patternrj   s     r%   rT   z validate_host.<locals>.<genexpr>  sG        <C37.w77     r$   )rU   )rj   rr   s   ` r%   rq   rq     s=         GT     r$   c                 @    d |                      d          D             S )Nc                 T    g | ]%}|                                 t          |          &S r#   )r   rL  )rQ   tokens     r%   r   z'parse_accept_header.<locals>.<listcomp>  s-    MMMu{{}}MIeMMMr$   r   )r   )r   s    r%   rK   rK     s"    MM&,,s*;*;MMMMr$   )9rZ   r)  ior   	itertoolsr   urllib.parser   r   r   r   r	   django.confr
   django.corer   django.core.exceptionsr   r   r   r   django.core.filesr   django.http.multipartparserr   r   django.utils.datastructuresr   r   r   django.utils.encodingr   r   django.utils.functionalr   django.utils.httpr   r   django.utils.regex_helperr   multipartparserr   objectr   rf  r   r   	Exceptionr'   r*   rG   r.   rL  r  rp   rq   rK   r#   r$   r%   <module>r~     s                 G G G G G G G G G G G G G G                              , + + + + + M M M M M M M M         
 > = = = = = = = 3 3 3 3 3 3 E E E E E E E E 6 6 6 6 6 6 ) ) ) ) ) )fhh%%;  
	 	 	 	 	' 	 	 		 	 	 	 	9 	 	 	r r r r r r r rj0 0 0 0 0( 0 0 04h  h  h  h  h  h  h  h V       H    ,  (N N N N Nr$   