Ë
    Û�ð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jT                  d ejV                  e)«      z  «      Z, ejT                  d«      Z- ejT                  d«      Z. ejT                  d«      Z/d„ Z0 G d„ d«      Z1 G d„ de1«      Z2y)é    )Ú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yt        €		 ddl}da|at        s|dk(  rt        d	«      ‚t        syt        t        d
«      s|dk(  rt        d«      ‚yg }t        D ]!  }t        | |d«      sŒ|j                  |«       Œ# |r#|dk(  rt        ddj                  |«      z  «      ‚yy# t        $ r daY Œ�w xY w)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        úP/var/www/html/Extract/venv/lib/python3.12/site-packages/gunicorn/http/message.pyÚ_check_fast_parserr/   #   s  € ô  ˜S -°Ó8€NØ˜Ò!ØäÐ%ð	+ÛØ%)Ð"Ø".Ðõ " n¸Ò&>ÜÐNÓOÐOå!Øô Ô&Ð(:Ô;Ø˜VÒ#ÜðEóð ð
 ð €LÜ/ò &ˆÜ�3˜˜eÕ$Ø×Ñ Õ%ð&ñ Ø˜VÒ#ÜðCà—)‘)˜LÓ)ñ*óð ð àøôG ò 	+Ø%*Ò"ð	+ús   ›B3 Â3CÃ Cs   

 
QUIT
c                   ó   — e Zd ZdZdZdZy)Ú	PPCommandzPROXY protocol v2 commands.r   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚLOCALÚPROXY© ó    r.   r1   r1   f   s   „ Ù%Ø€EØ�Er:   r1   c                   ó    — e Zd ZdZdZdZdZdZy)Ú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Ø�Dr:   r<   c                   ó   — e Zd ZdZdZdZdZy)Ú
PPProtocolz&PROXY protocol v2 transport protocols.r   r2   r=   N)r3   r4   r5   r6   r?   ÚSTREAMÚDGRAMr9   r:   r.   rD   rD   t   s   „ Ù0Ø€FØ€FØ�Er:   rD   iþ  i €  z!#$%&'*+-.^_`|~z[%s0-9a-zA-Z]+z[a-z#]zHTTP/(\d)\.(\d)z[\0\r\n]c                 ór   — d|v ry	 t        j                  | «      }|D ]  }||v sŒ y y# t        $ r Y yw xY w)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   ˆ   sX   € ð ˆjÑØðÜ×!Ñ! &Ó)ˆð ò ˆØ�Š=Ùðð øô ò Ùðús   ‡* ª	6µ6c                   ó2   — e Zd Zd„ Zd„ Zd„ Zdd„Zd„ Zd„ Zy)	ÚMessagec                 ót  — || _         || _        || _        || _        d | _        g | _        g | _        d | _        |j                  rdnd| _	        d| _
        d| _        |j                  | _        | j                  dk  s| j                  t        kD  rt        | _        |j                  | _        | j                  dk  rt        | _        | j                  xs t        }| j                  |dz   z  dz   | _        | j#                  | j                  «      }| j                  j%                  |«       | j'                  «        y )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  € ØˆŒØ ˆŒØ"ˆŒØ$ˆÔØˆŒØˆŒØˆŒØˆŒ	Ø!$§¢‘g°ˆŒØˆŒØ&+ˆÔ#ð %(×$<Ñ$<ˆÔ!Ø×%Ñ%¨Ò*Ø×,Ñ,¬{Ò:Ü(3ˆDÔ%Ø(+×(DÑ(DˆÔ%Ø×(Ñ(¨AÒ-Ü,HˆDÔ)ð !%× =Ñ =Ò ]ÔA]ÐØ"&×";Ñ";Ø" QÑ&ñ#(Ø*+ñ#,ˆÔð —‘˜DŸM™MÓ*ˆØ�‰×Ñ˜VÔ$Ø×ÑÕr:   c                 ó   — d| _         y )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:   c                 óð  — | j                   }g }|j                  d«      D �cg c]  }t        |«      ‘Œ }}d}i }g }	|rndt        | j                  t
        «      r2t        | j                  d   |j                  |j                  «       «      r|j                  }|j                  }	|�rËt        |«      | j                  k\  rt        d«      ‚|j                  d«      }
