§
    Æ¼Êi[{  ã                   ó  — d dl mZ d dlZ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mZ d dlmZmZmZ d dlmZ d dlmZmZ dadadZ d	„ Z!d
Z" G d„ de¦  «        Z# G d„ de¦  «        Z$ G d„ de¦  «        Z%dZ&dZ'dZ(dZ) ej*        d ej+        e)¦  «        z  ¦  «        Z, ej*        d¦  «        Z- ej*        d¦  «        Z. ej*        d¦  «        Z/d„ Z0 G d„ d¦  «        Z1 G d„ de1¦  «        Z2dS )é    )ÚIntEnumN)ÚChunkedReaderÚLengthReaderÚ	EOFReaderÚBody)ÚInvalidHeaderÚInvalidHeaderNameÚ
NoMoreDataÚInvalidRequestLineÚInvalidRequestMethodÚInvalidHTTPVersionÚLimitRequestLineÚLimitRequestHeadersÚUnsupportedTransferCodingÚObsoleteFoldingÚExpectationFailed)ÚInvalidProxyLineÚInvalidProxyHeaderÚForbiddenProxyRequest)ÚInvalidSchemeHeaders)Úbytes_to_strÚsplit_request_uri)Úpermit_obsolete_foldingÚstrip_header_spacesc                 óâ  — t          | dd¦  «        }|dk    rdS t          €	 ddl}da|an# t          $ r daY nw xY wt          s|dk    rt          d	¦  «        ‚t          sdS t          t          d
¦  «        s|dk    rt          d¦  «        ‚dS g }t          D ](}t          | |d¦  «        r|                     |¦  «         Œ)|r-|dk    r%t          dd 	                    |¦  «        z  ¦  «        ‚dS dS )aë  Check if fast C parser is available and should be used.

    Returns False if:
    - http_parser='python' is explicitly set
    - gunicorn_h1c is not installed (in 'auto' mode)
    - gunicorn_h1c < 0.4.1 (in 'auto' mode)
    - Incompatible compatibility flags are enabled (in 'auto' mode)

    Raises RuntimeError if:
    - http_parser='fast' but gunicorn_h1c is not installed
    - http_parser='fast' but gunicorn_h1c < 0.4.1
    - http_parser='fast' but incompatible flags are enabled
    Úhttp_parserÚautoÚpythonFNr   TÚfastz1gunicorn_h1c not installed but http_parser='fast'r   zigunicorn_h1c >= 0.4.1 required for http_parser='fast'. Please upgrade: pip install --upgrade gunicorn_h1czqhttp_parser='fast' is incompatible with compatibility flags: %s. Use http_parser='python' or disable these flags.z, )
ÚgetattrÚ_fast_parser_availableÚgunicorn_h1cÚ_fast_parser_moduleÚImportErrorÚRuntimeErrorÚhasattrÚ_FAST_PARSER_INCOMPATIBLE_FLAGSÚappendÚjoin)ÚcfgÚparser_settingr"   ÚincompatibleÚflags        úZ/home/mmwave/public_html/mmwave/venv/lib/python3.11/site-packages/gunicorn/http/message.pyÚ_check_fast_parserr/   #   sm  € õ  ˜S -°Ñ8Ô8€NØ˜Ò!Ð!ØˆuåÐ%ð	+ØÐÐÐØ%)Ð"Ø".ÐÐøÝð 	+ð 	+ð 	+Ø%*Ð"Ð"Ð"ð	+øøøõ "ð P n¸Ò&>Ð&>ÝÐNÑOÔOÐOå!ð Øˆuõ Õ&Ð(:Ñ;Ô;ð Ø˜VÒ#Ð#ÝðEñô ð ð
 ˆuð €LÝ/ð &ð &ˆÝ�3˜˜eÑ$Ô$ð 	&Ø×Ò Ñ%Ô%Ð%øàð Ø˜VÒ#Ð#ÝðCà—)’)˜LÑ)Ô)ñ*ñô ð ð ˆuàˆ4s   ¢+ «:¹:s   

 
QUIT
c                   ó   — e Zd ZdZdZdZdS )Ú	PPCommandzPROXY protocol v2 commands.r   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚLOCALÚPROXY© ó    r.   r1   r1   f   s   € € € € € Ø%Ð%Ø€EØ€E€E€Er:   r1   c                   ó"   — e Zd ZdZdZdZdZdZdS )ÚPPFamilyz#PROXY protocol v2 address families.r   r2   é   é   N)r3   r4   r5   r6   ÚUNSPECÚINETÚINET6ÚUNIXr9   r:   r.   r<   r<   l   s(   € € € € € Ø-Ð-Ø€FØ€DØ€EØ€D€D€Dr:   r<   c                   ó   — e Zd ZdZdZdZdZdS )Ú
PPProtocolz&PROXY protocol v2 transport protocols.r   r2   r=   N)r3   r4   r5   r6   r?   ÚSTREAMÚDGRAMr9   r:   r.   rD   rD   t   s#   € € € € € Ø0Ð0Ø€FØ€FØ€E€E€Er:   rD   iþ  i €  z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]c                 óx   — d|v rdS 	 t          j        | ¦  «        }n# t          $ r Y dS w xY w|D ]	}||v r dS Œ
dS )z÷Check if IP address is in the allow list.

    Args:
        ip_str: The IP address string to check
        allow_list: The original allow list (strings, may contain "*")
        networks: Pre-computed ipaddress.ip_network objects from config
    Ú*TF)Ú	ipaddressÚ
