a
    &whD                     @   s   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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d	Zed
ee ZedZ edZ!edZ"G dd dZ#G dd de#Z$dS )    N)ChunkedReaderLengthReader	EOFReaderBody)
InvalidHeaderInvalidHeaderName
NoMoreDataInvalidRequestLineInvalidRequestMethodInvalidHTTPVersionLimitRequestLineLimitRequestHeadersUnsupportedTransferCodingObsoleteFolding)InvalidProxyLineForbiddenProxyRequest)InvalidSchemeHeaders)bytes_to_strsplit_request_urii  i   z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]c                   @   s>   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd ZdS )Messagec                 C   s   || _ || _|| _|| _d | _g | _g | _d | _|jr:dnd| _	d| _
|j| _| jdksb| jtkrht| _|j| _| jdk rt| _| jpt}| j|d  d | _| | j}| j| |   d S )NhttpshttpFr         )cfgunreader	peer_addrZremote_addrversionheadersZtrailersbodyZis_sslscheme
must_closelimit_request_fieldsMAX_HEADERSlimit_request_field_sizeDEFAULT_MAX_HEADERFIELD_SIZEmax_buffer_headersparseunreadset_body_reader)selfr   r   r   Zmax_header_field_sizeZunused r+   O/var/www/battlenet.uz/venv/lib/python3.9/site-packages/gunicorn/http/message.py__init__"   s6    


zMessage.__init__c                 C   s
   d| _ d S )NT)r!   r*   r+   r+   r,   force_close@   s    zMessage.force_closec                 C   s
   t  d S N)NotImplementedError)r*   r   r+   r+   r,   r'   C   s    zMessage.parseFc                 C   s^  | j }g }dd |dD }d}i }g }|r0n2d|jv sVt| jtrV| jd |jv rb|j}|j}|rZt|| j	kr~t
d|d}	t|	td }
|	d	dkrt|	|	d	d
\}}| j jr|d}t|st|| }|dg}|rt|d drt| j jst||d}	|
t|	td 7 }
|
| j  krVdkrbn nt
d||	d qd|}t|rt||
| j  krdkrn nt
d||v r ||| k}|rdnd}|r|| jkr t n
d}|| _d|v rJ||v sJd|v r n*| j jdkr0n| j jdkrBqbnt||||f qb|S )Nc                 S   s   g | ]}t |qS r+   r   ).0liner+   r+   r,   
<listcomp>K       z)Message.parse_headers.<locals>.<listcomp>   
F*r   zlimit request headers fieldsz
:    	) 	z!limit request headers fields sizez	 r<   r   r   T_Z	dangerousZdrop) r   splitZforwarded_allow_ips
isinstancer   tuplesecure_scheme_headersforwarder_headerslenr"   r   popfindr   Zstrip_header_spacesrstripTOKEN_RE	fullmatchr   upperstrip
startswithZpermit_obsolete_foldingr   r$   appendjoin!RFC9110_5_5_INVALID_AND_DANGEROUSsearchr    r   Z
header_map)r*   datafrom_trailerr   r   linesZscheme_headerrB   rC   currheader_lengthnamevaluesecurer    r+   r+   r,   parse_headersF   sx    









zMessage.parse_headersc                 C   s  d}d }| j D ]\}}|dkr8|d ur2td| d|}q|dkrdd |dD }|D ]r}| dkr~|rxtd| dd	}qX| d
kr|rtd| dqX| dv r|rtd| d|   qXt|qXq|r| jdk rtd| d|d urtd| dtt| | j	| _
n|d urz(t| r6t|}ntd| dW n  tyd   td| dY n0 |dk r|td| dtt| j	|| _
ntt| j	| _
d S )NFzCONTENT-LENGTH)reqzTRANSFER-ENCODINGc                 S   s   g | ]}|  qS r+   )rK   )r3   vr+   r+   r,   r5      r6   z+Message.set_body_reader.<locals>.<listcomp>,chunkedTidentity)compressdeflategzip)r:   r:   r   )r   r   r?   lowerr/   r   r   r   r   r   r   str	isnumericint
ValueErrorr   r   )r*   r]   content_lengthrV   rW   valsvalr+   r+   r,   r)      sN    