t        |
«      t        d«      z   }|
j                  d«      dk  rt!        |
«      ‚|
j                  dd«      \  }}| j                   j"                  r|j%                  d«      }t&        j)                  |«      st+        |«      ‚|j-                  «       }|j/                  d«      g}|r¸|d   j1                  d	«      r¤| j                   j2                  st5        |«      ‚|j                  d«      }
|t        |
«      t        d«      z   z  }|| j6                  cxkD  rdkD  rt        d
«      ‚ |j9                  |
j/                  d«      «       |r|d   j1                  d	«      rŒ¤dj;                  |«      }t<        j?                  |«      rt!        |«      ‚|| j6                  cxkD  rdkD  rt        d
«      ‚ |s;|dk(  r6|jA                  «       dk(  r| jB                  dk  rnd| _"        ntG        |«      ‚||v r2|||   k(  }|rdnd}|r|| jH                  k7  rtK        «       ‚d}|| _$        d|v rI||	v sd|	v rn@| j                   jL                  dk(  rn&| j                   jL                  dk(  r�Œ¬t+        |«      ‚|j9                  ||f«       |r�ŒË|S c c}w )Nó   
Fr   zlimit request headers fieldsz
ú:r2   ú 	)ú ú	z!limit request headers fields sizez	 ry   ÚEXPECTz100-continue©r2   r2   TrU   rV   Ú_rH   Ú	dangerousÚdrop)'r*   Úsplitr   Ú
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\   ÚlineÚlinesÚscheme_headerr…   r†   ÚcurrÚheader_lengthÚnameÚvalueÚsecurer`   s                   r.   Úparse_headerszMessage.parse_headersÂ   s[  € Ø�h‰hˆØˆð 15·
±
¸7Ó0CÖD¨”˜dÕ#ÐDˆÐDð ˆØ "ÐØÐÙð Ü˜TŸ^™^¬UÔ3Ü" 4§>¡>°!Ñ#4°c×6MÑ6MØ#&×#?Ñ#?Ó#AôCà$'×$=Ñ$=Ð!Ø #× 5Ñ 5Ðò Ü�7‹|˜t×8Ñ8Ò8Ü)Ð*HÓIÐIð —9‘9˜Q“<ˆDÜ ›I¬¨F«Ñ3ˆMØ�y‰y˜‹~ Ò"Ü# DÓ)Ð)ØŸ*™* S¨!Ó,‰KˆD�%Ø�x‰x×+Ò+Ø—{‘{ 5Ó)�Ü×%Ñ% dÔ+Ü'¨Ó-Ð-ð —:‘:“<ˆDà—[‘[ Ó'Ð(ˆEñ ˜E !™H×/Ñ/°Ô<à—x‘x×7Ò7Ü)¨$Ó/Ð/Ø—y‘y “|�Ø¤ T£¬S°«[Ñ!8Ñ8�Ø  4×#@Ñ#@ÔDÀ1ÒDÜ-ð /<ó =ð =ð Eð —‘˜TŸZ™Z¨Ó.Ô/ñ ˜E !™H×/Ñ/°Õ<ð —H‘H˜U“OˆEä0×7Ñ7¸Ô>Ü# DÓ)Ð)à˜t×<Ñ<Ô@¸qÒ@Ü)Ð*MÓNÐNð Añ   D¨HÒ$4ð —;‘;“= NÒ2Ø—|‘| fÒ,ð à6:˜Õ3ô ,¨EÓ2Ð2àÐ,Ñ,ØÐ"7¸Ñ"=Ñ=�Ù$*™°�Ù Ø §¡Ò,Ü2Ó4Ð4à$(�MØ"(�D”Kð �d‰{ØÐ,Ñ,°Ð7HÑ0HàØ—X‘X×(Ñ(¨KÒ7àØ—X‘X×(Ñ(¨FÒ2ñ ô ,¨DÓ1Ð1à�N‰N˜D %˜=Ô)óo ðr ˆùòW Es   ¢M3c                 óÞ  — d}d }| j                   D ]Ù  \  }}|dk(  r|�t        d| ¬«      ‚|}Œ|dk(  sŒ#|j                  d«      D �cg c]  }|j                  «       ‘Œ }}|D ]†  }|j	                  «       dk(  r|rt        d| ¬«      ‚d}Œ(|j	                  «       dk(  r|sŒ>t        d| ¬«      ‚|j	                  «       d	v r |rt        d| ¬«      ‚| j                  «        Œ}t        |«      ‚ ŒÛ |rP| j                  d
k  rt        d| ¬«      ‚|�t        d| ¬«      ‚t        t        | | j                  «      «      | _        y |�k	 t        |«      j                  «       rt        |«      }nt        d| ¬«      ‚	 |dk  rt        d| ¬«      ‚t        t!        | j                  |«      «      | _        y t        t#        | j                  «      «      | _        y c c}w # t        $ r t        d| ¬«      ‚w xY w)NFzCONTENT-LENGTH)ÚreqzTRANSFER-ENCODINGú,ÚchunkedTÚidentity)ÚcompressÚdeflateÚgzipr|   r   )r\   r   r€   rŽ   r’   rq   r   r[   r   r   rX   r^   ÚstrÚ	isnumericÚintrK   r   r   )rk   r¢   Úcontent_lengthr›   rœ   ÚvÚvalsÚvals           r.   rj   zMessage.set_body_reader4  sñ  € ØˆØˆà!Ÿ\™\ò 	?‰MˆT�5ØÐ'Ò'Ø!Ð-Ü'Ð(8¸dÔCÐCØ!&‘ØÐ,Ó,ð ,1¯;©;°sÓ+;Ö< a˜Ÿ™�	Ð<�Ð<Øò ?�CØ—y‘y“{ iÒ/á"Ü"/Ð0CÈÔ"NÐNØ"&™ØŸ™›¨
Ò2ò #Ü"/Ð0CÈÔ"NÐNØŸ™›Ð(GÑGá"Ü"/Ð0CÈÔ"NÐNØ×(Ñ(Õ*ä7¸Ó>Ð>ñ#?ð	?ñ8 ð �|‰|˜fÒ$ä#Ð$7¸TÔBÐBØÐ)ô $Ð$4¸$Ô?Ð?Üœ]¨4°·±Ó?Ó@ˆD�IØÐ'ð@Ü�~Ó&×0Ñ0Ô2Ü%(¨Ó%8‘Nä'Ð(8¸dÔCÐCð #ð  Ò!Ü#Ð$4¸$Ô?Ð?äœ\¨$¯-©-¸ÓHÓIˆD�IäœY t§}¡}Ó5Ó6ˆD�Iùò] =øôL ò @Ü#Ð$4¸$Ô?Ð?ð@ús   ÁGÅ2G ÇG,c                 óÊ   — | j                   ry| j                  D ]9  \  }}|dk(  sŒ|j                  «       j                  d«      }|dk(  r y|dk(  r y n | j                  dk  S )NTÚ
CONNECTIONrx   Úclosez
keep-aliveF©r2   r   )ra   r\   r’   rŽ   r[   )rk   Úhr«   s      r.   Úshould_closezMessage.should_closep  sh   € Ø�?Š?ØØ—l‘lò 	‰FˆQ�Ø�LÓ Ø—G‘G“I—O‘O EÓ*�Ø˜’<ÙØ˜,Ò&Ù Ùð	ð �|‰|˜vÑ%Ð%r:   N©F)	r3   r4   r5   rn   rq   rh   rž   rj   r³   r9   r:   r.   rS   rS   œ   s#   „ òò>ò$ópòd: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 )ÚRequestc                 ó¤  •— d | _         d | _        d | _        d | _        d | _        |j
                  | _        | j
                  dk  rt        | _        | j
                  dk(  rd| _        n;| j
                  t        k\  rt        | _        t        | _        n| j
                  | _        || _        d | _	        t        |«      | _        t        ‰| �5  |||«       y )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Ñ"8ˆÔØ×"Ñ" QÒ&Ü&6ˆDÔ#ð ×"Ñ" aÒ'Ø,7ˆDÕ)Ø×$Ñ$Ô(8Ò8Ü,<ˆDÔ)Ü&6ˆDÕ#à,0×,CÑ,CˆDÔ)à$ˆŒØ#'ˆÔ ô ,¨CÓ0ˆŒä‰Ñ˜˜h¨	Õ2r:   c                 ó”   — |j                  «       }|s%|r
t        «       ‚t        |j                  «       «      ‚|j	                  |«       y rs   )ÚreadÚStopIterationr
   ÚgetvalueÚwrite©rk   rX   ÚbufÚstopr”   s        r.   Úget_datazRequest.get_dataœ  s7   € Ø�}‰}‹ˆÙÙÜ#“oÐ%Ü˜SŸ\™\›^Ó,Ð,Ø�	‰	�$�r:   c                 ó  — t        «       }| j                  ||d¬«       | j                  j                  }|dk7  r"| j                  dk(  r| j                  |||«      }| j                  r| j                  ||«      S | j                  ||«      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ˆØ�‰�x ¨4ˆÔ0ð �x‰x×&Ñ&ˆØ�5Š=˜TŸ_™_°Ò1Ø×-Ñ-¨h¸¸TÓBˆCð �>Š>Ø×#Ñ# H¨cÓ2Ð2à×!Ñ! (¨CÓ0Ð0r:   c           	      ó²  — t        |«      }d}	 	 t        j                  ||| j                  | j                  | j
                  | j                  j                  | j                  j                  ¬«      }	 t-        |d   «      | _        t-        |d   «      | _        | j                  j2                  r| j.                  j5                  «       | _        t        | j0                  «      dk(  rt+        | j0                  «      ‚	 t7        | j0                  «      }|j:                  xs d| _        |j<                  xs d| _        |j>                  xs d| _        d|d	   f| _         g | _!        |d
   D ]¨  \  }}	t-        |«      j5                  «       }
t-        |	«      }d|
v r^| j                  jD                  }|
|v sd|v rn?| j                  jF                  dk(  rn%| j                  jF                  dk(  rŒ�t%        |
«      ‚| jB                  jI                  |
|f«       Œª |d   }||d S # t        j                  $ r\ t        |«      }| j                  ||«       t        |«      }t        |«      | j                  | j                  z   kD  rt        d«      ‚Y �n*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t        j(                  $ r}t+        t        |«      «      ‚d}~ww xY w�Œ¨# t8        $ r t+        | j0                  «      ‚w xY w)z:Parse request using fast C parser (gunicorn_h1c >= 0.4.1).r   )Ú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ˆØˆàð 1ô -×:Ñ:ØØ%Ø'+×'DÑ'DØ)-×)BÑ)BØ-1×-JÑ-JØ6:·h±h×6`Ñ6`Ø7;·x±x×7bÑ7bð ;ó �ð ô. # 6¨(Ñ#3Ó4ˆŒÜ  v¡Ó/ˆŒð �8‰8×(Ò(ØŸ+™+×+Ñ+Ó-ˆDŒKô ˆt�x‰x‹=˜AÒÜ$ T§X¡XÓ.Ð.ð	/Ü% d§h¡hÓ/ˆEð —J‘JÒ$ "ˆŒ	Ø—[‘[Ò& BˆŒ
ØŸ™Ò,¨"ˆŒð ˜6 /Ñ2Ð3ˆŒð
 ˆŒØ'-¨iÑ'8ò 	/Ñ#ˆJ˜Ü 
Ó+×1Ñ1Ó3ˆDÜ  Ó-ˆEð �d‰{Ø$(§H¡H×$>Ñ$>Ð!ØÐ,Ñ,°Ð7HÑ0HØØ—X‘X×(Ñ(¨KÒ7ØØ—X‘X×(Ñ(¨FÒ2Øä+¨DÓ1Ð1à�L‰L×Ñ  u Õ.ð!	/ð& ˜*Ñ%ˆØ�H�IˆÐøôG '×6Ñ6ò DÜ˜t›9�Ø—‘˜x¨Ô-Ü˜S“z�Ü�t“9˜t×6Ñ6¸×9VÑ9VÑVÒVÜ-Ð.BÓCÐCò Wä&×7Ñ7ò /Ü&¤s¨1£vÓ.Ð.ûÜ&×:Ñ:ò 2Ü)¬#¨a«&Ó1Ð1ûÜ&×;Ñ;ò 3Ü*¬3¨q«6Ó2Ð2ûÜ&×9Ñ9ò 1Ü(¬¨Q«Ó0Ð0ûÜ&×8Ñ8ò 0Ü'¬¨A«Ó/Ð/ûÜ&×4Ñ4ò ,Ü#¤C¨£FÓ+Ð+ûÜ&×1Ñ1ò 1Ü(¬¨Q«Ó0Ð0ûð1úñA øô` ò 	/Ü$ T§X¡XÓ.Ð.ð	/úss   �A"H Ã<N7 ÈA+N2ÊN2ÊJ1Ê1N2ËKËN2Ë1LÌN2ÌL/Ì/N2ÍMÍN2Í/NÎN2ÎN-Î-N2Î7Oc                 óÜ  — | j                  ||| j                  «      \  }}| j                  |«       t        |«      }|dd dk(  }	 |j	                  d«      }|dd dk(  }|dk  rB|s@| j                  ||«       t        |«      }t        |«      | j                  kD  rt        d«      ‚nŒb|r| j                  j                  |dd «       y| j                  |d| d¬	«      | _        ||d
z   d }|S )z'Parse request using pure Python parser.Nr=   rv   s   