ip_addressÚ
ValueError)Úip_strÚ
allow_listÚnetworksÚipÚnetworks        r.   Ú_ip_in_allow_listrQ   ˆ   sv   € ð ˆjÐÐØˆtðÝÔ! &Ñ)Ô)ˆˆøÝð ð ð Øˆuˆuðøøøàð ð ˆØ�ˆ=ˆ=Ø�4�4ð àˆ5s   ˆ �
+ª+c                   ó4   — e Zd Zd„ Zd„ Zd„ Zd	d„Zd„ Zd„ ZdS )
ÚMessagec                 ó4  — || _         || _        || _        || _        d | _        g | _        g | _        d | _        |j        rdnd| _	        d| _
        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ÚhttpFr   r=   é   )r*   ÚunreaderÚ	peer_addrÚremote_addrÚversionÚheadersÚtrailersÚbodyÚis_sslÚschemeÚ
must_closeÚ_expected_100_continueÚlimit_request_fieldsÚMAX_HEADERSÚlimit_request_field_sizeÚDEFAULT_MAX_HEADERFIELD_SIZEÚmax_buffer_headersÚparseÚunreadÚset_body_reader)Úselfr*   rX   rY   Úmax_header_field_sizeÚunuseds         r.   Ú__init__zMessage.__init__�   s"  € ØˆŒØ ˆŒØ"ˆŒØ$ˆÔØˆŒØˆŒØˆŒØˆŒ	Ø!$¤Ð7�g�g°ˆŒØˆŒØ&+ˆÔ#ð %(Ô$<ˆÔ!ØÔ%¨Ò*Ð*ØÔ,­{Ò:Ð:Ý(3ˆDÔ%Ø(+Ô(DˆÔ%ØÔ(¨AÒ-Ð-Ý,HˆDÔ)ð !%Ô =Ð ]ÕA]ÐØ"&Ô";Ø" QÑ&ñ#(Ø*+ñ#,ˆÔð —’˜DœMÑ*Ô*ˆØŒ×Ò˜VÑ$Ô$Ð$Ø×ÒÑÔÐÐÐr:   c                 ó   — d| _         d S )NT)ra   ©rk   s    r.   Úforce_closezMessage.force_close¼   s   € ØˆŒˆˆr:   c                 ó   — t          ¦   «         ‚©N)ÚNotImplementedError)rk   rX   s     r.   rh   zMessage.parse¿   s   € Ý!Ñ#Ô#Ð#r:   Fc                 óf  — | j         }g }d„ |                     d¦  «        D ¦   «         }d}i }g }|rn[t          | j        t          ¦  «        r3t          | j        d         |j        |                     ¦   «         ¦  «        r|j        }|j	        }|�r!t          |¦  «        | j        k    rt          d¦  «        ‚|                     d¦  «        }	t          |	¦  «        t          d¦  «        z   }
|	                     d¦  «        dk    rt          |	¦  «        ‚|	                     dd¦  «        \  }}| j         j        r|                     d	¦  «        }t$                               |¦  «        st)          |¦  «        ‚|                     ¦   «         }|                     d	¦  «        g}|rÖ|d                              d
¦  «        r»| j         j        st3          |¦  «        ‚|                     d¦  «        }	|
t          |	¦  «        t          d¦  «        z   z  }
|
| j        cxk    rdk    rn nt          d¦  «        ‚|                     |	                     d¦  «        ¦  «         |r|d                              d
¦  «        °»d                     |¦  «        }t:                               |¦  «        rt          |¦  «        ‚|
| j        cxk    rdk    rn nt          d¦  «        ‚|sA|dk    r;|                     ¦   «         dk    r| j         dk     rnd| _!        ntE          |¦  «        ‚||v r7|||         k    }|rdnd}|r|| j#        k    rtI          ¦   «         ‚n	d}|| _#        d|v r;||v sd|v rn2| j         j%        dk    rn!| j         j%        dk    r�Œût)          |¦  «        ‚|                     ||f¦  «         |�°!|S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r9   ©r   )Ú.0Úlines     r.   ú
<listcomp>z)Message.parse_headers.<locals>.<listcomp>Ç   s    € ÐDÐDÐD¨•˜dÑ#Ô#ÐDÐDÐDr:   ó   
Fr   zlimit request headers fieldsz
ú:r2   ú 	)ú ú	z!limit request headers fields sizez	 r~   ÚEXPECTz100-continue©r2   r2   TrU   rV   Ú_rH   Ú	dangerousÚdrop)&r*   ÚsplitÚ
isinstancerY   ÚtuplerQ   Úforwarded_allow_ipsÚforwarded_allow_networksÚsecure_scheme_headersÚforwarder_headersÚlenrc   r   ÚpopÚfindr   r   ÚrstripÚTOKEN_REÚ	fullmatchr	   ÚupperÚstripÚ
startswithr   r   re   r(   r)   Ú!RFC9110_5_5_INVALID_AND_DANGEROUSÚsearchÚlowerr[   rb   r   r`   r   Ú
header_map)rk   ÚdataÚfrom_trailerr*   r\   ÚlinesÚscheme_headerrŠ   r‹   ÚcurrÚheader_lengthÚnameÚvalueÚsecurer`   s                  r.   Úparse_headerszMessage.parse_headersÂ   s$  € ØŒhˆØˆð EÐD°·
²
¸7Ñ0CÔ0CÐDÑDÔDˆð ˆØ "ÐØÐØð 	6ð Ý˜Tœ^­UÑ3Ô3ð 	6Ý" 4¤>°!Ô#4°cÔ6MØ#&×#?Ò#?Ñ#AÔ#AñCô Cð	6ð %(Ô$=Ð!Ø #Ô 5Ðð ñ W	*Ý�7‰|Œ|˜tÔ8Ò8Ð8Ý)Ð*HÑIÔIÐIð —9’9˜Q‘<”<ˆDÝ ™IœI­¨F©¬Ñ3ˆMØ�yŠy˜‰~Œ~ Ò"Ð"Ý# DÑ)Ô)Ð)ØŸ*š* S¨!Ñ,Ô,‰KˆD�%ØŒxÔ+ð *Ø—{’{ 5Ñ)Ô)�Ý×%Ò% dÑ+Ô+ð .Ý'¨Ñ-Ô-Ð-ð —:’:‘<”<ˆDà—[’[ Ñ'Ô'Ð(ˆEð ð 	0˜E !œH×/Ò/°Ñ<Ô<ð 	0à”xÔ7ð 0Ý)¨$Ñ/Ô/Ð/Ø—y’y ‘|”|�Ø¥ T¡¤­S°©[¬[Ñ!8Ñ8�Ø  4Ô#@ÐDÐDÒDÐDÀ1ÒDÐDÐDÐDÐDÝ-ð /<ñ =ô =ð =à—’˜TŸZšZ¨Ñ.Ô.Ñ/Ô/Ð/ð ð 	0˜E !œH×/Ò/°Ñ<Ô<ð 	0ð —H’H˜U‘O”OˆEå0×7Ò7¸Ñ>Ô>ð *Ý# DÑ)Ô)Ð)à˜tÔ<Ð@Ð@Ò@Ð@¸qÒ@Ð@Ð@Ð@Ð@Ý)Ð*MÑNÔNÐNàð 3 D¨HÒ$4Ð$4ð —;’;‘=”= NÒ2Ð2Ø”| fÒ,Ð,ð à6:˜Ô3Ð3õ ,¨EÑ2Ô2Ð2àÐ,Ð,Ð,ØÐ"7¸Ô"=Ò=�Ø$*Ð6˜˜°�Ø ð )Ø ¤Ò,Ð,Ý2Ñ4Ô4Ð4ð -ð %)�MØ"(�D”Kð �dˆ{ˆ{ØÐ,Ð,Ð,°Ð7HÐ0HÐ0HàØ”XÔ(¨KÒ7Ð7àØ”XÔ(¨FÒ2Ð2ñ õ ,¨DÑ1Ô1Ð1à�NŠN˜D %˜=Ñ)Ô)Ð)ðo ñ W	*ðr ˆr:   c                 óJ  — d}d }| j         D ]ñ\  }}|dk    r|�t          d| ¬¦  «        ‚|}Œ!|dk    rÊd„ |                     d¦  «        D ¦   «         }|D ]¨}|                     ¦   «         dk    r|rt          d| ¬¦  «        ‚d}Œ0|                     ¦   «         d	k    r|rt          d| ¬¦  «        ‚Œ\|                     ¦   «         d
v r(|rt          d| ¬¦  «        ‚|                      ¦   «          Œšt          |¦  «        ‚Œò|rX| j        dk     rt          d| ¬¦  «        ‚|�t          d| ¬¦  «        ‚t          t          | | j	        ¦  «        ¦  «        | _
        d S |�£	 t          |¦  «                             ¦   «         rt          |¦  «        }nt          d| ¬¦  «        ‚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-ENCODINGc                 ó6   — g | ]}|                      ¦   «         ‘ŒS r9   )r“   )rx   Úvs     r.   rz   z+Message.set_body_reader.<locals>.<listcomp>@  s    € Ð<Ð<Ð< a˜Ÿš™	œ	Ð<Ð<Ð<r:   ú,ÚchunkedTÚidentity)ÚcompressÚdeflateÚgzipr�   r   )r\   r   r…   r—   rq   r   r[   r   r   rX   r^   ÚstrÚ	isnumericÚintrK   r   r   )rk   r¨   Úcontent_lengthrŸ   r    ÚvalsÚvals          r.   rj   zMessage.set_body_reader4  s—  € ØˆØˆà!œ\ð 	?ð 	?‰MˆT�5ØÐ'Ò'Ð'Ø!Ð-Ý'Ð(8¸dÐCÑCÔCÐCØ!&��ØÐ,Ò,Ð,ð =Ð<¨5¯;ª;°sÑ+;Ô+;Ð<Ñ<Ô<�Øð ?ð ?�CØ—y’y‘{”{ iÒ/Ð/à"ð OÝ"/Ð0CÈÐ"NÑ"NÔ"NÐNØ"&˜˜ØŸš™œ¨
Ò2Ð2ð #ð OÝ"/Ð0CÈÐ"NÑ"NÔ"NÐNðOàŸš™œÐ(GÐGÐGà"ð OÝ"/Ð0CÈÐ"NÑ"NÔ"NÐNØ×(Ò(Ñ*Ô*Ð*Ð*å7¸Ñ>Ô>Ð>øàð 	7ð Œ|˜fÒ$Ð$å#Ð$7¸TÐBÑBÔBÐBØÐ)õ $Ð$4¸$Ð?Ñ?Ô?Ð?Ý�]¨4°´Ñ?Ô?Ñ@Ô@ˆDŒIˆIˆIØÐ'ð@Ý�~Ñ&Ô&×0Ò0Ñ2Ô2ð DÝ%(¨Ñ%8Ô%8�N�Nå'Ð(8¸dÐCÑCÔCÐCð #øõ ð @ð @ð @Ý#Ð$4¸$Ð?Ñ?Ô?Ð?ð@øøøð  Ò!Ð!Ý#Ð$4¸$Ð?Ñ?Ô?Ð?å�\¨$¬-¸ÑHÔHÑIÔIˆDŒIˆIˆIå�Y t¤}Ñ5Ô5Ñ6Ô6ˆDŒIˆIˆIs   ÅAF ÆF:c                 óÆ   — | j         rdS | j        D ]F\  }}|dk    r;|                     ¦   «                              d¦  «        }|dk    r dS |dk    r dS  nŒG| j        dk    S )NTÚ
CONNECTIONr}   Úclosez
keep-aliveF©r2   r   )ra   r\   r—   r“   r[   )rk   Úhr¦   s      r.   Úshould_closezMessage.should_closep  s…   € ØŒ?ð 	Ø�4Ø”lð 	ð 	‰FˆQ�Ø�LÒ Ð Ø—G’G‘I”I—O’O EÑ*Ô*�Ø˜’<�<Ø˜4˜4Ø˜,Ò&Ð&Ø ˜5˜5Ø�ð !ð Œ|˜vÒ%Ð%r:   N©F)	r3   r4   r5   rn   rq   rh   r¢   rj   r¸   r9   r:   r.   rS   rS   œ   sy   € € € € € ðð ð ð>ð ð ð$ð $ð $ðpð pð pð pðd:7ð :7ð :7ðx&ð &ð &ð &ð &r:   rS   c                   óx   ‡ — e Zd Zdˆ fd„	Zdd„Zd„ Zd„ Zd„ Zdd„Zdd
„Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zˆ fd„Zˆ xZS )ÚRequestr2   c                 ó®  •— d | _         d | _        d | _        d | _        d | _        |j        | _        | j        dk     rt          | _        | j        dk    rd| _        n5| j        t          k    rt          | _        t          | _        n| j        | _        || _        d | _	        t          |¦  «        | _        t          ¦   «                              |||¦  «         d S )Nr   i   )ÚmethodÚuriÚpathÚqueryÚfragmentÚlimit_request_lineÚMAX_REQUEST_LINEÚ_fast_limit_request_lineÚ
req_numberÚproxy_protocol_infor/   Ú	_use_fastÚsuperrn   )rk   r*   rX   rY   rÅ   Ú	__class__s        €r.   rn   zRequest.__init__  sÓ   ø€ ØˆŒØˆŒØˆŒ	ØˆŒ
ØˆŒð #&Ô"8ˆÔØÔ" QÒ&Ð&Ý&6ˆDÔ#ð Ô" aÒ'Ð'Ø,7ˆDÔ)Ð)ØÔ$Õ(8Ò8Ð8Ý,<ˆDÔ)Ý&6ˆDÔ#Ð#à,0Ô,CˆDÔ)à$ˆŒØ#'ˆÔ õ ,¨CÑ0Ô0ˆŒå‰Œ×Ò˜˜h¨	Ñ2Ô2Ð2Ð2Ð2r:   Fc                 ó¾   — |                      ¦   «         }|s1|rt          ¦   «         ‚t          |                     ¦   «         ¦  «        ‚|                     |¦  «         d S rs   )ÚreadÚStopIterationr
   ÚgetvalueÚwrite©rk   rX   ÚbufÚstopr™   s        r.   Úget_datazRequest.get_dataœ  sR   € Ø�}Š}‰ŒˆØð 	-Øð &Ý#‘o”oÐ%Ý˜SŸ\š\™^œ^Ñ,Ô,Ð,Ø�	Š	�$‰Œˆˆˆr:   c                 ó  — t          ¦   «         }|                      ||d¬¦  «         | j        j        }|dk    r"| j        dk    r|                      |||¦  «        }| j        r|                      ||¦  «        S |                      ||¦  «        S )NT)rÑ   Úoffr2   )	Ú	bytearrayÚ	read_intor*   Úproxy_protocolrÅ   Ú_handle_proxy_protocolrÇ   Ú_parse_fastÚ_parse_python©rk   rX   rÐ   Úmodes       r.   rh   zRequest.parse¤  s“   € Ý‰kŒkˆØ�Š�x ¨4ˆÑ0Ô0Ð0ð ŒxÔ&ˆØ�5Š=ˆ=˜Tœ_°Ò1Ð1Ø×-Ò-¨h¸¸TÑBÔBˆCð Œ>ð 	3Ø×#Ò# H¨cÑ2Ô2Ð2à×!Ò! (¨CÑ0Ô0Ð0r:   c           	      óž  — t          |¦  «        }d}	 	 t                               ||| j        | j        | j        | j        j        | j        j        ¬¦  «        }�n½# t          j	        $ rg t          |¦  «        }|                      ||¦  «         t          |¦  «        }t          |¦  «        | j        | j        z   k    rt          d¦  «        ‚Y �nFt          j        $ r!}t          t          |¦  «        ¦  «        ‚d}~wt          j        $ r!}t          t          |¦  «        ¦  «        ‚d}~wt          j        $ r!}t!          t          |¦  «        ¦  «        ‚d}~wt          j        $ r!}t#          t          |¦  «        ¦  «        ‚d}~wt          j        $ r!}t%          t          |¦  «        ¦  «        ‚d}~wt          j        $ r!}t'          t          |¦  «        ¦  «        ‚d}~wt          j        $ r!}t+          t          |¦  «        ¦  «        ‚d}~ww xY w�Œt-          |d         ¦  «        | _        t-          |d         ¦  «        | _        | j        j        r| j                             ¦   «         | _        t          | j        ¦  «        dk    rt+          | j        ¦  «        ‚	 t7          | j        ¦  «        }n"# t8          $ r t+          | j        ¦  «        ‚w xY w|j        pd| _        |j        pd| _        |j        pd| _        d	|d
         f| _         g | _!        |d         D ]›\  }}	t-          |¦  «                             ¦   «         }