zMessage.set_body_readerc                 C   sZ   | j r
dS | jD ]>\}}|dkr| d}|dkr< dS |dkrJ dS  qPq| jdkS )NTZ
CONNECTIONr;   closez
keep-aliveFr:   r   )r!   r   rb   rK   r   )r*   hr[   r+   r+   r,   should_close   s    zMessage.should_closeN)F)	__name__
__module____qualname__r-   r/   r'   rY   r)   rm   r+   r+   r+   r,   r   !   s   
c<r   c                       sf   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  ZS )Requestr:   c                    s`   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superr-   )r*   r   r   r   rz   	__class__r+   r,   r-      s    
zRequest.__init__Fc                 C   s0   |  }|s"|rt t| || d S r0   )readStopIterationr   getvaluewrite)r*   r   bufstoprQ   r+   r+   r,   get_data  s    zRequest.get_datac           	      C   sB  t  }| j||dd | ||| j\}}| t|r`t  }|| | ||| j\}}| | t  }|| |	 }|
d}|d d dk}|
d}|d d dk}|dk r|s| || |	 }t|| jkrtdqqq|r| j|dd   dS | j|d | d	d
| _||d d  }d }|S )NT)r   s   

r   r7   r   zmax buffer headersr6   F)rR   r   )ioBytesIOr   	read_linerx   proxy_protocolr   r   parse_request_liner   rF   rD   r&   r   r   r(   rY   r   )	r*   r   r   r4   ZrbufrQ   idxdoneretr+   r+   r,   r'     s8    





zRequest.parser   c                 C   s   |  }|d}|dkr>||  kr.dkrn qt||qt|d |  krZdkrln ntt||| || |  }q|d | ||d d  fS )Nr7   r   r   )r   rF   r   rD   r   )r*   r   r   limitrQ   r   r+   r+   r,   r   :  s    

 

zRequest.read_linec                 C   s>   | 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:   ZPROXYT)r   r   rz   rL   proxy_protocol_access_checkparse_proxy_protocol)r*   r4   r+   r+   r,   r   L  s    


zRequest.proxy_protocolc                 C   s<   d| j jvr8t| jtr8| jd | j jvr8t| jd d S )Nr8   r   )r   Zproxy_allow_ipsr@   r   rA   r   r.   r+   r+   r,   r   a  s    
z#Request.proxy_protocol_access_checkc                 C   sj  | d}t|dkrt||d }|d }|d }|dvrJtd| |dkrz ttj| ttj| W q ty   t|Y q0 nD|d	krz ttj| ttj| W n ty   t|Y n0 zt|d
 }t|d }W n  t	y   td| Y n0 d|  kr*dkrHn nd|  krFdksTn td| |||||d| _
d S )Nr<      r:   r      )TCP4TCP6zprotocol '%s' not supportedr   r   r      zinvalid port %sr   i  )r   client_addrZclient_portZ
proxy_addrZ
proxy_port)r?   rD   r   socket	inet_ptonAF_INETOSErrorAF_INET6re   rf   r{   )r*   r4   bitsprotoZs_addrZd_addrZs_portZd_portr+   r+   r,   r   h  sB    
6zRequest.parse_proxy_protocolc                 C   s  dd | ddD }t|dkr.tt||d | _| jjs~t| jrVt	| jdt|d   krrdks~n t	| jt
| jst	| j| jjr| j | _|d | _t| jdkrtt|zt| j}W n ty   tt|Y n0 |jpd	| _|jpd	| _|jp d	| _t|d }|d u rHt|d t|dt|df| _d
| j  krdk sn | jjst| jd S )Nc                 S   s   g | ]}t |qS r+   r2   )r3   bitr+   r+   r,   r5     r6   z.Request.parse_request_line.<locals>.<listcomp>    r   r   r      r:    rk   )r   r   )r?   rD   r	   r   rs   r   Z!permit_unconventional_http_methodMETHOD_BADCHAR_RErP   r
   rH   rI   Zcasefold_http_methodrJ   rt   r   rf   ru   rv   rw   
VERSION_REr   re   groupr   Z"permit_unconventional_http_version)r*   Z
line_bytesr   partsmatchr+   r+   r,   r     s<    







zRequest.parse_request_linec                    s.   t    t| jjtr*tt| jd| _d S rr   )	r|   r)   r@   r   readerr   r   r   r   r.   r}   r+   r,   r)     s    
zRequest.set_body_reader)r:   )F)r   )rn   ro   rp   r-   r   r'   r   r   r   r   r   r)   __classcell__r+   r+   r}   r,   rq      s   
-
-7rq   )%r   rer   Zgunicorn.http.bodyr   r   r   r   Zgunicorn.http.errorsr   r   r   r	   r
   r   r   r   r   r   r   r   r   Zgunicorn.utilr   r   ry   r#   r%   ZRFC9110_5_6_2_TOKEN_SPECIALScompileescaperH   r   r   rO   r   rq   r+   r+   r+   r,   <module>   s$   0


 S