r   rÜ   r:   F)r•   rW   )Ú	read_liner½   Úparse_request_linerà   r‰   rÑ   r‡   rg   r   rX   ri   rž   r\   )rk   rX   rË   r–   r”   ÚdoneÚidxÚrets           r.   rÕ   zRequest._parse_python  s  € ð —N‘N 8¨S°$×2IÑ2IÓJ‰	ˆˆcà×Ñ Ô%ô �S‹zˆà�B�Qˆx˜7Ñ"ˆØØ—)‘)˜KÓ(ˆCØ˜˜�8˜wÑ&ˆDà�QŠw™tØ—‘˜x¨Ô-Ü˜S“z�Ü�t“9˜t×6Ñ6Ò6Ü-Ð.BÓCÐCàð ñ Ø�M‰M× Ñ   a b Ô*Øà×)Ñ)¨$¨t°¨*À5Ð)ÓIˆŒà�3˜‘7�8ˆnˆØˆ
r:   c                 óŠ   — |j                  «       }|s |r
t        «       ‚t        t        |«      «      ‚|j	                  |«       y)z7Read data from unreader and append to bytearray buffer.N)rÆ   rÇ   r
   rà   ÚextendrÊ   s        r.   rÑ   zRequest.read_into,  s6   € à�}‰}‹ˆÙÙÜ#“oÐ%ÜœU 3›ZÓ(Ð(Ø�
