

_V                 @   s   d  d l  Z  d  d l Z d  d l m Z d  d l 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 d  d	 l m Z d  d
 l m Z e  j d  Z Gd d   d e  Z Gd d   d e  Z d S)    N)http)settings)urlresolvers)PermissionDenied)mail_managers)get_conditional_responseset_response_etag)
force_text)unquote_etag)urlparsezdjango.requestc               @   sO   e  Z d  Z d Z e j Z d d   Z d d   Z d d   Z	 d d	   Z
 d
 S)CommonMiddlewarea  
    "Common" middleware for taking care of some basic operations:

        - Forbids access to User-Agents in settings.DISALLOWED_USER_AGENTS

        - URL rewriting: Based on the APPEND_SLASH and PREPEND_WWW settings,
          this middleware appends missing slashes and/or prepends missing
          "www."s.

            - If APPEND_SLASH is set and the initial URL doesn't end with a
              slash, and it is not found in urlpatterns, a new URL is formed by
              appending a slash at the end. If this new URL is found in
              urlpatterns, then an HTTP-redirect is returned to this new URL;
              otherwise the initial URL is processed as usual.

          This behavior can be customized by subclassing CommonMiddleware and
          overriding the response_redirect_class attribute.

        - ETags: If the USE_ETAGS setting is set, ETags will be calculated from
          the entire page content and Not Modified responses will be returned
          appropriately.
    c             C   s   d | j  k rK x9 t j D]+ } | j | j  d  r t d   q q Wn  | j   } t j r | r | j d  r d | } |  j |  r |  j	 |  } n | j
   } |  j d | j | | f  Sd S)z
        Check for denied User-Agents and rewrite the URL based on
        settings.APPEND_SLASH and settings.PREPEND_WWW
        HTTP_USER_AGENTzForbidden user agentzwww.z	%s://%s%sN)METAr   ZDISALLOWED_USER_AGENTSsearchr   get_hostZPREPEND_WWW
startswithshould_redirect_with_slashget_full_path_with_slashget_full_pathresponse_redirect_classscheme)selfrequestZuser_agent_regexhostpath r   :/tmp/pip-build-ghmbqnp_/Django/django/middleware/common.pyprocess_request+   s    
z CommonMiddleware.process_requestc             C   sb   t  j r^ | j   j d  r^ t | d d  } t j | j |  o] t j d | j |  Sd S)z
        Return True if settings.APPEND_SLASH is True and appending a slash to
        the request path turns an invalid path into a valid one.
        /urlconfNz%s/F)r   ZAPPEND_SLASHr   endswithgetattrr   Zis_valid_pathZ	path_info)r   r   r   r   r   r   r   F   s
    z+CommonMiddleware.should_redirect_with_slashc             C   s\   | j  d d  } t j rX | j d	 k rX t d i | j d 6| j   | d 6  n  | S)
z
        Return the full path of the request with a trailing slash appended.

        Raise a RuntimeError if settings.DEBUG is True and request.method is
        GET, PUT, or PATCH.
        Zforce_append_slashTPOSTPUTPATCHa"  You called this URL via %(method)s, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining %(method)s data. Change your form to point to %(url)s (note the trailing slash), or set APPEND_SLASH=False in your Django settings.methodurl)zPOSTzPUTzPATCH)r   r   DEBUGr%   RuntimeErrorr   )r   r   new_pathr   r   r   r   S   s    
z)CommonMiddleware.get_full_path_with_slashc             C   s   | j  d k r7 |  j |  r7 |  j |  j |   Sn  t j r | j d  s\ t |  n  | j d  r t | d t	 | d  d | Sn  | S)z
        Calculate the ETag, if needed.

        When the status code of the response is 404, it may redirect to a path
        with an appended slash if should_redirect_with_slash() returns True.
        i  ETagetagresponse)
status_coder   r   r   r   Z	USE_ETAGS
has_headerr   r   r
   )r   r   r,   r   r   r   process_responseh   s    		
z!CommonMiddleware.process_responseN)__name__
__module____qualname____doc__r   ZHttpResponsePermanentRedirectr   r   r   r   r/   r   r   r   r   r      s   	r   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)BrokenLinkEmailsMiddlewarec             C   s   | j  d k r t j r | j   } | j   } t | j j d d  d d } |  j | | | |  s t | j j d d  d d } | j j d d  } t	 d	 |  j
 | |  r d
 n d | f d | | | | f d d q n  | S)zO
        Send broken link emails for relevant 404 NOT FOUND responses.
        i  ZHTTP_REFERER errorsreplacer   z<none>ZREMOTE_ADDRzBroken %slink on %sz	INTERNAL z=Referrer: %s
Requested URL: %s
User agent: %s
IP address: %s
Zfail_silentlyT)r-   r   r'   r   r   r	   r   getis_ignorable_requestr   is_internal_request)r   r   r,   domainr   refererZuaipr   r   r   r/      s    !!z+BrokenLinkEmailsMiddleware.process_responsec             C   s#   t  t j d t j |  |   S)z^
        Returns True if the referring URL is the same domain as the current request.
        z^https?://%s/)boolrematchescape)r   r;   r<   r   r   r   r:      s    z.BrokenLinkEmailsMiddleware.is_internal_requestc                s   | s
 d S|  j  | |  r- d | k r- d St |  } | j d | g k ra | j   k ra d St   f d d   t j D  S)a  
        Return True if the given request *shouldn't* notify the site managers
        according to project settings or in three specific situations:
         - If the referer is empty.
         - If a '?' in referer is identified as a search engine source.
         - If the referer is equal to the current URL, ignoring the scheme
           (assumed to be a poorly implemented bot).
        T?r5   c             3   s   |  ] } | j     Vq d  S)N)r   ).0pattern)urir   r   	<genexpr>   s    zBBrokenLinkEmailsMiddleware.is_ignorable_request.<locals>.<genexpr>)r:   r   netlocr   anyr   ZIGNORABLE_404_URLS)r   r   rE   r;   r<   Zparsed_refererr   )rE   r   r9      s    	$z/BrokenLinkEmailsMiddleware.is_ignorable_requestN)r0   r1   r2   r/   r:   r9   r   r   r   r   r4      s   r4   )loggingr?   Zdjangor   Zdjango.confr   Zdjango.corer   Zdjango.core.exceptionsr   Zdjango.core.mailr   Zdjango.utils.cacher   r   Zdjango.utils.encodingr	   Zdjango.utils.httpr
   Z#django.utils.six.moves.urllib.parser   	getLoggerloggerobjectr   r4   r   r   r   r   <module>   s   r