
 XF                 @   s  d  d l  m Z d  d l Z d  d l Z 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 d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z m Z d  d
 l m Z m Z m Z m Z d  d l m Z d  d l m Z d  d l  m! Z! d  d l" m# Z# e j$ d e j%  Z& Gd d   d e'  Z( Gd d   d e j)  Z* Gd d   d e*  Z+ Gd d   d e*  Z, Gd d   d e,  Z- Gd d   d e+  Z. Gd d   d e.  Z/ Gd d   d e.  Z0 Gd  d!   d! e+  Z1 Gd" d#   d# e+  Z2 Gd$ d%   d% e+  Z3 Gd& d'   d' e+  Z4 Gd( d)   d) e+  Z5 Gd* d+   d+ e+  Z6 Gd, d-   d- e+  Z7 Gd. d/   d/ e8  Z9 Gd0 d1   d1 e+  Z: d S)2    )unicode_literalsN)Header)settings)signalssigning)DisallowedRedirect)DjangoJSONEncoder)SimpleCookie)sixtimezone)force_bytes	force_str
force_text
iri_to_uri)cookie_date)map)	responses)urlparsez ;\s*charset=(?P<charset>[^\s;]+)c               @   s   e  Z d  Z d S)BadHeaderErrorN)__name__
__module____qualname__ r   r   B/home/ubuntu/projects/ifolica/build/django/django/http/response.pyr      s   r   c            	   @   s  e  Z d  Z d Z d Z d d d d d d  Z e d d    Z e j d d    Z e d	 d
    Z	 e	 j d d
    Z	 d d   Z
 e j r e
 Z n e
 Z d d d  Z d d   Z d d   Z d d   Z d d   Z e Z d d   Z d d d  Z d d d d d d d d d   Z d! d"   Z d d# d$  Z d d d% d&  Z d' d(   Z d) d*   Z d+ d,   Z d- d.   Z d/ d0   Z d1 d2   Z  d3 d4   Z! d5 d6   Z" d7 d8   Z# d S)9HttpResponseBasez
    An HTTP response base class with dictionary-accessed headers.

    This class doesn't handle content. It should not be used directly.
    Use the HttpResponse and StreamingHttpResponse subclasses instead.
       Nc             C   s   i  |  _  g  |  _ d  |  _ t   |  _ d |  _ | d  k	 rH | |  _ n  | |  _ | |  _ | d  k r d t	 j
 |  j f } n  | |  d <d  S)NFz%s; charset=%szContent-Type)_headers_closable_objects_handler_classr	   cookiesclosedstatus_code_reason_phrase_charsetr   ZDEFAULT_CONTENT_TYPEcharset)selfcontent_typestatusreasonr$   r   r   r   __init__)   s    							zHttpResponseBase.__init__c             C   s)   |  j  d  k	 r |  j  St j |  j d  S)NzUnknown Status Code)r"   r   getr!   )r%   r   r   r   reason_phrase=   s    zHttpResponseBase.reason_phrasec             C   s   | |  _  d  S)N)r"   )r%   valuer   r   r   r+   E   s    c             C   s]   |  j  d  k	 r |  j  S|  j d d  } t j |  } | rV | j d  j d d  St j S)NzContent-Type r$   ")r#   r*   _charset_from_content_type_researchgroupreplacer   DEFAULT_CHARSET)r%   r&   matchedr   r   r   r$   I   s    zHttpResponseBase.charsetc             C   s   | |  _  d  S)N)r#   )r%   r,   r   r   r   r$   T   s    c                s;   d d       f d d   |  j  j   D } d j |  S)zHTTP headers as a bytestring.c             S   s    t  |  t  r |  S|  j |  S)N)
