
    O=d-                     .   d dl Z d dlZd dl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mZ dZdZdZ ej        d	          Z ej        d
          Z ej        d          Z G d de          Z G d de          Z dS )    N)ChunkedReaderLengthReader	EOFReaderBody)InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeaders)InvalidProxyLineForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_urii  i   z%[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\"]z[A-Z0-9$-_.]{3,20}zHTTP/(\d+)\.(\d+)c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )Messagec                 
   || _         || _        || _        d | _        g | _        g | _        d | _        |j        rdnd| _        |j	        | _	        | j	        dk    s| j	        t          k    rt          | _	        |j        | _        | j        dk     rt          | _        | j        pt          }| j	        |dz   z  dz   | _        |                     | j                  }| j                            |           |                                  d S )Nhttpshttpr         )cfgunreader	peer_addrversionheaderstrailersbodyis_sslschemelimit_request_fieldsMAX_HEADERSlimit_request_field_sizeDEFAULT_MAX_HEADERFIELD_SIZEmax_buffer_headersparseunreadset_body_reader)selfr   r   r   max_header_field_sizeunuseds         ?D:\Sites\api_v1\venv\Lib\site-packages\gunicorn/http/message.py__init__zMessage.__init__   s    "	!$7gg %($<!%**(;66(3D%(+(D%(1,,,HD) !% = ]A]"&";"Q&#(*+#, DM**V$$$    c                     t                      N)NotImplementedError)r,   r   s     r/   r)   zMessage.parse:   s    !###r1   c                    | j         }g }d |                    d          D             }d}i }d|j        v s.t          | j        t
                    r| j        d         |j        v r|j        }|rrt          |          | j        k    rt          d          |
                    d          }t          |          }|                    d          dk     r!t          |                                          |                    dd          \  }	}
| j         j        r(|	                    d	                                          }	n|	                                }	t"                              |	          rt'          |	          |	                                |
                                g}
}	|r|d                             d
          r}|
                    d          }|t          |          z  }|| j        cxk    rdk    rn nt          d          |
                    |           |r|d                             d
          }d                    |
                                          }
|| j        cxk    rdk    rn nt          d          |	|v r7|
||	         k    }|rdnd}|r|| j        k    rt5                      n	d}|| _        |                    |	|
f           |r|S )Nc                 2    g | ]}t          |          d z   S )z
r   ).0lines     r/   
<listcomp>z)Message.parse_headers.<locals>.<listcomp>B   s%    MMMd##f,MMMr1      
F*r   zlimit request headers fields:   z 	) 	z!limit request headers fields size r   r   T)r   splitforwarded_allow_ips
isinstancer   tuplesecure_scheme_headerslenr$   r   popfindr   stripstrip_header_spacesrstripupper	HEADER_REsearchr   lstrip
startswithr&   appendjoinr#   r   )r,   datar   r   linesscheme_headerrF   currheader_lengthnamevaluesecurer#   s                r/   parse_headerszMessage.parse_headers=   s   h NMG9L9LMMM  "3***4>511 +~a C$;;;$'$=!  *	*7||t888)*HIII 99Q<<DIIMyy~~!!#DJJLL111**S!,,KD%x+ ${{5))//11zz||%% .'---**,,(8%D  #E!H//<< #yy||T* 4#@DDDD1DDDDD- /< = = =T"""  #E!H//<< # GGENN))++Et<@@@@q@@@@@)*MNNN,,,"7"==$*6  ),,2444 - %)M"(DKNND%=)))U  *	*X r1   c                 &   d}d }| j         D ]A\  }}|dk    r|t          d|           |}!|dk    r|                                dk    rd}B|r)t          t	          | | j                            | _        d S |p	 t          |          }n# t          $ r t          d|           w xY w|dk     rt          d|           t          t          | j        |                    | _        d S t          t          | j                            | _        d S )NFzCONTENT-LENGTH)reqzTRANSFER-ENCODINGchunkedTr   )r   r   lowerr   r   r   r!   int
ValueErrorr   r   )r,   r_   content_lengthrY   rZ   s        r/   r+   zMessage.set_body_reader|   sE   !\ 	# 	#MT5'''!-'(8dCCCC!&,,,;;==I--"G 	7]4??@@DIII'@!$^!4!4 @ @ @#$4$????@ !!#$4$????\$-HHIIDIIIYt}5566DIIIs   <B B(c                     | j         D ]E\  }}|dk    r:|                                                                }|dk    r dS |dk    r dS  nF| j        dk    S )N
CONNECTIONcloseTz
keep-aliveF)r>   r   )r   r`   rJ   r   )r,   hvs      r/   should_closezMessage.should_close   st    l 	 	FQL  GGIIOO%%<<44,&& 55 ! |v%%r1   N)__name__
__module____qualname__r0   r)   r\   r+   ri    r1   r/   r   r      s`          8$ $ $= = =~7 7 78	& 	& 	& 	& 	&r1   r   c                   X     e Zd Zd fd	ZddZd ZddZd Zd	 Zd
 Z	d Z
 fdZ xZS )Requestr>   c                    d | _         d | _        d | _        d | _        d | _        |j        | _        | j        dk     s| j        t          k    rt          | _        || _        d | _        t                      
                    |||           d S Nr   )methoduripathqueryfragmentlimit_request_lineMAX_REQUEST_LINE
