File: //opt/alt/python27/lib/python2.7/site-packages/paste/lint.pyo
�
a�Nc           @   sd  d  Z  d d l Z d d l Z d d l m Z m Z m Z m Z d d l Z e j	 d � Z
 e j	 d � Z d e f d �  �  YZ
 d d � Z d	 e f d
 �  �  YZ d e f d �  �  YZ d
 e f d �  �  YZ d e f d �  �  YZ d e f d �  �  YZ d �  Z d �  Z d �  Z d �  Z d �  Z d �  Z d �  Z d �  Z d �  Z e  e _  d d g Z d S(   s"  
Middleware to check for obedience to the WSGI specification.
Some of the things this checks:
* Signature of the application and start_response (including that
  keyword arguments are not used).
* Environment checks:
  - Environment is a dictionary (and not a subclass).
  - That all the required keys are in the environment: REQUEST_METHOD,
    SERVER_NAME, SERVER_PORT, wsgi.version, wsgi.input, wsgi.errors,
    wsgi.multithread, wsgi.multiprocess, wsgi.run_once
  - That HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH are not in the
    environment (these headers should appear as CONTENT_LENGTH and
    CONTENT_TYPE).
  - Warns if QUERY_STRING is missing, as the cgi module acts
    unpredictably in that case.
  - That CGI-style variables (that don't contain a .) have
    (non-unicode) string values
  - That wsgi.version is a tuple
  - That wsgi.url_scheme is 'http' or 'https' (@@: is this too
    restrictive?)
  - Warns if the REQUEST_METHOD is not known (@@: probably too
    restrictive).
  - That SCRIPT_NAME and PATH_INFO are empty or start with /
  - That at least one of SCRIPT_NAME or PATH_INFO are set.
  - That CONTENT_LENGTH is a positive integer.
  - That SCRIPT_NAME is not '/' (it should be '', and PATH_INFO should
    be '/').
  - That wsgi.input has the methods read, readline, readlines, and
    __iter__
  - That wsgi.errors has the methods flush, write, writelines
* The status is a string, contains a space, starts with an integer,
  and that integer is in range (> 100).
* That the headers is a list (not a subclass, not another kind of
  sequence).
* That the items of the headers are tuples of strings.
* That there is no 'status' header (that is used in CGI, but not in
  WSGI).
* That the headers don't contain newlines or colons, end in _ or -, or
  contain characters codes below 037.
* That Content-Type is given if there is content (CGI often has a
  default content type, but WSGI does not).
* That no Content-Type is given when there is no content (@@: is this
  too restrictive?)
* That the exc_info argument to start_response is a tuple or None.
* That all calls to the writer are with strings, and no other methods
  on the writer are accessed.
* That wsgi.input is used properly:
  - .read() is called with zero or one argument
  - That it returns a string
  - That readline, readlines, and __iter__ return strings
  - That .close() is not called
  - No other methods are provided
* That wsgi.errors is used properly:
  - .write() and .writelines() is called with a string
  - That .close() is not called, and no other methods are provided.
* The response iterator:
  - That it is not a string (it should be a list of a single string; a
    string will work, but perform horribly).
  - That .next() returns a string
  - That the iterator is not iterated over until start_response has
    been called (that can signal either a server or application
    error).
  - That .close() is called (doesn't raise exception, only prints to
    sys.stderr, because we only know it isn't called when the object
    is garbage collected).
i����N(   t   DictTypet
   StringTypet	   TupleTypet   ListTypes   ^[a-zA-Z][a-zA-Z0-9\-_]*$s   [\000-\037]t   WSGIWarningc           B   s   e  Z d  Z RS(   s:   
    Raised in response to WSGI-spec-related warnings
    (   t   __name__t
   __module__t   __doc__(    (    (    s;   /opt/alt/python27/lib/python2.7/site-packages/paste/lint.pyR   x   s   c            s   �  f d �  } | S(   s�  
    When applied between a WSGI server and a WSGI application, this
    middleware will check for WSGI compliancy on a number of levels.
    This middleware does not modify the request or response in any
    way, but will throw an AssertionError if anything seems off
    (except for a failure to close the application iterator, which
    will be printed to stderr -- there's no way to throw an exception
    at that point).
    c             s|   |  \ } �  t  | � g  � �  � f d �  } t | d � | d <t | d � | d <� | | � } t | � t | � � S(   Nc             s�   |  d } |  d } t  |  � d k r3 |  d } n d  } t | � t | � t | | � t | � � j d  � t �  |  �  � S(   Ni    i   i   i   (   t   lent   Nonet   check_statust
   check_headerst   check_content_typet   check_exc_infot   appendt   WriteWrapper(   t   argst   kwt   statust   headerst   exc_info(   t   start_responset   start_response_started(    s;   /opt/alt/python27/lib/python2.7/site-packages/paste/lint.pyt   start_response_wrapper�   s    
s
   wsgi.inputs   wsgi.errors(   t
   check_environt   InputWrappert   ErrorWrappert   check_iteratort   IteratorWrapper(   R   R   t   environR   t   iterator(   t   application(   R   R   s;   /opt/alt/python27/lib/python2.7/site-packages/paste/lint.pyt   lint_app�   s    
(    (   R   t   global_confR    (    (   R   s;   /opt/alt/python27/lib/python2.7/site-packages/paste/lint.pyt
   middleware}   s    )R   c           B   s>