isinstancebytesencode)valencodingr   r   r   to_bytesZ   s    z4HttpResponseBase.serialize_headers.<locals>.to_bytesc                s=   g  |  ]3 \ } } d  j    | d    | d  g   q S)s   : asciizlatin-1)join).0keyr,   )r:   r   r   
<listcomp>^   s   	z6HttpResponseBase.serialize_headers.<locals>.<listcomp>s   
)r   valuesr<   )r%   headersr   )r:   r   serialize_headersX   s    z"HttpResponseBase.serialize_headersFc             C   sf  t  | t t j f  s' t |  } n  t  | t  rN d | k sx d | k sx t  | t j  r d | k sx d | k r t d |   n  yl t j r t  | t  r | j |  q | j |  } n. t  | t  r | j |  n | j |  } Wnh t	 k
 ra} zH | r9t t
 | d d t j j    } n | j d | 7_   WYd	 d	 } ~ Xn X| S)
zConverts headers key/value to ascii/latin-1 native strings.

        `charset` must be 'ascii' or 'latin-1'. If `mime_encode` is True and
        `value` can't be represented in the given charset, MIME-encoding
        is applied.
        s   
s   
z-Header values can't contain newlines (got %r)zutf-8
maxlinelenz,, HTTP response headers must be in %s formatN)r5   r6   r
   	text_typestrr   PY3r7   decodeUnicodeErrorr   sysmaxsizer(   )r%   r,   r$   mime_encodeer   r   r   _convert_to_charseth   s&    '*	'z$HttpResponseBase._convert_to_charsetc             C   sG   |  j  | d  } |  j  | d d d } | | f |  j | j   <d  S)Nr;   zlatin-1rM   T)rO   r   lower)r%   headerr,   r   r   r   __setitem__   s    zHttpResponseBase.__setitem__c             C   s-   y |  j  | j   =Wn t k
 r( Yn Xd  S)N)r   rP   KeyError)r%   rQ   r   r   r   __delitem__   s    zHttpResponseBase.__delitem__c             C   s   |  j  | j   d S)N   )r   rP   )r%   rQ   r   r   r   __getitem__   s    zHttpResponseBase.__getitem__c             C   s   | j    |  j k S)z$Case-insensitive check for a header.)rP   r   )r%   rQ   r   r   r   
has_header   s    zHttpResponseBase.has_headerc             C   s   |  j  j   S)N)r   r@   )r%   r   r   r   items   s    zHttpResponseBase.itemsc             C   s#   |  j  j | j   d  | f  d S)NrU   )r   r*   rP   )r%   rQ   Z	alternater   r   r   r*      s    zHttpResponseBase.getr-   /c	       
      C   s  t  |  } | |  j | <| d k	 r t | t j  r t j |  r^ t j | t j  } n  | | j   }	 |	 t j	 d d  }	 d } t
 d |	 j d |	 j  } q | |  j | d <n d |  j | d <| d k	 r| |  j | d <| st t j   |  |  j | d <qn  | d k	 r9| |  j | d	 <n  | d k	 rY| |  j | d
 <n  | rsd |  j | d <n  | rd |  j | d <n  d S)a5  
        Sets a cookie.

        ``expires`` can be:
        - a string in the correct format,
        - a naive ``datetime.datetime`` object in UTC,
        - an aware ``datetime.datetime`` object in any time zone.
        If it is a ``datetime.datetime`` object then ``max_age`` will be calculated.
        NsecondsrU   r   iQ expiresr-   zmax-agepathdomainTsecurehttponly)r   r   r5   datetimer   Zis_awareZ
make_naiveutcutcnow	timedeltamaxdaysrZ   r   time)
r%   r>   r,   max_ager[   r\   r]   r^   r_   deltar   r   r   
set_cookie   s2     zHttpResponseBase.set_cookiec             C   s   | |  k r | |  | <n  d S)z-Sets a header unless it has already been set.Nr   )r%   r>   r,   r   r   r   
setdefault   s    zHttpResponseBase.setdefaultc             K   s2   t  j d | |  j |  } |  j | | |  S)Nsalt)r   Zget_cookie_signersignri   )r%   r>   r,   rk   kwargsr   r   r   set_signed_cookie   s    z"HttpResponseBase.set_signed_cookiec          
   C   s)   |  j  | d d d | d | d d d  S)Nrg   r   r\   r]   r[   zThu, 01-Jan-1970 00:00:00 GMT)ri   )r%   r>   r\   r]   r   r   r   delete_cookie   s    zHttpResponseBase.delete_cookiec             C   sQ   t  | t  r t |  St  | t j  rA t | j |  j   St | |  j  S)z=Turn a value into a bytestring encoded in the output charset.)r5   r6   r
   rF   r7   r$   r   )r%   r,   r   r   r   