req_numberproxy_protocol_infosuperr0   )r,   r   r   r   ry   	__class__s        r/   r0   zRequest.__init__   s    	
 #&"8#a''&*:::&6D#$#' h	22222r1   Fc                     |                                 }|s1|rt                      t          |                                          |                    |           d S r3   )readStopIterationr	   getvaluewrite)r,   r   bufstoprT   s        r/   get_datazRequest.get_data   sR    }} 	- &#oo%S\\^^,,,		$r1   c                    t          j                    }|                     ||d           |                     ||| j                  \  }}|                     t          |                    rGt          j                    }|                    |           |                     ||| j                  \  }}|                     |           t          j                    }|                    |           |	                                }|
                    d          }|d d         dk    }	 |
                    d          }|d d         dk    }|dk     rT|sR|                     ||           |	                                }t          |          | j        k    rt          d          nn|r$| j                            |dd                     dS |                     |d |                   | _        ||d	z   d          }d }|S )
NT)r   s   

r   r;   r   zmax buffer headersr1   r   )ioBytesIOr   	read_linerw   proxy_protocolr   r   parse_request_liner   rI   rG   r(   r   r   r*   r\   r   )	r,   r   r   r9   rbufrT   idxdonerets	            r/   r)   zRequest.parse   s   jllh$/// ^^Hc43JKK
d |D1122 	P*,,CIIdOOO#t7NOOJD$%%%jll		$ ||~~ii$$BQBx7"
	))K((C8w&DQwwtwh,,,||~~t99t666-.BCCC 7 
	  	M  abb***3))$tt*553788n
r1   r   c                    |                                 }	 |                    d          }|dk    r!||cxk    rdk    rn nt          ||          nht          |          dz
  |cxk    rdk    r n nt          t          |          |          |                     ||           |                                 }|d |         ||dz   d          fS )NTr;   r   r   )r   rI   r   rG   r   )r,   r   r   limitrT   r   s         r/   r   zRequest.read_line   s    ||~~
	"))G$$Caxx?????????*36664yy1}u((((q(((((&s4yy%888MM(C(((<<>>D
	" TcT