t-          |	¦  «        }d|
v rF| j        j"        }|
|v sd|v rn1| j        j#        dk    rn | j        j#        dk    rŒpt%          |
¦  «        ‚| j!         $                    |
|f¦  «         Œœ|d         }||d…         S )z:Parse request using fast C parser (gunicorn_h1c >= 0.4.1).r   T)Úlast_lenrÂ   rc   re   Ú!permit_unconventional_http_methodÚ"permit_unconventional_http_versionúmax buffer headersNr½   r¿   Ú r2   Úminor_versionr\   r‚   rH   rƒ   r„   Úconsumed)%Úbytesr#   Úparse_requestrÄ   rc   re   r*   rß   rà   ÚIncompleteErrorrŒ   rÖ   rg   r   r   r­   r   r   r	   r   Ú
ParseErrorr   r   r½   r¾   Úcasefold_http_methodr’   r   rK   r¿   rÀ   rÁ   r[   r\   r‹   r˜   r(   )rk   rX   rÐ   r™   rÞ   ÚresultÚeÚpartsÚ
name_bytesÚvalue_bytesrŸ   r    r‹   rä   s                 r.   rÙ   zRequest._parse_fast³  sû  € õ �S‰zŒzˆØˆð!	1ð 1õ -×:Ò:ØØ%Ø'+Ô'DØ)-Ô)BØ-1Ô-JØ6:´hÔ6`Ø7;´xÔ7bð ;ñ ô �ñ øÝ&Ô6ð Dð Dð DÝ˜t™9œ9�Ø—’˜x¨Ñ-Ô-Ð-Ý˜S‘z”z�Ý�t‘9”9˜tÔ6¸Ô9VÑVÒVÐVÝ-Ð.BÑCÔCÐCð WÑVå&Ô7ð /ð /ð /Ý&¥s¨1¡v¤vÑ.Ô.Ð.øøøøÝ&Ô:ð 2ð 2ð 2Ý)­#¨a©&¬&Ñ1Ô1Ð1øøøøÝ&Ô;ð 3ð 3ð 3Ý*­3¨q©6¬6Ñ2Ô2Ð2øøøøÝ&Ô9ð 1ð 1ð 1Ý(­¨Q©¬Ñ0Ô0Ð0øøøøÝ&Ô8ð 0ð 0ð 0Ý'­¨A©¬Ñ/Ô/Ð/øøøøÝ&Ô4ð ,ð ,ð ,Ý#¥C¨¡F¤FÑ+Ô+Ð+øøøøÝ&Ô1ð 1ð 1ð 1Ý(­¨Q©¬Ñ0Ô0Ð0øøøøð1øøøñA!	1õH # 6¨(Ô#3Ñ4Ô4ˆŒÝ  v¤Ñ/Ô/ˆŒð Œ8Ô(ð 	.Øœ+×+Ò+Ñ-Ô-ˆDŒKõ ˆtŒx‰=Œ=˜AÒÐÝ$ T¤XÑ.Ô.Ð.ð	/Ý% d¤hÑ/Ô/ˆEˆEøÝð 	/ð 	/ð 	/Ý$ T¤XÑ.Ô.Ð.ð	/øøøà”JÐ$ "ˆŒ	Ø”[Ð& BˆŒ
ØœÐ,¨"ˆŒð ˜6 /Ô2Ð3ˆŒð
 ˆŒØ'-¨iÔ'8ð 	/ð 	/Ñ#ˆJ˜Ý 
Ñ+Ô+×1Ò1Ñ3Ô3ˆDÝ  Ñ-Ô-ˆEð �dˆ{ˆ{Ø$(¤HÔ$>Ð!ØÐ,Ð,Ð,°Ð7HÐ0HÐ0HØØ”XÔ(¨KÒ7Ð7ØØ”XÔ(¨FÒ2Ð2Øå+¨DÑ1Ô1Ð1àŒL×Ò  u Ñ.Ô.Ð.Ð.ð ˜*Ô%ˆØ�H�I�IŒÐss   ”AA ÁA2HÃHÃC9Ã9HÄD'Ä'HÄ9EÅHÅ'FÆHÆF1Æ1HÇGÇHÇ1HÈHÊ"J7 Ê7Kc                 óL  — |                       ||| j        ¦  «        \  }}|                      |¦  «         t          |¦  «        }|dd…         dk    }	 |                     d¦  «        }|dd…         dk    }|dk     rO|sM|                      ||¦  «         t          |¦  «        }t          |¦  «        | j        k    rt          d¦  «        ‚nnŒz|r$| j	         
                    |dd…         ¦  «         dS |                      |d|…         d	¬
¦  «        | _        ||dz   d…         }|S )z'Parse request using pure Python parser.Nr=   r{   Ts   

r   rá   r:   F)rš   rW   )Ú	read_linerÂ   Úparse_request_linerå   rŽ   rÖ   rŒ   rg   r   rX   ri   r¢   r\   )rk   rX   rÐ   ry   r™   ÚdoneÚidxÚrets           r.   rÚ   zRequest._parse_python  s>  € ð —N’N 8¨S°$Ô2IÑJÔJ‰	ˆˆcà×Ò Ñ%Ô%Ð%õ �S‰zŒzˆà�B�Q�BŒx˜7Ò"ˆð
	Ø—)’)˜KÑ(Ô(ˆCØ˜˜˜”8˜wÒ&ˆDà�QŠwˆw˜tˆwØ—’˜x¨Ñ-Ô-Ð-Ý˜S‘z”z�Ý�t‘9”9˜tÔ6Ò6Ð6Ý-Ð.BÑCÔCÐCð 7ð ð
	ð ð 	ØŒM× Ò   a b b¤Ñ*Ô*Ð*Ø�3à×)Ò)¨$¨t°¨t¬*À5Ð)ÑIÔIˆŒà�3˜‘7�8�8ŒnˆØˆ
r:   c                 ó´   — |                      ¦   «         }|s,|rt          ¦   «         ‚t          t          |¦  «        ¦  «        ‚|                     |¦  «         dS )z7Read data from unreader and append to bytearray buffer.N)rË   rÌ   r
   rå   ÚextendrÏ   s        r.   rÖ   zRequest.read_into,  sU   € à�}Š}‰ŒˆØð 	)Øð &Ý#‘o”oÐ%Ý�U 3™ZœZÑ(Ô(Ð(Ø�
Š
�4ÑÔÐÐÐr:   r   c                 ó¨  — t          |¦  «        }	 |                     d¦  «        }|dk    r!||cxk    rdk    rn nt          ||¦  «        ‚nct          |¦  «        dz
  |cxk    rdk    r n nt          t          |¦  «        |¦  «        ‚|                      ||¦  «         t          |¦  «        }ŒŸ|d|…         t          ||dz   d…         ¦  «        fS )z<Read a line from buffer, returning (line, remaining_buffer).Tr{   r   r=   N)rå   rŽ   r   rŒ   rÖ   rÕ   )rk   rX   rÐ   Úlimitr™   ró   s         r.   rð   zRequest.read_line5  sì   € å�S‰zŒzˆð
	Ø—)’)˜GÑ$Ô$ˆCØ�aŠxˆxà˜�?�?’?�? ’?�?�?�?�?Ý*¨3°Ñ6Ô6Ð6ØÝ�4‰yŒy˜1‰}˜uÐ(Ð(Ò(Ð( qÒ(Ð(Ð(Ð(Ð(Ý&¥s¨4¡y¤y°%Ñ8Ô8Ð8Ø�NŠN˜8 SÑ)Ô)Ð)Ý˜‘:”:ˆDð
	ð �T�c�T”
Ý˜$˜s Q™w˜x˜xœ.Ñ)Ô)ð+ð 	+r:   c                 óÖ   — t          |¦  «        |k     r)|                      ||¦  «         t          |¦  «        |k     °)t          |d|…         ¦  «        t          ||d…         ¦  «        fS )z.Read exactly count bytes from buffer/unreader.N)rŒ   rÖ   rå   rÕ   )rk   rX   rÐ   Úcounts       r.   Ú
read_byteszRequest.read_bytesH  se   € å�#‰hŒh˜ÒÐØ�NŠN˜8 SÑ)Ô)Ð)õ �#‰hŒh˜ÒÐå�S˜˜%˜”[Ñ!Ô!¥9¨S°°°¬[Ñ#9Ô#9Ð9Ð9r:   c                 óx  — t          |¦  «        dk     r)|                      ||¦  «         t          |¦  «        dk     °)|dv r=|dd…         t          k    r*|                      ¦   «          |                      ||¦  «        S |dv r8|dd…         dk    r*|                      ¦   «          |                      ||¦  «        S |S )ztHandle PROXY protocol detection and parsing.

        Returns the buffer with proxy protocol data consumed.
        é   )Úv2r   N)Úv1r   é   s   PROXY )rŒ   rÖ   ÚPP_V2_SIGNATUREÚproxy_protocol_access_checkÚ_parse_proxy_protocol_v2Ú_parse_proxy_protocol_v1rÛ   s       r.   rØ   zRequest._handle_proxy_protocolN  sÍ   € õ �#‰hŒh˜ŠmˆmØ�NŠN˜8 SÑ)Ô)Ð)õ �#‰hŒh˜Šmˆmð �>Ð!Ð! c¨#¨2¨#¤hµ/Ò&AÐ&AØ×,Ò,Ñ.Ô.Ð.Ø×0Ò0°¸3Ñ?Ô?Ð?ð �>Ð!Ð! c¨"¨1¨"¤g°Ò&:Ð&:Ø×,Ò,Ñ.Ô.Ð.Ø×0Ò0°¸3Ñ?Ô?Ð?ð ˆ
r:   c                 óì   — t          | j        t          ¦  «        rWt          | j        d         | j        j        | j                             ¦   «         ¦  «        st          | j        d         ¦  «        ‚dS dS )z2Check if proxy protocol is allowed from this peer.r   N)r†   rY   r‡   rQ   r*   Úproxy_allow_ipsÚproxy_allow_networksr   rp   s    r.   r  z#Request.proxy_protocol_access_checkd  sv   € å�t”~¥uÑ-Ô-ð 	;Ý% d¤n°QÔ&7¸¼Ô9QØ&*¤h×&CÒ&CÑ&EÔ&EñGô Gð	;õ (¨¬°qÔ(9Ñ:Ô:Ð:ð	;ð 	;ð 	;ð 	;r:   c                 ót  — t          |¦  «        }d|vr)|                      ||¦  «         t          |¦  «        }d|v°)|                     d¦  «        }t          |d|…         ¦  «        }t	          ||dz   d…         ¦  «        }|                     d¦  «        }t          |¦  «        dk    rt          |¦  «        ‚|d         }|d         }	|d         }
|dvrt          d	|z  ¦  «        ‚|d
k    r]	 t          j	        t          j
        |	¦  «         t          j	        t          j
        |
¦  «         n€# t          $ r t          |¦  «        ‚w xY w|dk    r]	 t          j	        t          j        |	¦  «         t          j	        t          j        |
¦  «         n# t          $ 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œ| _        |S )z`Parse PROXY protocol v1 (text format).

        Returns buffer with v1 header consumed.
        r{   Nr=   r~   r   r2   r>   )ÚTCP4ÚTCP6zprotocol '%s' not supportedr	  r
  rW   é   zinvalid port %sr   iÿÿ  ©r×   Úclient_addrÚclient_portÚ