make_bytes   s
    	
zHttpResponseBase.make_bytesc             C   sZ   x4 |  j  D]) } y | j   Wq
 t k
 r2 Yq
 Xq
 Wd |  _ t j j d |  j  d  S)NTZsender)r   close	Exceptionr    r   Zrequest_finishedsendr   )r%   Zclosabler   r   r   rq      s    		zHttpResponseBase.closec             C   s   t  d |  j j   d  S)Nz This %s instance is not writable)IOError	__class__r   )r%   contentr   r   r   write   s    zHttpResponseBase.writec             C   s   d  S)Nr   )r%   r   r   r   flush  s    zHttpResponseBase.flushc             C   s   t  d |  j j   d  S)Nz)This %s instance cannot tell its position)rt   ru   r   )r%   r   r   r   tell  s    zHttpResponseBase.tellc             C   s   d S)NFr   )r%   r   r   r   readable  s    zHttpResponseBase.readablec             C   s   d S)NFr   )r%   r   r   r   seekable  s    zHttpResponseBase.seekablec             C   s   d S)NFr   )r%   r   r   r   writable  s    zHttpResponseBase.writablec             C   s   t  d |  j j   d  S)Nz This %s instance is not writable)rt   ru   r   )r%   linesr   r   r   
writelines  s    zHttpResponseBase.writelines)$r   r   r   __doc__r!   r)   propertyr+   setterr$   rB   r
   rH   	__bytes____str__rO   rR   rT   rV   rW   __contains__rX   r*   ri   rj   rn   ro   rp   rq   rw   rx   ry   rz   r{   r|   r~   r   r   r   r   r      sB   		$+	r   c                   s   e  Z d  Z d Z d Z d   f d d  Z d d   Z d d	   Z e j	 rW e Z
 n e Z e d
 d    Z e j d d    Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z   S)HttpResponsezw
    An HTTP response class with a string as content.

    This content that can be read, appended to or replaced.
    F    c                s&   t  t |   j | |   | |  _ d  S)N)superr   r)   rv   )r%   rv   argsrm   )ru   r   r   r)   "  s    zHttpResponse.__init__c             C   s*   d i |  j  j d 6|  j d 6|  d d 6S)Nz9<%(cls)s status_code=%(status_code)d, "%(content_type)s">clsr!   zContent-Typer&   )ru   r   r!   )r%   r   r   r   __repr__'  s    
zHttpResponse.__repr__c             C   s   |  j    d |  j S)z6Full HTTP message, including headers, as a bytestring.s   

)rB   rv   )r%   r   r   r   	serialize.  s    zHttpResponse.serializec             C   s   d j  |  j  S)Nr   )r<   
_container)r%   r   r   r   rv   7  s    zHttpResponse.contentc                s   t  | d  r t | t t j f  r d j   f d d   | D  } t  | d  r y | j   Wq t k
 r{ Yq Xq n   j |  } | g   _	 d  S)N__iter__r   c             3   s   |  ] }   j  |  Vq d  S)N)rp   )r=   chunk)r%   r   r   	<genexpr>?  s    z'HttpResponse.content.<locals>.<genexpr>rq   )