S1WXX  	 r1   c                     | j         j        sdS | j        dk    rdS |                    d          sdS |                                  |                     |           dS )z        Detect, check and parse proxy protocol.

        :raises: ForbiddenProxyRequest, InvalidProxyLine.
        :return: True for proxy protocol line else False
        Fr>   PROXYT)r   r   ry   rQ   proxy_protocol_access_checkparse_proxy_protocol)r,   r9   s     r/   r   zRequest.proxy_protocol   sl     x& 	5?a5w'' 	5((***!!$'''tr1   c                     d| j         j        vrMt          | j        t                    r5| j        d         | j         j        vrt          | j        d                   d S d S d S )Nr<   r   )r   proxy_allow_ipsrD   r   rE   r   )r,   s    r/   r   z#Request.proxy_protocol_access_check  sf    tx///t~u-- 0N1TX%==='q(9::: 0///==r1   c                    |                                 }t          |          dk    rt          |          |d         }|d         }|d         }|dvrt          d|z            |dk    rb	 t          j        t          j        |           t          j        t          j        |           n# t          j        $ r t          |          w xY w|dk    rb	 t          j        t          j        |           t          j        t          j        |           n"# t          j        $ r t          |          w xY w	 t          |d	                   }t          |d
                   }n # t          $ r t          d|z            w xY wd|cxk    rdk    rn nd|cxk    rdk    sn t          d|z            |||||d| _
        d S )N   r>   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrclient_port
proxy_addr
proxy_port)rB   rG   r   socket	inet_ptonAF_INETerrorAF_INET6ra   rb   rz   )r,   r9   bitsprotos_addrd_addrs_portd_ports           r/   r   zRequest.parse_proxy_protocol  s   zz||t99>>"4((( Qaa ((("#@5#HIIIF??- 888 8888< - - -&t,,,-f__- &999 &9999< - - -&t,,,-	=a\\Fa\\FF 	= 	= 	="#4t#;<<<	= f%%%%%%%%%A,@,@,@,@5,@,@,@,@"#4t#;<<< $!!  $
 $
   s$   ,>B+ +C
>D D26*E! !E>c                 :   d |                     d d          D             }t          |          dk    rt          t          |                    t                              |d                   st          |d                   |d                                         | _        |d         | _	        	 t          | j	                  }n*# t          $ r t          t          |                    w xY w|j        pd| _        |j        pd| _        |j        pd| _        t                              |d                   }|t!          |d                   t#          |                    d                    t#          |                    d                    f| _        d S )Nc                 ,    g | ]}t          |          S rm   r7   )r8   bits     r/   r:   z.Request.parse_request_line.<locals>.<listcomp>G  s     GGGcS!!GGGr1   r   r   r   r>   rA   )rB   rG   r
   r   METH_REmatchr   rM   rr   rs   r   rb   rt   ru   rv   
VERSION_REr   ra   groupr   )r,   
line_bytesr   partsr   s        r/   r   zRequest.parse_request_lineF  sk   GGZ-=-=dA-F-FGGGt99>>$\*%=%=>>> }}T!W%% 	0&tAw///1gmmoo 7	?%dh//EE 	? 	? 	?$\*%=%=>>>	?J$"	[&B
,"   a))=$T!W---EKKNN++SQ-@-@As   2C 'C.c                     t                                                       t          | j        j        t
                    r)t          t          | j        d                    | _        d S d S rq   )	r{   r+   rD   r!   readerr   r   r   r   )r,   r|   s    r/   r+   zRequest.set_body_readera  sY    !!!di&	22 	=\$-;;<<DIII	= 	=r1   )r>   )F)r   )rj   rk   rl   r0   r   r)   r   r   r   r   r   r+   __classcell__)r|   s   @r/   ro   ro      s        3 3 3 3 3 3"   + + +Z       $  *; ; ;+
 +
 +
ZB B B6= = = = = = = = =r1   ro   )!r   rer   gunicorn.http.bodyr   r   r   r   gunicorn.http.errorsr   r   r	   r
   r   r   r   r   r   r   r   gunicorn.utilr   r   rx   r%   r'   compilerN   r   r   objectr   ro   rm   r1   r/   <module>r      s   
			 				  K K K K K K K K K K K K                   
 I H H H H H H H 5 5 5 5 5 5 9 9 9 9 9 9 9 9 # BJ?@@	
"**
+
+RZ,--
D& D& D& D& D&f D& D& D&N@= @= @= @= @=g @= @= @= @= @=r1   