
y Xe,                 @   sI  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	 m
 Z
 m Z m Z d  d l m Z m Z m Z m Z m Z m Z m Z m Z d  d l m Z m Z d  d l m Z d  d	 l m Z d
 Z d Z d
 Z e  j d  Z e  j d  Z  e  j d  Z! Gd d   d e"  Z# Gd d   d e#  Z$ d S)    N)ENOTCONN)bytes_to_str)SocketUnreader)ChunkedReaderLengthReader	EOFReaderBody)InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeaders)InvalidProxyLineForbiddenProxyRequest)BytesIO)urlspliti  i   z[ -()<>@,;:\[\]={} 	\\"]z[A-Z0-9$-_.]{3,20}zHTTP/(\d+).(\d+)c               @   sL   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d S)Messagec             C   s   | |  _  | |  _ d  |  _ g  |  _ g  |  _ d  |  _ | j |  _ |  j d k s` |  j t k rl t |  _ n  | j |  _ |  j d k  s |  j t	 k r t	 |  _ n  |  j p t	 } |  j | d d |  _
 |  j |  j  } |  j j |  |  j   d  S)Nr         )cfgunreaderversionheadersZtrailersbodylimit_request_fieldsMAX_HEADERSlimit_request_field_sizeMAX_HEADERFIELD_SIZEmax_buffer_headersparseunreadset_body_reader)selfr   r   Zmax_header_field_sizeunused r'   E/home/ubuntu/projects/ifolica/build/gunicorn/gunicorn/http/message.py__init__   s(    						zMessage.__init__c             C   s   t     d  S)N)NotImplementedError)r%   r'   r'   r(   r"   9   s    zMessage.parsec             C   s  g  } d d   | j  d  D } xt |  rt |  |  j k rU t d   n  | j d  } t |  } | j d  d k  r t | j     n  | j  d d  \ } } | j d  j	   } t
 j |  r t |   n  | j   | j   g } } x t |  r| d j d  r| j d  } | t |  7} | |  j k o\d k n rtt d d   n  | j |  qWd j |  j   } | |  j k od k n rt d   n  | j | | f  q% W| S)Nc             S   s    g  |  ] } t  |  d   q S)z
)r   ).0liner'   r'   r(   
<listcomp>@   s   	 z)Message.parse_headers.<locals>.<listcomp>s   
zlimit request headers fieldsr   :   z 	 	zlimit request headers zfields size z!limit request headers fields size)r0   r1   )splitlenr   r   popfindr	   striprstripupper	HEADER_REsearchr
   lstrip
startswithr   appendjoin)r%   datar   linescurrheader_lengthnamevaluer'   r'   r(   parse_headers<   s4    "zMessage.parse_headersc             C   s3  d } d  } xb |  j  D]W \ } } | d k r7 | } q | d k rX | j   d k } q | d k r d } q q W| r t t |  |  j   |  _ n | d  k	 ry t |  } Wn$ t k
 r t d d |   Yn X| d k  r t d d |   n  t t	 |  j |   |  _ n t t
 |  j   |  _ d  S)	NFzCONTENT-LENGTHzTRANSFER-ENCODINGchunkedzSEC-WEBSOCKET-KEY1   reqr   )r   lowerr   r   r   r   int
ValueErrorr	   r   r   )r%   rG   Zcontent_lengthrD   rE   r'   r'   r(   r$   c   s(    	zMessage.set_body_readerc             C   si   xY |  j  D]N \ } } | d k r
 | j   j   } | d k rD d S| d k rT d SPq
 q
 W|  j d k S)	NZ
CONNECTIONcloseTz
keep-aliveFr/   r   )r/   r   )r   rJ   r7   r   )r%   hvr'   r'   r(   should_close}   s    zMessage.should_closeN)__name__
__module____qualname__r)   r"   rF   r$   rP   r'   r'   r'   r(   r      s
   'r   c                   s   e  Z d  Z d   f d d  Z d d d  Z d d   Z d	 d
 d  Z d d   Z d d   Z d d   Z	 d d   Z
   f d d   Z   S)Requestr/   c                s   d  |  _  d  |  _ d  |  _ d  |  _ d  |  _ | j |  _ |  j d k  sW |  j t k rc t |  _ n  | |  _ d  |  _ t	 t
 |   j | |  d  S)Nr   )methoduripathqueryfragmentlimit_request_lineMAX_REQUEST_LINE
req_numberproxy_protocol_infosuperrT   r)   )r%   r   r   r\   )	__class__r'   r(   r)      s    							zRequest.__init__Fc             C   sJ   | j    } | s9 | r$ t    n  t | j     n  | j |  d  S)N)readStopIterationr   getvaluewrite)r%   r   bufstopr@   r'   r'   r(   get_data   s    zRequest.get_datac       	      C   s  t    } |  j | | d d |  j | | |  j  \ } } |  j t |   r t    } | j |  |  j | | |  j  \ } } n  |  j t |   t    } | j |  | j   } | j	 d  } | d  d  d k } x | j	 d  } | d  d  d k } | d k  ra| ra|  j | |  | j   } t
 |  |  j k rbt d   qbq Pq W| r|  j j | d d    d S|  j | d  |   |  _ | | d	 d   } t    } | S)
Nre   Ts   

r   s   
r   zmax buffer headers    r   )r   rf   	read_linerZ   proxy_protocolr   rc   parse_request_linerb   r6   r4   r!   r   r   r#   rF   r   )	r%   r   rd   r,   Zrbufr@   idxdoneretr'   r'   r(   r"      s:    		!		zRequest.parser   c             C   s   | j    } x | j d  } | d k r\ | | k oA d k n rX t | |   n  Pn> t |  d | k o} d k n r t t |  |   n  |  j | |  | j    } q W| d  |  | | d d   f S)Ns   
r   r   )rb   r6   r   r4   rf   )r%   r   rd   limitr@   rk   r'   r'   r(   rh      s    &zRequest.read_linec             C   sQ   |  j  j s d S|  j d k r# d S| j d  s6 d S|  j   |  j |  d S)z        Detect, check and parse proxy protocol.

        :raises: ForbiddenProxyRequest, InvalidProxyLine.
        :return: True for proxy protocol line else False
        Fr/   ZPROXYT)r   ri   r\   r=   proxy_protocol_access_checkparse_proxy_protocol)r%   r,   r'   r'   r(   ri      s    
zRequest.proxy_protocolc             C   s   t  |  j t  r y |  j j j   d } WnM t j k
 r{ } z* | j d t k rf t	 d   n    WYd  d  } ~ Xn Xd |  j
 j k r | |  j
 j k r t	 |   q n  d  S)Nr   ZUNKNOW*)
isinstancer   r   sockgetpeernamesocketerrorargsr   r   r   Zproxy_allow_ips)r%   Zremote_hoster'   r'   r(   ro      s    z#Request.proxy_protocol_access_checkc             C   s  | j    } t |  d k r- t |   n  | d } | d } | d } | d k rj t d |   n  | d k r y* t j t j |  t j t j |  Wq$t j k
 r t |   Yq$Xn] | d k r$y* t j t j |  t j t j |  Wq$t j k
 r t |   Yq$Xn  y$ t | d  } t | d	  } Wn" t	 k
 rlt d
 |   Yn Xd | k od k n od | k od k n st d
 |   n  i | d 6| d 6| d 6| d 6| d 6|  _
 d  S)N   r/   r      TCP4TCP6zprotocol '%s' not supportedr      zinvalid port %sr   i  ri   client_addrZclient_portZ
proxy_addrZ
proxy_port)r{   r|   )r3   r4   r   ru   	inet_ptonAF_INETrv   AF_INET6rK   rL   r]   )r%   r,   bitsprotoZs_addrZd_addrZs_portZd_portr'   r'   r(   rp     sB    


8zRequest.parse_proxy_protocolc             C   ss  | j  d  d  } t |  d k r3 t |   n  t j | d  sY t | d   n  | d j   |  _ | d j d  r | d d d   |  _	 n | d |  _	 y t
 |  j	  } Wn t k
 r t |   Yn X| j p d |  _ | j p d |  _ | j p
d |  _ t j | d  } | d  k rBt | d   n  t | j d   t | j d   f |  _ d  S)Nr   rz   r   r/   z//r2   )r3   r4   r   METH_REmatchr   r9   rU   r=   rV   r   rL   rW   rX   rY   
VERSION_REr   rK   groupr   )r%   r,   r   partsr   r'   r'   r(   rj   1  s(    zRequest.parse_request_linec                sJ   t  t |   j   t |  j j t  rF t t |  j	 d   |  _ n  d  S)Nr   )
r^   rT   r$   rr   r   readerr   r   r   r   )r%   )r_   r'   r(   r$   T  s    zRequest.set_body_reader)rQ   rR   rS   r)   rf   r"   rh   ri   ro   rp   rj   r$   r'   r'   )r_   r(   rT      s   --#rT   )%reru   errnor   Zgunicorn._compatr   Zgunicorn.http.unreaderr   Zgunicorn.http.bodyr   r   r   r   Zgunicorn.http.errorsr	   r
   r   r   r   r   r   r   r   r   Zgunicorn.sixr   r   r[   r   r    compiler:   r   r   objectr   rT   r'   r'   r'   r(   <module>   s"   ":l