hasattrr5   r6   r
   string_typesr<   rq   rr   rp   r   )r%   r,   rv   r   )r%   r   rv   ;  s    ("c             C   s   t  |  j  S)N)iterr   )r%   r   r   r   r   J  s    zHttpResponse.__iter__c             C   s   |  j  j |  j |   d  S)N)r   appendrp   )r%   rv   r   r   r   rw   M  s    zHttpResponse.writec             C   s   t  |  j  S)N)lenrv   )r%   r   r   r   ry   P  s    zHttpResponse.tellc             C   s   |  j  S)N)rv   )r%   r   r   r   getvalueS  s    zHttpResponse.getvaluec             C   s   d S)NTr   )r%   r   r   r   r|   V  s    zHttpResponse.writablec             C   s"   x | D] } |  j  |  q Wd  S)N)rw   )r%   r}   liner   r   r   r~   Y  s    zHttpResponse.writelines)r   r   r   r   	streamingr)   r   r   r
   rH   r   r   r   rv   r   r   rw   ry   r   r|   r~   r   r   )ru   r   r     s    		r   c                   s   e  Z d  Z d Z d Z f    f d d  Z e d d    Z e d d    Z e j	 d	 d    Z d
 d   Z
 d d   Z d d   Z   S)StreamingHttpResponsea$  
    A streaming HTTP response class with an iterator as content.

    This should only be iterated once, when the response is streamed to the
    client. However, it can be appended to or replaced with a new iterator
    that wraps the original content (or yields entirely new content).
    Tc                s&   t  t |   j | |   | |  _ d  S)N)r   r   r)   streaming_content)r%   r   r   rm   )ru   r   r   r)   i  s    zStreamingHttpResponse.__init__c             C   s   t  d |  j j   d  S)NzMThis %s instance has no `content` attribute. Use `streaming_content` instead.)AttributeErrorru   r   )r%   r   r   r   rv   o  s    zStreamingHttpResponse.contentc             C   s   t  |  j |  j  S)N)r   rp   	_iterator)r%   r   r   r   r   v  s    z'StreamingHttpResponse.streaming_contentc             C   s   |  j  |  d  S)N)_set_streaming_content)r%   r,   r   r   r   r   z  s    c             C   s5   t  |  |  _ t | d  r1 |  j j |  n  d  S)Nrq   )r   r   r   r   r   )r%   r,   r   r   r   r   ~  s    z,StreamingHttpResponse._set_streaming_contentc             C   s   |  j  S)N)r   )r%   r   r   r   r     s    zStreamingHttpResponse.__iter__c             C   s   d j  |  j  S)Nr   )r<   r   )r%   r   r   r   r     s    zStreamingHttpResponse.getvalue)r   r   r   r   r   r)   r   rv   r   r   r   r   r   r   r   )ru   r   r   ^  s   r   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)FileResponsez>
    A streaming HTTP response class optimized for files.
    i   c                s   t  | d  ra |  _ |   t    d  r@  j j    n  t    f d d   d  } n	 d   _ t t   j |  d  S)Nreadrq   c                  s     j   j  S)N)r   
block_sizer   )fileliker%   r   r   <lambda>  s    z5FileResponse._set_streaming_content.<locals>.<lambda>r   )r   Zfile_to_streamr   r   r   r   r   r   )r%   r,   )ru   )r   r%   r   r     s    	!	z#FileResponse._set_streaming_content)r   r   r   r   r   r   r   r   )ru   r   r     s   r   c                   sO   e  Z d  Z d d d g Z   f d d   Z e d d    Z d d	   Z   S)
HttpResponseRedirectBasehttphttpsftpc                sp   t  t |   } | j rC | j |  j k rC t d | j   n  t t |   j | |   t |  |  d <d  S)Nz)Unsafe redirect to URL with protocol '%s'Location)	r   r   schemeallowed_schemesr   r   r   r)   r   )r%   Zredirect_tor   rm   parsed)ru   r   r   r)     s
    z!HttpResponseRedirectBase.__init__c             C   s   |  d S)Nr   r   )r%   r   r   r   r     s    z!HttpResponseRedirectBase.<lambda>c             C   s4   d i |  j  j d 6|  j d 6|  d d 6|  j d 6S)NzH<%(cls)s status_code=%(status_code)d, "%(content_type)s", url="%(url)s">r   r!   zContent-Typer&   url)ru   r   r!   r   )r%   r   r   r   r     s
    