‰
�4Õr:   c                 óB  — t        |«      }	 |j                  d«      }|dk\  r||cxkD  rdkD  rn nt        ||«      ‚nMt        |«      dz
  |cxkD  rdkD  rn nt        t        |«      |«      ‚| j	                  ||«       t        |«      }Œ~|d| t        ||dz   d «      fS )z<Read a line from buffer, returning (line, remaining_buffer).rv   r   r=   N)rà   r‰   r   r‡   rÑ   rÐ   )rk   rX   rË   Úlimitr”   rî   s         r.   rë   zRequest.read_line5  s§   € ä�S‹zˆàØ—)‘)˜GÓ$ˆCØ�aŠxà˜”? •?Ü*¨3°Ó6Ð6ØÜ�4‹y˜1‰}˜uÔ( qÕ(Ü&¤s¨4£y°%Ó8Ð8Ø�N‰N˜8 SÔ)Ü˜“:ˆDð ð �T�c�
Ü˜$˜s Q™w˜x˜.Ó)ð+ð 	+r:   c                 ó˜   — t        |«      |k  r!| j                  ||«       t        |«      |k  rŒ!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  sK   € ä�#‹h˜ÒØ�N‰N˜8 SÔ)ô �#‹h˜Óä�S˜˜%�[Ó!¤9¨S°°¨[Ó#9Ð9Ð9r:   c                 ó$  — t        |«      dk  r!| j                  ||«       t        |«      dk  rŒ!|dv r.|dd t        k(  r"| j                  «        | j	                  ||«      S |dv r*|dd dk(  r"| j                  «        | j                  ||«      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˜ŠmØ�N‰N˜8 SÔ)ô �#‹h˜‹mð �>Ñ! c¨#¨2 h´/Ò&AØ×,Ñ,Ô.Ø×0Ñ0°¸3Ó?Ð?ð �>Ñ! c¨"¨1 g°Ò&:Ø×,Ñ,Ô.Ø×0Ñ0°¸3Ó?Ð?ð ˆ
r:   c                 óö   — t        | j                  t        «      r_t        | j                  d   | j                  j
                  | j                  j                  «       «      st        | j                  d   «      ‚yy)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  s_   € ä�t—~‘~¤uÔ-Ü% d§n¡n°QÑ&7¸¿¹×9QÑ9QØ&*§h¡h×&CÑ&CÓ&EôGä'¨¯©°qÑ(9Ó:Ð:ðGð .r:   c                 óÔ  — t        |«      }d|vr"| j                  ||«       t        |«      }d|vrŒ"|j                  d«      }t        |d| «      }t	        ||dz   d «      }|j                  d«      }t        |«      dk7  rt        |«      ‚|d   }|d   }	|d   }
