
    gd                        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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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 Z8y)     N)BytesIO)chain)	parse_qslquote	urlencodeurljoinurlsplit)settings)signing)
BadRequest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_compilez7^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9.:]+\])(?::([0-9]+))?$c                       e Zd Zy)UnreadablePostErrorN)__name__
__module____qualname__     k/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/http/request.pyr   r   &   s    r$   r   c                       e Zd ZdZy)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$   r'   c                   h   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j8                  d        Zd Zed        Zej8                  d        Zd Zed        Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'y)&HttpRequestzA basic HTTP request.Nc                     t        d      | _        t        d      | _        i | _        i | _        t               | _        d| _        d| _        d | _	        d | _
        d | _        d | _        y )NT)mutable )	QueryDictGETPOSTCOOKIESMETAr   FILESpath	path_infomethodresolver_matchcontent_typecontent_paramsselfs    r%   __init__zHttpRequest.__init__;   sa    
 T*d+		#%
	" "r$   c                     | j                   | j                         sd| j                  j                  z  S d| j                  j                  d| j                   d| j                         dS )Nz<%s><:  >)r6   get_full_path	__class__r    r:   s    r%   __repr__zHttpRequest.__repr__M   s]    ;;d&8&8&:DNN3333 '; NN##KK 
 	
r$   c                 ,    t        | j                        S N)HttpHeadersr2   r:   s    r%   headerszHttpRequest.headersV   s    499%%r$   c                 L    t        | j                  j                  dd            S )z%Return a list of MediaType instances.Acceptz*/*)parse_accept_headerrH   getr:   s    r%   accepted_typeszHttpRequest.accepted_typesZ   s      #4<<#3#3He#DEEr$   c                 @    t        fd| j                  D              S )Nc              3   @   K   | ]  }|j                          y wrF   )match).0accepted_type
media_types     r%   	<genexpr>z&HttpRequest.accepts.<locals>.<genexpr>`   s!      
ATM
+ATs   )anyrM   )r;   rS   s    `r%   acceptszHttpRequest.accepts_   s#     
AEATAT
 
 	
r$   c                     t        |j                  dd            \  | _        | _        d| j                  v r8	 t	        j
                  | j                  d          | j                  d   | _        yy# t        $ r Y yw xY w)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_paramsd   s~    1HHH^R(2
.4. +++?d11)<= !% 3 3I > ,  s   "A0 0	A<;A<c                    t         j                  rd| j                  v r| j                  d   }|S d| j                  v r| j                  d   }|S | j                  d   }| j                         }|| j	                         rdndk7  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_hostq   s     ((.E.R9945D  DII%99[)D 	 99]+D--/K(8udC"&4r$   c                     | j                         }t        j                  }t        j                  r|sg d}t	        |      \  }}|rt        ||      r|S d|z  }|r|d|z  z  }t        |      |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    !!# !..>>-@M(.mFM:K1D8CBVKK
 !%% X !%%r$   c                     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.HTTP_X_FORWARDED_PORTSERVER_PORT)r
   USE_X_FORWARDED_PORTr2   str)r;   rt   s     r%   rh   zHttpRequest.get_port   sL    ((-D		-Q9945D 4y 99]+D4yr$   c                 :    | j                  | j                  |      S rF   )_get_full_pathr4   r;   force_append_slashs     r%   rB   zHttpRequest.get_full_path   s    ""499.@AAr$   c                 :    | j                  | j                  |      S rF   )r}   r5   r~   s     r%   get_full_path_infozHttpRequest.get_full_path_info   s    ""4>>3EFFr$   c           	          t        |      |r|j                  d      sdnd| j                  j                  dd      r*dt	        | j                  j                  dd            z   S dS )N/r-   QUERY_STRING?)r   endswithr2   rL   r   )r;   r4   r   s      r%   r}   zHttpRequest._get_full_path   sv     D!%dmmC.@CbH 99==4 z$))--"CDD 	
 	
 	
 	
r$   r-   c                     	 | j                   |   }	 t        j                  ||z         j                  ||      }|S # t        $ r |t        ur|cY S  w xY w# t        j                  $ r |t        ur|cY S  w xY w)z
        Attempt to return a signed cookie. If the signature fails or the
        cookie has expired, raise an exception, unless the `default` argument
        is provided,  in which case return that value.
        )salt)max_age)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    	<<,L	--3:>EEg F E   	k)		 ## 	k)		s    > *A AAA97A9c                    |d| j                         z  }nt        |      }t        |      }|j                  r|j                  s|j
                  j                  d      r]|j                  sQ|j                  sEd|j
                  vr7d|j
                  vr)| j                  |j                  d      z   }t        |      S 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.
        z//%sr   z/./z/../z//)rB   r{   r	   schemenetlocr4   
startswith_current_scheme_hostremoveprefixr   r   )r;   locationbitss      r%   build_absolute_urizHttpRequest.build_absolute_uri   s       2 2 44H 8}H!
 		$$S)*$))+
  44x7L7LT7RR (## #4#<#<tyy#H(S(##r$   c                 V    dj                  | j                  | j                               S )Nz{}://{})formatr   rv   r:   s    r%   r   z HttpRequest._current_scheme_host   s    T]]_==r$   c                      y)zf
        Hook for subclasses like WSGIRequest to implement. Return 'http' by
        default.
        httpr#   r:   s    r%   _get_schemezHttpRequest._get_scheme   s    
 r$   c                 *   t         j                  r\	 t         j                  \  }}| j                  j                  |      }|+|j                  dd      ^}}|j                         |k(  rdS dS | j                         S # t        $ r t        d      w xY w)NzJThe SECURE_PROXY_SSL_HEADER setting must be a tuple containing two values.,   httpsr   )	r
   SECURE_PROXY_SSL_HEADER
ValueErrorr   r2   rL   splitstripr   )r;   headersecure_valueheader_value_s        r%   r   zHttpRequest.scheme   s    ++'/'G'G$  99==0L'#/#5#5c1#= q"."4"4"6,"FwRFR!!  *" s   A= =B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                 L    || _         t        | d      r| `t        | d      r| `yy)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  s.     44!
 "r$   c                 |    t         j                  D cg c]  }t        j                  ||        c}| _        y c c}w rF   )r
   FILE_UPLOAD_HANDLERSr   load_handler_upload_handlers)r;   handlers     r%   _initialize_handlersz HttpRequest._initialize_handlers"  s<     $88!
8 &&w58!
 !
s   9c                 R    | j                   s| j                          | j                   S rF   )r   r   r:   s    r%   upload_handlerszHttpRequest.upload_handlers(  s#    $$%%'$$$r$   c                 @    t        | d      rt        d      || _        y )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                        }|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_upload8  sE    ,   
 !y$2F2FV||~r$   c                 $   t        | d      s| j                  rt        d      t        j                  Dt        | j                  j                  d      xs d      t        j                  kD  rt        d      	 | j                         | _
        	 | j                  j                          t!        | j                        | _        | j                  S # t        $ r}t        |j                   |d }~ww xY w# | j                  j                          w xY w)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   args_streamcloser   )r;   es     r%   bodyzHttpRequest.bodyD  s    tW%!!*U  44@		&67<1=667 (Q %!YY[
 ""$"4::.DLzz  :)16629: ""$s$   9C 	C0C++C00C3 3Dc                 @    t               | _        t               | _        y rF   )r.   r   r   r   r:   s    r%   _mark_post_parse_errorz"HttpRequest._mark_post_parse_error_  s    [
$&r$   c                    | j                   dk7  r,t        | j                        t               c| _        | _        y| j                  rt        | d      s| j                          y| j                  dk(  rOt        | d      rt        | j                        }n| }	 | j                  | j                  |      \  | _        | _        y| j                  dk(  r`| j                  (| j                  j!                         dk7  rt#        d      t        | j$                  d      | _        t               | _        yt        | j                        t               c| _        | _        y# t        t        f$ r | j                           w xY w)	zFPopulate self._post and self._files if the content-type is a form typer0   )r\   Nr   zmultipart/form-dataz!application/x-www-form-urlencodedzutf-8z^HTTP requests with the 'application/x-www-form-urlencoded' content type must be UTF-8 encoded.)r6   r.   r   r   r   r   r   r   r   r8   r   r   r   r2   r   r   lowerr   r   )r;   datas     r%   _load_post_and_filesz HttpRequest._load_post_and_filesc  sM   ;;& 4>>2  $DJ gdG&<'') 55tW%tzz**.*@*@D*Q'
DK "EE ~~)dnn.B.B.D.O :  #499w?DJ(*DK 4>>2  $DJ' )*:; 
 ++-s   )E !E?c                     t        | d      rJt        j                  d | j                  j	                         D              D ]  }|j                           y y )Nr   c              3   &   K   | ]	  }|d      yw)r   Nr#   )rQ   list_s     r%   rT   z$HttpRequest.close.<locals>.<genexpr>  s     (S?Req?Rs   )r   r   from_iterabler   listsr   )r;   fs     r%   r   zHttpRequest.close  sC    4"(((St{{?P?P?R(SS	 T #r$   c                     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  sL    !	6$4<<$$d5f55 	6%qvv.A5	6   % 	AAAc                     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  sL    !	6(4<<(($9&99 	6%qvv.A5	6r   c                 .    t        | j                  d      S )Nr$   )iterr   r:   s    r%   __iter__zHttpRequest.__iter__  s    DMM3''r$   c                     t        |       S rF   )listr:   s    r%   	readlineszHttpRequest.readlines  s    Dz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*   4   sR    I#$
 & & F F

?$&,BG
 .9r4 0%$N > > " "&   __
 

 % % 0 0
  4'*X66(r$   r*   c                        e Zd ZdZddhZ fdZ fdZed        Zed        Z	ed        Z
ed	        Zed
        Z xZS )rG   HTTP_rX   r   c                     i }|j                         D ]  \  }}| j                  |      }|s|||<     t        |   |       y rF   )itemsparse_header_namesuperr<   )r;   environrH   r   r   namerC   s         r%   r<   zHttpHeaders.__init__  sG    $]]_MFE))&1D % - 	!r$   c                 B    t         |   |j                  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    w"3;;sC#899r$   c                     |j                  | j                        r|j                  | j                        }n|| j                  vry |j	                  dd      j                         S )Nr   r   )r   HTTP_PREFIXr   UNPREFIXED_HEADERSr   titleclsr   s     r%   r   zHttpHeaders.parse_header_name  sS    S__-((9F3111~~c3'--//r$   c                     |j                  dd      j                         }|| j                  v r|S | j                   | S Nr   r   )r   upperr   r   r   s     r%   to_wsgi_namezHttpHeaders.to_wsgi_name  sB    S)//1S+++M//"6(++r$   c                 B    |j                  dd      j                         S r  )r   r  r   s     r%   to_asgi_namezHttpHeaders.to_asgi_name  s    ~~c3'--//r$   c                 t    |j                         D ci c]  \  }}| j                  |      | c}}S c c}}w rF   )r   r  r  rH   header_namer   s       r%   to_wsgi_nameszHttpHeaders.to_wsgi_names  D     '.mmo
&5"U [)50&5
 	
 
   4c                 t    |j                         D ci c]  \  }}| j                  |      | c}}S c c}}w rF   )r   r  r	  s       r%   to_asgi_nameszHttpHeaders.to_asgi_names  r  r  )r    r!   r"   r   r   r<   r   classmethodr   r  r  r  r  __classcell__rC   s   @r%   rG   rG     s    K(*:;": 0 0 , , 0 0 
 
 
 
r$   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.
    TNc                    t         |           |xs t        j                  | _        |xs d}d| j                  t        j
                  d}t        |t              r	 |j                  | j                        }	 t        |fi |D ]  \  }}| j                  ||        	 || _        y # t        $ r |j                  d      }Y Lw xY w# t        $ r}t        d      |d }~ww xY w)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__  s     <H$<$<#)r!%&DD

 lE*A+224==A	'I8HI
UU+ J   & A+22<@A  	
 $: 	s*   B) :&C	 )CC		C#CC#c                 `     | dd|      }|D ]  }|j                  ||        |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  s9     D84CLLe$ AJr$   c                 \    | j                   t        j                  | _         | j                   S rF   )r   r
   r  r:   s    r%   r\   zQueryDict.encoding#  s#    >>!%55DN~~r$   c                     || _         y rF   r   )r;   r   s     r%   r\   zQueryDict.encoding)  s	    r$   c                 2    | j                   st        d      y )Nz$This QueryDict instance is immutable)r  r   r:   s    r%   _assert_mutablezQueryDict._assert_mutable-  s    }} !GHH r$   c                     | j                          t        || j                        }t        || j                        }t        |   ||       y rF   )r)  bytes_to_textr\   r   __setitem__r;   r   r   rC   s      r%   r,  zQueryDict.__setitem__1  s>    C/eT]]3C'r$   c                 D    | j                          t        | 	  |       y rF   )r)  r   __delitem__r   s     r%   r/  zQueryDict.__delitem__7  s    C r$   c                     | j                  dd| j                        }| j                         D ]  \  }}|j                  ||        |S Nr-   Tr"  )rC   r\   r   setlist)r;   resultr   r   s       r%   __copy__zQueryDict.__copy__;  sA    D4==I**,JCNN3& 'r$   c                    | j                  dd| j                        }||t        |       <   | j                         D ]?  \  }}|j	                  t        j                  ||      t        j                  ||             A |S r1  )rC   r\   idr   r2  copydeepcopy)r;   memor3  r   r   s        r%   __deepcopy__zQueryDict.__deepcopy__A  sd    D4==IRX**,JCNN4==d3T]]5$5OP 'r$   c                     | j                          t        || j                        }|D cg c]  }t        || j                         }}t        |   ||       y c c}w rF   )r)  r+  r\   r   r2  )r;   r   r   eltrC   s       r%   r2  zQueryDict.setlistH  sR    C/>CDessDMM2eDU# Es   Ac                 D    | j                          t        | 	  ||      S rF   )r)  r   setlistdefault)r;   r   default_listrC   s      r%   r>  zQueryDict.setlistdefaultN  s!    w%c<88r$   c                     | j                          t        || j                        }t        || j                        }t        |   ||       y rF   )r)  r+  r\   r   r  r-  s      r%   r  zQueryDict.appendlistR  s>    C/eT]]33&r$   c                 D    | j                          t        |   |g| S rF   )r)  r   pop)r;   r   r   rC   s      r%   rB  zQueryDict.popX  s#    w{3&&&r$   c                 @    | j                          t        | 	         S rF   )r)  r   popitemr;   rC   s    r%   rD  zQueryDict.popitem\  s    w  r$   c                 B    | j                          t        | 	          y rF   )r)  r   clearrE  s    r%   rG  zQueryDict.clear`  s    r$   c                     | j                          t        || j                        }t        || j                        }t        |   ||      S rF   )r)  r+  r\   r   
setdefault)r;   r   r   rC   s      r%   rI  zQueryDict.setdefaultd  sA    C/7w!#w//r$   c                 $    | j                  i       S )z%Return a mutable copy of this object.)r:  r:   s    r%   r7  zQueryDict.copyj  s      $$r$   c                      g }r!j                   j                        fdnd  j                         D ]!  \  }|j                   fd|D               # dj	                  |      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                 :    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   )rN  rO  s     r%   rQ  z#QueryDict.urlencode.<locals>.encode  s     !Q((r$   c              3      K   | ]H  } j                  j                        t        |      j                  j                               J y wrF   )rQ  r\   r{   )rQ   rO  rQ  rN  r;   s     r%   rT   z&QueryDict.urlencode.<locals>.<genexpr>  s>      A qxx.Admm0LMs   AA&)rQ  r\   r   extendjoin)r;   rP  outputr   rQ  rN  s   ``  @@r%   r   zQueryDict.urlencoden  sj     ;;t}}-DD
) 

HAuMM   %
 xxr$   )NFN)r-   FNrF   )r    r!   r"   r(   r  r   r<   r  r%  r   r\   r   r)  r,  r/  r4  r:  r2  r>  r  rB  rD  rG  rI  r7  r   r  r  s   @r%   r.   r.     s      HI < 
 
  
 __ I(!$9''!0% r$   r.   c                   4    e Zd Zd Zd Zd Zed        Zd Zy)	MediaTypec                 p    t        |r|nd      \  }| _        |j                  d      \  | _        }| _        y )Nr-   r   )r   params	partition	main_typesub_type)r;   media_type_raw_line	full_typer   s       r%   r<   zMediaType.__init__  s8    !8#6B"
	4; ,5+>+>s+C(4=r$   c                     dj                  d | j                  j                         D              }| j                  | j                  rd| j                  z  nd|S )Nr-   c              3   2   K   | ]  \  }}d |d|  yw)z; rM  Nr#   )rQ   rN  rO  s      r%   rT   z$MediaType.__str__.<locals>.<genexpr>  s     P<ODAq!Q/<Os   z/%s)rV  r[  r   r]  r^  )r;   
params_strs     r%   __str__zMediaType.__str__  sN    WWPDKK<M<M<OPP
NN'+}}UT]]""<
 	
r$   c                 <    d| j                   j                  d| dS )Nr>   r?   rA   )rC   r"   r:   s    r%   rD   zMediaType.__repr__  s    !^^88$??r$   c                 B    | j                   dk(  xr | j                  dk(  S )N*)r]  r^  r:   s    r%   is_all_typeszMediaType.is_all_types  s    ~~$=#)==r$   c                     | j                   ryt        |      }| j                  |j                  k(  r| j                  d|j                  hv ryy)NTrg  F)rh  rY  r]  r^  )r;   others     r%   rP   zMediaType.match  sB    % >>U__,3BW1Wr$   N)	r    r!   r"   r<   rd  rD   r   rh  rP   r#   r$   r%   rY  rY    s,    D
@ > >r$   rY  c                 @    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         j                  | j                               x}r(|j                  d      \  }}|j	                  d      |fS y)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-   )host_validation_re	fullmatchr   groupsremovesuffix)rj   rP   rs   rt   s       r%   rp   rp     sM     #,,TZZ\::u:||B|/""3'--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(  xs t        |        yw)rg  N)r   )rQ   patternrj   s     r%   rT   z validate_host.<locals>.<genexpr>  s(      GTG37.w77}s    )rU   )rj   rr   s   ` r%   rq   rq     s      GT  r$   c                 ~    | j                  d      D cg c]  }|j                         st        |        c}S c c}w )Nr   )r   r   rY  )r   tokens     r%   rK   rK     s2    *0,,s*;M*;u{{}Ie*;MMMs   ::)9rZ   r7  ior   	itertoolsr   urllib.parser   r   r   r   r	   django.confr
   django.corer   django.core.exceptionsr   r   r   r   r   django.core.filesr   django.http.multipartparserr   r   r   django.utils.datastructuresr   r   r   django.utils.encodingr   r   django.utils.functionalr   django.utils.httpr   r   django.utils.regex_helperr   objectr   ro  r   r   	Exceptionr'   r*   rG   r.   rY  r+  rp   rq   rK   r#   r$   r%   <module>r     s        G G     , 
 
 > 3 E 6h%> 
	' 		9 	z zz0
( 0
fh  h V D(Nr$   