z!HttpResponseRedirectBase.__repr__)r   r   r   r   r)   r   r   r   r   r   )ru   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HttpResponseRedirecti.  N)r   r   r   r!   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HttpResponsePermanentRedirecti-  N)r   r   r   r!   r   r   r   r   r     s   r   c                   s@   e  Z d  Z d Z   f d d   Z e j j d d    Z   S)HttpResponseNotModifiedi0  c                s$   t  t |   j | |   |  d =d  S)Nzcontent-type)r   r   r)   )r%   r   rm   )ru   r   r   r)     s    z HttpResponseNotModified.__init__c             C   s"   | r t  d   n  g  |  _ d  S)Nz7You cannot set content to a 304 (Not Modified) response)r   r   )r%   r,   r   r   r   rv     s    zHttpResponseNotModified.content)r   r   r   r!   r)   r   rv   r   r   r   )ru   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HttpResponseBadRequesti  N)r   r   r   r!   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HttpResponseNotFoundi  N)r   r   r   r!   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HttpResponseForbiddeni  N)r   r   r   r!   r   r   r   r   r     s   r   c                   s4   e  Z d  Z d Z   f d d   Z d d   Z   S)HttpResponseNotAllowedi  c                s0   t  t |   j | |   d j |  |  d <d  S)Nz, Allow)r   r   r)   r<   )r%   Zpermitted_methodsr   rm   )ru   r   r   r)     s    zHttpResponseNotAllowed.__init__c             C   s5   d i |  j  j d 6|  j d 6|  d d 6|  d d 6S)NzG<%(cls)s [%(methods)s] status_code=%(status_code)d, "%(content_type)s">r   r!   zContent-Typer&   r   methods)ru   r   r!   )r%   r   r   r   r     s
    
zHttpResponseNotAllowed.__repr__)r   r   r   r!   r)   r   r   r   )ru   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HttpResponseGonei  N)r   r   r   r!   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HttpResponseServerErrori  N)r   r   r   r!   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d S)Http404N)r   r   r   r   r   r   r   r     s   r   c                   s1   e  Z d  Z d Z e d d   f d d  Z   S)JsonResponseaI  
    An HTTP response class that consumes data to be serialized to JSON.

    :param data: Data to be dumped into json. By default only ``dict`` objects
      are allowed to be passed due to a security flaw before EcmaScript 5. See
      the ``safe`` parameter for more information.
    :param encoder: Should be an json encoder class. Defaults to
      ``django.core.serializers.json.DjangoJSONEncoder``.
    :param safe: Controls if only ``dict`` objects may be serialized. Defaults
      to ``True``.
    :param json_dumps_params: A dictionary of kwargs passed to json.dumps().
    TNc                s   | r% t  | t  r% t d   n  | d  k r: i  } n  | j d d  t j | d | | } t t |   j d | |  d  S)NzTIn order to allow non-dict objects to be serialized set the safe parameter to False.r&   zapplication/jsonr   rv   )	r5   dict	TypeErrorrj   jsondumpsr   r   r)   )r%   dataencodersafeZjson_dumps_paramsrm   )ru   r   r   r)     s    	zJsonResponse.__init__)r   r   r   r   r   r)   r   r   )ru   r   r     s   r   );
__future__r   r`   r   rerK   rf   Zemail.headerr   Zdjango.confr   Zdjango.corer   r   Zdjango.core.exceptionsr   Zdjango.core.serializers.jsonr   Zdjango.http.cookier	   Zdjango.utilsr
   r   Zdjango.utils.encodingr   r   r   r   Zdjango.utils.httpr   Zdjango.utils.six.movesr   Z"django.utils.six.moves.http_clientr   Z#django.utils.six.moves.urllib.parser   compileIr/   
ValueErrorr   Iteratorr   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   r   r   r   r   <module>   sF   "E-