proxy_addrÚ
proxy_port)rå   rÖ   rŽ   r   rÕ   r…   rŒ   r   ÚsocketÚ	inet_ptonÚAF_INETÚOSErrorÚAF_INET6r¯   rK   rÆ   )rk   rX   rÐ   r™   ró   ry   Ú	remainingÚbitsÚprotoÚs_addrÚd_addrÚs_portÚd_ports                r.   r  z Request._parse_proxy_protocol_v1k  sŒ  € õ �S‰zŒzˆØ˜TÐ!Ð!Ø�NŠN˜8 SÑ)Ô)Ð)Ý˜‘:”:ˆDð ˜TÐ!Ð!ð �iŠi˜Ñ Ô ˆÝ˜D  # œJÑ'Ô'ˆÝ˜d 3¨¡7 8 8œnÑ-Ô-ˆ	à�zŠz˜#‰Œˆåˆt‰9Œ9˜Š>ˆ>Ý" 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œ‘\”\ˆFˆFøÝð 	=ð 	=ð 	=Ý"Ð#4°tÑ#;Ñ<Ô<Ð<ð	=øøøð �fÐ%Ð%Ò%Ð% Ò%Ð%Ð%Ð%Ð%¨A°Ð,@Ð,@Ò,@Ð,@¸5Ò,@Ð,@Ð,@Ð,@Ý"Ð#4°tÑ#;Ñ<Ô<Ð<ð $Ø!Ø!Ø Ø ð$
ð $
ˆÔ ð Ðs$   Ã/>D. Ä.EÅ>F ÆF+Æ/*G ÇG7c                 óØ  — t          |¦  «        dk     r)|                      ||¦  «         t          |¦  «        dk     °)|d         }|d         }t          j        dt	          |dd…         ¦  «        ¦  «        d         }|dz  dz	  }|d	k    rt          d
|z  ¦  «        ‚|dz  }|t          j        t          j        fvrt          d|z  ¦  «        ‚d|z   }t          |¦  «        |k     r)|                      ||¦  «         t          |¦  «        |k     °)|t          j        k    r$ddddddœ| _	        t          ||d…         ¦  «        S |dz  dz	  }	|dz  }
|
t          j        k    rt          d¦  «        ‚t	          |dd|z   …         ¦  «        }|	t          j        k    r­|dk     rt          d¦  «        ‚t          j        t          j        |dd…         ¦  «        }t          j        t          j        |dd…         ¦  «        }t          j        d|dd…         ¦  «        d         }t          j        d|dd…         ¦  «        d         }d}�n|	t          j        k    r¬|dk     rt          d¦  «        ‚t          j        t          j        |dd…         ¦  «        }t          j        t          j        |dd…         ¦  «        }t          j        d|dd…         ¦  «        d         }t          j        d|dd…         ¦  «        d         }d}nF|	t          j        k    r$ddddddœ| _	        t          ||d…         ¦  «        S t          d|	z  ¦  «        ‚|||||dœ| _	        t          ||d…         ¦  «        S )zbParse PROXY protocol v2 (binary format).

        Returns buffer with v2 header consumed.
        é   rý   é   z>Hé   r   éð   rW   r=   zunsupported version %dé   zunsupported command %dr7   Nr  zonly TCP protocol is supportedz"insufficient address data for IPv4é   é
   r	  é$   z"insufficient address data for IPv6é    é"   r
  r?   zunsupported address family %d)rŒ   rÖ   ÚstructÚunpackrå   r   r1   r7   r8   rÆ   rÕ   rD   rE   r<   r@   r  Ú	inet_ntopr  rA   r  r?   )rk   rX   rÐ   Úver_cmdÚ	fam_protoÚlengthr[   ÚcommandÚtotal_header_sizeÚfamilyÚprotocolÚ	addr_datar  r  r  r  r  s                    r.   r  z Request._parse_proxy_protocol_v2¨  s”  € õ �#‰hŒh˜ŠmˆmØ�NŠN˜8 SÑ)Ô)Ð)õ �#‰hŒh˜Šmˆmð �b”'ˆØ˜”Gˆ	Ý”˜t¥U¨3¨r°"¨u¬:Ñ%6Ô%6Ñ7Ô7¸Ô:ˆð ˜T‘> aÑ'ˆØ�aŠ<ˆ<Ý$Ð%=ÀÑ%GÑHÔHÐHð ˜D‘.ˆØ�9œ?­I¬OÐ<Ð<Ð<Ý$Ð%=ÀÑ%GÑHÔHÐHð  ™KÐÝ�#‰hŒhÐ*Ò*Ð*Ø�NŠN˜8 SÑ)Ô)Ð)õ �#‰hŒhÐ*Ò*Ð*ð •i”oÒ%Ð%à")Ø#Ø#Ø"Ø"ð(ð (ˆDÔ$õ ˜SÐ!2Ð!3Ð!3Ô4Ñ5Ô5Ð5ð ˜dÑ" qÑ(ˆØ˜tÑ#ˆð •zÔ(Ò(Ð(Ý$Ð%EÑFÔFÐFå˜#˜b  f¡˜nÔ-Ñ.Ô.ˆ	à•X”]Ò"Ð"Ø˜Š{ˆ{Ý(Ð)MÑNÔNÐNÝÔ%¥f¤n°iÀÀ!À´nÑEÔEˆFÝÔ%¥f¤n°iÀÀ!À´nÑEÔEˆFÝ”] 4¨°1°R°4¬Ñ9Ô9¸!Ô<ˆFÝ”] 4¨°2°b°5Ô)9Ñ:Ô:¸1Ô=ˆFØˆE‰Eà•x”~Ò%Ð%Ø˜Š{ˆ{Ý(Ð)MÑNÔNÐNÝÔ%¥f¤o°yÀÀ2À´ÑGÔGˆFÝÔ%¥f¤o°yÀÀBÀÔ7GÑHÔHˆFÝ”] 4¨°2°b°5Ô)9Ñ:Ô:¸1Ô=ˆFÝ”] 4¨°2°b°5Ô)9Ñ:Ô:¸1Ô=ˆFØˆEˆEà•x”Ò&Ð&ð #+Ø#Ø#Ø"Ø"ð(ð (ˆDÔ$õ ˜SÐ!2Ð!3Ð!3Ô4Ñ5Ô5Ð5õ %Ð%DÀvÑ%MÑNÔNÐNð $Ø!Ø!Ø Ø ð$
ð $
ˆÔ õ ˜Ð.Ð/Ð/Ô0Ñ1Ô1Ð1r:   c                 ó$  — d„ |                      dd¦  «        D ¦   «         }t          |¦  «        dk    rt          t          |¦  «        ¦  «        ‚|d         | _        | j        j        sit                               | j        ¦  «        rt          | j        ¦  «        ‚dt          |d         ¦  «        cxk    rdk    sn t          | j        ¦  «        ‚t                               | j        ¦  «        st          | j        ¦  «        ‚| j        j        r| j                             ¦   «         | _        |d         | _        t          | j        ¦  «        dk    rt          t          |¦  «        ¦  «        ‚	 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	| j        cxk    rd
k     s"n | j        j        st+          | j        ¦  «        ‚d S d S )Nc                 ó,   — g | ]}t          |¦  «        ‘ŒS r9   rw   )rx   Úbits     r.   rz   z.Request.parse_request_line.<locals>.<listcomp>  s    € ÐGÐGÐG c•˜SÑ!Ô!ÐGÐGÐGr:   ó    r=   r>   r   é   r2   râ   r¶   )r=   r   )r…   rŒ   r   r   r½   r*   rß   ÚMETHOD_BADCHAR_REr–   r   r�   r‘   ré   r’   r¾   r   rK   r¿   rÀ   rÁ   Ú
VERSION_REr   r¯   Úgroupr[   rà   )rk   Ú
line_bytesr  rì   Úmatchs        r.   rñ   zRequest.parse_request_line  sl  € ØGÐG¨Z×-=Ò-=¸dÀAÑ-FÔ-FÐGÑGÔGˆÝˆt‰9Œ9˜Š>ˆ>Ý$¥\°*Ñ%=Ô%=Ñ>Ô>Ð>ð ˜1”gˆŒð ŒxÔ9ð 	8Ý ×'Ò'¨¬Ñ4Ô4ð 8Ý*¨4¬;Ñ7Ô7Ð7Ø�˜D œG™œÐ*Ð*Ò*Ð*¨Ò*Ð*Ð*Ð*Ý*¨4¬;Ñ7Ô7Ð7å×!Ò! $¤+Ñ.Ô.ð 	4Ý& t¤{Ñ3Ô3Ð3ð Œ8Ô(ð 	.Øœ+×+Ò+Ñ-Ô-ˆDŒKð ˜”7ˆŒõ ˆtŒx‰=Œ=˜AÒÐÝ$¥\°*Ñ%=Ô%=Ñ>Ô>Ð>ð	?Ý% d¤hÑ/Ô/ˆEˆEøÝð 	?ð 	?ð 	?Ý$¥\°*Ñ%=Ô%=Ñ>Ô>Ð>ð	?øøøà”JÐ$ "ˆŒ	Ø”[Ð& BˆŒ
ØœÐ,¨"ˆŒõ ×$Ò$ T¨!¤WÑ-Ô-ˆØˆ=Ý$ T¨!¤WÑ-Ô-Ð-Ý˜EŸKšK¨™NœNÑ+Ô+­S°·²¸Q±´Ñ-@Ô-@ÐAˆŒØ˜œÐ.Ð.Ò.Ð.¨Ò.Ð.Ð.Ð.à”8Ô>ð 7Ý(¨¬Ñ6Ô6Ð6ð /Ð.ð7ð 7s   Å1F Æ'F-c                 óØ   •— t          ¦   «                              ¦   «          t          | j        j        t
          ¦  «        r)t          t          | j        d¦  «        ¦  «        | _        d S d S )Nr   )	rÈ   rj   r†   r^   Úreaderr   r   r   rX   )rk   rÉ   s    €r.   rj   zRequest.set_body_reader<  sY   ø€ Ý‰Œ×ÒÑ!Ô!Ð!Ý�d”iÔ&­	Ñ2Ô2ð 	=Ý�\¨$¬-¸Ñ;Ô;Ñ<Ô<ˆDŒIˆIˆIð	=ð 	=r:   )r2   r¹   )r   )r3   r4   r5   rn   rÒ   rh   rÙ   rÚ   rÖ   rð   rû   rØ   r  r  r  rñ   rj   Ú__classcell__)rÉ   s   @r.   r»   r»   ~  s$  ø€ € € € € ð3ð 3ð 3ð 3ð 3ð 3ð:ð ð ð ð1ð 1ð 1ðWð Wð Wðrð ð ð@ð ð ð ð+ð +ð +ð +ð&:ð :ð :ðð ð ð,;ð ;ð ;ð;ð ;ð ;ðz[2ð [2ð [2ðz57ð 57ð 57ðn=ð =ð =ð =ð =ð =ð =ð =ð =r:   r»   )3Úenumr   rI   Úrer  r(  Úgunicorn.http.bodyr   r   r   r   Úgunicorn.http.errorsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Úgunicorn.utilr   r   r!   r#   r'   r/   r  r1   r<   rD   rÃ   rd   rf   ÚRFC9110_5_6_2_TOKEN_SPECIALSÚcompileÚescaper�   r8  r9  r•   rQ   rS   r»   r9   r:   r.   ú<module>rH     sÐ  ðð
 Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€à KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ Kðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ]Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9ð Ð ØÐ ð#Ð ð<ð <ð <ð@ F€ðð ð ð ð �ñ ô ð ðð ð ð ð ˆwñ ô ð ðð ð ð ð �ñ ô ð ð Ð Ø€Ø#Ð ð  2Ð Øˆ2Œ:Ð'¨9¨2¬9Ð5QÑ+RÔ+RÑSÑTÔT€Ø�B”J˜xÑ(Ô(Ð àˆRŒZÐ*Ñ+Ô+€
Ø$. B¤J¨{Ñ$;Ô$;Ð !ðð ð ð(_&ð _&ð _&ð _&ð _&ñ _&ô _&ð _&ðDA=ð A=ð A=ð A=ð A=ˆgñ A=ô A=ð A=ð A=ð A=r:   