|dvrt        d	|z  «      ‚|d
k(  rJ	 t        j                  t        j                  |	«       t        j                  t        j                  |
«       nN|dk(  rI	 t        j                  t        j                  |	«       t        j                  t        j                  |
«       	 t        |d   «      }t        |d   «      }d|cxk  rdk  rn nd|cxk  rdk  sn t        d|z  «      ‚||	||
|dœ| _        |S # t        $ r t        |«      ‚w xY w# t        $ r t        |«      ‚w xY w# t        $ r t        d|z  «      ‚w xY w)z`Parse PROXY protocol v1 (text format).

        Returns buffer with v1 header consumed.
        rv   Nr=   ry   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î   r–   Ú	remainingÚbitsÚprotoÚs_addrÚd_addrÚs_portÚd_ports                r.   rÿ   z Request._parse_proxy_protocol_v1k  sö  € ô �S‹zˆØ˜TÑ!Ø�N‰N˜8 SÔ)Ü˜“:ˆDð ˜TÒ!ð �i‰i˜Ó ˆÜ˜D  #˜JÓ'ˆÜ˜d 3¨¡7 8˜nÓ-ˆ	à�z‰z˜#‹ˆäˆt‹9˜Š>Ü" 4Ó(Ð(ð �Q‘ˆØ�a‘ˆØ�a‘ˆð Ð(Ñ(Ü"Ð#@À5Ñ#HÓIÐIØ�FŠ?ð-Ü× Ñ ¤§¡°Ô8Ü× Ñ ¤§¡°Õ8ð �fŠ_ð-Ü× Ñ ¤§¡°&Ô9Ü× Ñ ¤§¡°&Ô9ð	=Ü˜˜a™“\ˆFÜ˜˜a™“\ˆFð �fÔ% Õ%¨A°Ô,@¸5Ô,@Ü"Ð#4°tÑ#;Ó<Ð<ð $Ø!Ø!Ø Ø ñ$
ˆÔ ð Ðøô7 ò -Ü& tÓ,Ð,ð-ûô ò -Ü& tÓ,Ð,ð-ûô ò 	=Ü"Ð#4°tÑ#;Ó<Ð<ð	=ús&   Â3AF ÄAF7 ÅG ÆF4Æ7GÇG'c                 óø  — t        |«      dk  r!| j                  ||«       t        |«      dk  rŒ!|d   }|d   }t        j                  dt	        |dd «      «      d   }|dz  dz	  }|d	k7  rt        d
|z  «      ‚|dz  }|t        j                  t        j                  fvrt        d|z  «      ‚d|z   }t        |«      |k  r!| j                  ||«       t        |«      |k  rŒ!|t        j                  k(  rddddddœ| _	        t        ||d «      S |dz  dz	  }	|dz  }
|
t        j                  k7  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}n<|	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˜ŠmØ�N‰N˜8 SÔ)ô �#‹h˜‹mð �b‘'ˆØ˜‘Gˆ	Ü—‘˜t¤U¨3¨r°"¨:Ó%6Ó7¸Ñ:ˆð ˜T‘> aÑ'ˆØ�aŠ<Ü$Ð%=ÀÑ%GÓHÐHð ˜D‘.ˆØœ9Ÿ?™?¬I¯O©OÐ<Ñ<Ü$Ð%=ÀÑ%GÓHÐHð  ™KÐÜ�#‹hÐ*Ò*Ø�N‰N˜8 SÔ)ô �#‹hÐ*Ó*ð ”i—o‘oÒ%à")Ø#Ø#Ø"Ø"ñ(ˆDÔ$ô ˜SÐ!2Ð!3Ð4Ó5Ð5ð ˜dÑ" qÑ(ˆØ˜tÑ#ˆð ”z×(Ñ(Ò(Ü$Ð%EÓFÐFä˜#˜b  f¡Ð-Ó.ˆ	à”X—]‘]Ò"Ø˜Š{Ü(Ð)MÓNÐNÜ×%Ñ%¤f§n¡n°iÀÀ!°nÓEˆFÜ×%Ñ%¤f§n¡n°iÀÀ!°nÓEˆFÜ—]‘] 4¨°1°R¨Ó9¸!Ñ<ˆFÜ—]‘] 4¨°2°bÐ)9Ó:¸1Ñ=ˆFØ‰Eà”x—~‘~Ò%Ø˜Š{Ü(Ð)MÓNÐNÜ×%Ñ%¤f§o¡o°yÀÀ2°ÓGˆFÜ×%Ñ%¤f§o¡o°yÀÀBÐ7GÓHˆFÜ—]‘] 4¨°2°bÐ)9Ó:¸1Ñ=ˆFÜ—]‘] 4¨°2°bÐ)9Ó:¸1Ñ=ˆFØ‰Eà”x—‘Ò&ð #+Ø#Ø#Ø"Ø"ñ(ˆDÔ$ô ˜SÐ!2Ð!3Ð4Ó5Ð5ô %Ð%DÀvÑ%MÓNÐNð $Ø!Ø!Ø Ø ñ$
ˆÔ ô ˜Ð.Ð/Ð0Ó1Ð1r:   c                 ó  — |j                  dd«      D �cg c]  }t        |«      ‘Œ }}t        |«      dk7  rt        t        |«      «      ‚|d   | _        | j
                  j                  sbt        j                  | j                  «      rt        | j                  «      ‚dt        |d   «      cxk  rdk  sn t        | j                  «      ‚t        j                  | j                  «      st        | j                  «      ‚| j
                  j                  r| j                  j                  «       | _        |d   | _        t        | j                  «      dk(  rt        t        |«      «      ‚	 t        | j                  «      }|j"                  xs d| _        |j$                  xs d| _        |j&                  xs d| _        t(        j                  |d   «      }|€t+        |d   «      ‚t-        |j/                  d«      «      t-        |j/                  d«      «      f| _        d| j0                  cxk  rd	k  s.n | j
                  j2                  st+        | j0                  «      ‚y y c c}w # t         $ r t        t        |«      «      ‚w xY w)
Nó    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_bytesÚbitr  rç   Úmatchs         r.   rì   zRequest.parse_request_line  s  € Ø-7×-=Ñ-=¸dÀAÓ-FÖG c”˜SÕ!ÐGˆÐGÜˆt‹9˜Š>Ü$¤\°*Ó%=Ó>Ð>ð ˜1‘gˆŒð �x‰x×9Ò9Ü ×'Ñ'¨¯©Ô4Ü*¨4¯;©;Ó7Ð7Øœ˜D ™G›Ô*¨Ô*Ü*¨4¯;©;Ó7Ð7ä×!Ñ! $§+¡+Ô.Ü& t§{¡{Ó3Ð3ð �8‰8×(Ò(ØŸ+™+×+Ñ+Ó-ˆDŒKð ˜‘7ˆŒô ˆt�x‰x‹=˜AÒÜ$¤\°*Ó%=Ó>Ð>ð	?Ü% d§h¡hÓ/ˆEð —J‘JÒ$ "ˆŒ	Ø—[‘[Ò& BˆŒ
ØŸ™Ò,¨"ˆŒô ×$Ñ$ T¨!¡WÓ-ˆØˆ=Ü$ T¨!¡WÓ-Ð-Ü˜EŸK™K¨›NÓ+¬S°·±¸Q³Ó-@ÐAˆŒØ˜Ÿ™Ô.¨Ô.à—8‘8×>Ò>Ü(¨¯©Ó6Ð6ð ?ð /ùòc HøôL ò 	?Ü$¤\°*Ó%=Ó>Ð>ð	?ús   •I&Å-I+ É+J	c                 ó´   •— t         ‰| �  «        t        | j                  j                  t
        «      r%t        t        | j                  d«      «      | _        y y )Nr   )	rÃ   rj   r�   r^   Úreaderr   r   r   rX   )rk   rÄ   s    €r.   rj   zRequest.set_body_reader<  s>   ø€ Ü‰ÑÔ!Ü�d—i‘i×&Ñ&¬	Ô2Üœ\¨$¯-©-¸Ó;Ó<ˆD�Ið 3r:   )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¶   ~  sU   ø„ õ3ó:ò1òWòró@ó+ò&:òò,;ò;òz[2òz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‹   r1  r2  r�   rQ   rS   r¶   r9   r:   r.   ú<module>rB     s  ðõ
 Û Û 	Û Û ç KÓ K÷÷ ÷ ñ ÷ ]Ñ \Ý 5ß 9ð Ð ØÐ ð#Ð ò<ð@ F€ô�ô ôˆwô ô�ô ð Ð Ø€Ø#Ð ð  2Ð Øˆ2�:‰:Ð'¨9¨2¯9©9Ð5QÓ+RÑSÓT€Ø�B—J‘J˜xÓ(Ð àˆR�Z‰ZÐ*Ó+€
Ø$. B§J¡J¨{Ó$;Ð !ò÷(_&ñ _&ôDA=ˆgõ A=r:   