Ë
    ÚŠ±jR�  ã                   ó0  — 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/ e0d«      Z1 e0d«      Z2d„ Z3 G d„ d«      Z4 G d„ de4«      Z5 G d„ d e5«      Z6y)!é    )Ú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        úZ/var/www/io.vulcan-creative.com/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[\x00-\x08\x0a-\x1f\x7f])ÚHOSTúCONTENT-LENGTHúTRANSFER-ENCODINGÚTRAILERÚAUTHORIZATIONÚTE)rG   zCONTENT-TYPEc                 ó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_listrW       sX   € ð ˆjÑØðÜ×!Ñ! &Ó)ˆð ò ˆØ�Š=Ùðð øô ò Ùðús   ‡* ª	6µ6c                   ó6   — e Zd ZdZdZdZdZdZd„ Zd„ Z		 dd„Z
y)	ÚHeaderPolicyaD  Header policy shared by every request path.

    Applies to HTTP/1 (both parsers) and HTTP/2 alike, so a rule added here
    cannot be enforced on one protocol and quietly skipped on another.
    Requires ``self.cfg``, ``self.peer_addr``, ``self.scheme`` and
    ``self.version`` to be set before any header is applied.
    NFTc                 ó¸   — | j                   }t        | j                  t        «       xs2 t	        | j                  d   |j
                  |j                  «       «      S )z7Whether the peer may set forwarding and scheme headers.r   )r*   Ú
isinstanceÚ	peer_addrÚtuplerW   Úforwarded_allow_ipsÚforwarded_allow_networks©Úselfr*   s     r.   Ú_peer_is_trusted_proxyz#HeaderPolicy._peer_is_trusted_proxyÇ   sP   € à�h‰hˆÜ˜tŸ~™~¬uÓ5Ð5ò EÜ$ T§^¡^°AÑ%6¸×8OÑ8OØ%(×%AÑ%AÓ%CóEð	Fr:   c                 ór   — | j                   }| j                  «       r|j                  |j                  fS i g fS )a>  Return the (secure_scheme_headers, forwarder_headers) the peer is allowed to set.

        When the peer's address is not in ``forwarded_allow_ips`` (or networks),
        configured forwarding/secure-scheme policy must be ignored to prevent
        spoofing.  Returns ``({}, [])`` when the peer is untrusted.
        )r*   rb   Úsecure_scheme_headersÚforwarder_headersr`   s     r.   Ú_peer_trusted_for_forwardedz(HeaderPolicy._peer_trusted_for_forwardedÎ   s9   € ð �h‰hˆØ×&Ñ&Ô(Ø×,Ñ,¨c×.CÑ.CÐCÐCØ�2ˆvˆr:   c                 ó  — |t         v r"||v rt        || ¬«      ‚|j                  |«       | j                  r=|s;|dk(  r6|j	                  «       dk(  r| j
                  dk  rnd| _        nt        |«      ‚||v r8|||   k(  }|rdnd}	|d   r|	| j                  k7  rt        «       ‚d|d<   |	| _        d	|v rP||v sd
|v r	 ||fS | j                  j                  dk(  r	 ||fS | j                  j                  dk(  ryt        |«      ‚||fS )a�  Apply per-header policy shared between Python and fast parsers.

        Mutates ``self._expected_100_continue`` and ``self.scheme`` as needed.
        ``scheme_state`` is a single-element list used as a mutable sentinel
        so the caller can detect repeated scheme headers.  ``seen`` is a set of
        the field names already accepted for this message, used the same way to
        detect repeated singleton fields.

        Returns the (name, value) pair to retain, or ``None`` to drop the
        header (per ``header_map='drop'``).  Raises the same exceptions the
        Python path raises so behavior is identical regardless of parser.
        ©ÚreqÚEXPECTz100-continue©r2   r2   TÚhttpsÚhttpr   Ú_rN   Ú	dangerousÚdropN)ÚRFC9110_5_3_SINGLETON_FIELDSr   ÚaddÚ_policy_expect_continueÚlowerÚversionÚ_expected_100_continuer   Úschemer   r*   Ú
header_mapr	   )
ra   ÚnameÚvalueÚscheme_stateÚseenrd   re   Úfrom_trailerÚsecurerw   s
             r.   Ú_apply_header_policyz!HeaderPolicy._apply_header_policyÚ   s?  € ð& Ô/Ñ/Ø�t‰|Ü# D¨dÔ3Ð3Ø�H‰H�TŒNà×(Ò(±Ø˜HÒ$ð �{‰{‹} Ò.Ø—<‘< &Ò(ð à26�DÕ/ô (¨Ó.Ð.àÐ(Ñ(ØÐ3°DÑ9Ñ9ˆFÙ &‘W¨FˆFØ˜AŠØ˜TŸ[™[Ò(Ü.Ó0Ð0à"&�˜Q‘Ø$�”ð �$‰;ØÐ(Ñ(¨CÐ3DÑ,Dàð �eˆ}Ðð —‘×$Ñ$¨Ò3àð �eˆ}Ðð —‘×$Ñ$¨Ò.ð ô (¨Ó-Ð-à�eˆ}Ðr:   ©F)r3   r4   r5   r6   rw   ru   rv   rs   rb   rf   r   r9   r:   r.   rY   rY   ´   s7   „ ñð €FØ€GØ"Ðð
 #ÐòFò
ð +0ôFr:   rY   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 )Nrl   rm   Fr   r=   é   )r*   Úunreaderr\   Úremote_addrru   ÚheadersÚtrailersÚbodyÚis_sslrw   Ú
must_closerv   Úlimit_request_fieldsÚMAX_HEADERSÚlimit_request_field_sizeÚDEFAULT_MAX_HEADERFIELD_SIZEÚmax_buffer_headersÚparseÚunreadÚset_body_reader)ra   r*   r…   r\   Ú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)r‹   ©ra   s    r.   Úforce_closezMessage.force_closeC  s	   € Øˆ�r:   c                 ó   — t        «       ‚©N)ÚNotImplementedError)ra   r…   s     r.   r‘   zMessage.parseF  s   € Ü!Ó#Ð#r:   c           	      ó*  — g }|j                  d«      D �cg c]  }t        |«      ‘Œ }}dg}t        «       }|ri g }	}n| 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!                  «       }|r|t"        v rt        |«      ‚|j%                  d«      g}|r¸|d   j'                  d	«      r¤| j                  j(                  st+        |«      ‚|j                  d«      }
|t	        |
«      t	        d«      z   z  }|| j,                  cxkD  rdkD  rt        d
«      ‚ |j/                  |
j%                  d«      «       |r|d   j'                  d	«      rŒ¤dj1                  |«      }t2        j5                  |«      rt        |«      ‚|| j,                  cxkD  rdkD  rt        d
«      ‚ | j7                  ||||||	|¬«      }|€�Œ(|j/                  |«       |r�Œ:|S c c}w )Nó   
Fzlimit request headers fieldsr   z
ú:r2   ú 	)ú ú	z!limit request headers fields sizez	 r¡   ©r}   )Úsplitr   Úsetrf   ÚlenrŒ   r   ÚpopÚfindr   r*   r   ÚrstripÚTOKEN_REÚ	fullmatchr	   ÚupperÚRFC9110_6_5_1_FORBIDDEN_TRAILERÚstripÚ
startswithr   r   rŽ   r(   r)   Ú!RFC9110_5_5_INVALID_AND_DANGEROUSÚsearchr   )ra   Údatar}   r‡   ÚlineÚlinesr{   r|   rd   re   ÚcurrÚheader_lengthry   rz   Úkepts                  r.   Úparse_headerszMessage.parse_headersI  s‡  € Øˆð 15·
±
¸7Ó0CÖD¨”˜dÕ#ÐDˆÐDð �wˆÜ‹uˆÙð 8:¸2Ð#4Ñ!à7;×7WÑ7WÓ7YÑ4Ð!Ð#4ò Ü�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ñ  Ô(GÑ GÜ'¨Ó-Ð-à—[‘[ Ó'Ð(ˆ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ð ×,Ñ,Ø�e˜\¨4Ø%Ð'8Ø)ð -ó ˆDð
 ˆ|ÙØ�N‰N˜4Ô ók ðn ˆùòK Es   –J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)NFrH   rh   rI   ú,ÚchunkedTÚidentity)ÚcompressÚdeflateÚgziprk   r   )r‡   r   r¤   r®   rt   r™   r   ru   r   r   r…   r‰   ÚstrÚ	isnumericÚintrQ   r   r   )ra   r»   Úcontent_lengthry   rz   ÚvÚvalsÚvals           r.   r“   zMessage.set_body_reader”  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Ú
CONNECTIONr    Úclosez
keep-aliveF©r2   r   )r‹   r‡   rt   r®   ru   )ra   ÚhrÄ   s      r.   Úshould_closezMessage.should_closeÐ  sh   € Ø�?Š?ØØ—l‘lò 	‰FˆQ�Ø�LÓ Ø—G‘G“I—O‘O EÓ*�Ø˜’<ÙØ˜,Ò&Ù Ùð	ð �|‰|˜vÑ%Ð%r:   Nr€   )	r3   r4   r5   r–   r™   r‘   r¸   r“   rÌ   r9   r:   r.   r‚   r‚   #  s#   „ òò>ò$óIòV:7óx&r:   r‚   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Úsuperr–   )ra   r*   r…   r\   rØ   Ú	__class__s        €r.   r–   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 r›   )ÚreadÚStopIterationr
   ÚgetvalueÚwrite©ra   r…   Ú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©ra   r…   rã   Úmodes       r.   r‘   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
g}tE        «       }	| jG                  «       \  }
}|d   D ]]  \  }}t-        |«      j5                  «       }t-        |«      }| jI                  ||||	|
|«      }|€ŒC| jB                  jK                  |«       Œ_ |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Õ   rŒ   rŽ   Ú!permit_unconventional_http_methodÚ"permit_unconventional_http_versionúmax buffer headersNrÐ   rÒ   Ú r2   Úminor_versionFr‡   Úconsumed)&Úbytesr#   Úparse_requestr×   rŒ   rŽ   r*   rò   ró   ÚIncompleteErrorr¦   ré   r�   r   r   rÀ   r   r   r	   r   Ú
ParseErrorr   r   rÐ   rÑ   Úcasefold_http_methodr¬   r   rQ   rÒ   rÓ   rÔ   ru   r‡   r¥   rf   r   r(   )ra   r…   rã   r²   rñ   ÚresultÚeÚpartsr{   r|   rd   re   Ú
name_bytesÚvalue_bytesry   rz   r·   r÷   s                     r.   rì   zRequest._parse_fast  sF  € ô �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ˆŒð ˆŒØ�wˆÜ‹uˆØ37×3SÑ3SÓ3UÑ0ÐÐ0Ø'-¨iÑ'8ò 
	&Ñ#ˆJ˜Ü 
Ó+×1Ñ1Ó3ˆDÜ  Ó-ˆEà×,Ñ,Ø�e˜\¨4Ø%Ð'8óˆDð ˆ|ØØ�L‰L×Ñ Õ%ð
	&ð ˜*Ñ%ˆØ�H�IˆÐøôE '×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"G2 Ã<N Ç2A+NÉ NÉ2JÊNÊJ0Ê0NËKËNË0LÌNÌL.Ì.NÍMÍNÍ.NÎNÎN+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=   rž   s   

r   rô   r:   Fr£   r„   )Ú	read_linerÕ   Úparse_request_linerø   r¨   ré   r¦   r�   r   r…   r’   r¸   r‡   )ra   r…   rã   r³   r²   ÚdoneÚidxÚrets           r.   rí   zRequest._parse_pythonk  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).rž   r   r=   N)rø   r¨   r   r¦   ré   rè   )ra   r…   rã   Úlimitr²   r  s         r.   r  zRequest.read_line”  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è   )ra   r…   rã   Úcounts       r.   Ú
read_byteszRequest.read_bytes§  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_protocol­  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[   r\   r]   rW   r*   Úproxy_allow_ipsÚproxy_allow_networksr   r˜   s    r.   r  z#Request.proxy_protocol_access_checkÃ  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.
        rž   Nr=   r¡   r  r2   r>   )ÚTCP4ÚTCP6zprotocol '%s' not supportedr  r  r„   é   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Â   rQ   rÙ   )ra   r…   rã   r²   r  r³   Ú	remainingÚbitsÚprotoÚs_addrÚd_addrÚs_portÚd_ports                r.   r  z Request._parse_proxy_protocol_v1Ê  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   éð   r„   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?   )ra   r…   rã   Úver_cmdÚ	fam_protoÚlengthru   Ú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                 ó2  — |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        |«      «      ‚| j                  dk(  r#| j                  dk7  rt        t        |«      «      ‚| j                  d	k7  rL| j                  dk7  r=| j                  j                  d
«      s"d| j                  vrt        t        |«      «      ‚	 t!        | j                  «      }|j$                  xs d| _        |j&                  xs d| _        |j(                  xs d| _        t*        j                  |d   «      }|€t-        |d   «      ‚t/        |j1                  d«      «      t/        |j1                  d«      «      f| _        d| j2                  cxk  rdk  s.n | j
                  j4                  st-        | j2                  «      ‚y y c c}w # t"        $ r t        t        |«      «      ‚w xY w)Nó    r=   r>   r   é   r2   rN   ÚOPTIONSÚCONNECTú/z://rõ   rÊ   )r=   r   )r¤   r   r¦   r   rÐ   r*   rò   ÚMETHOD_BADCHAR_REr±   r   rª   r«   rü   r¬   rÑ   r¯   r   rQ   rÒ   rÓ   rÔ   Ú
VERSION_REr   rÂ   Úgroupru   ró   )ra   Ú
line_bytesÚbitr*  rÿ   Úmatchs         r.   r  zRequest.parse_request_lined  sz  € Ø-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ÒÜ$¤\°*Ó%=Ó>Ð>ð �8‰8�sŠ?˜tŸ{™{¨iÒ7Ü$¤\°*Ó%=Ó>Ð>ð
 �K‰K˜9Ò$Ø—H‘H ’OØŸ™×+Ñ+¨CÔ0Ø §¡Ñ)Ü$¤\°*Ó%=Ó>Ð>ð	?Ü% d§h¡hÓ/ˆEð —J‘JÒ$ "ˆŒ	Ø—[‘[Ò& BˆŒ
ØŸ™Ò,¨"ˆŒô ×$Ñ$ T¨!¡WÓ-ˆØˆ=Ü$ T¨!¡WÓ-Ð-Ü˜EŸK™K¨›NÓ+¬S°·±¸Q³Ó-@ÐAˆŒØ˜Ÿ™Ô.¨Ô.à—8‘8×>Ò>Ü(¨¯©Ó6Ð6ð ?ð /ùò} Høôf ò 	?Ü$¤\°*Ó%=Ó>Ð>ð	?ús   •K3Ç:K8 Ë8Lc                 ó´   •— t         ‰| �  «        t        | j                  j                  t
        «      r%t        t        | j                  d«      «      | _        y y )Nr   )	rÛ   r“   r[   r‰   Úreaderr   r   r   r…   )ra   rÜ   s    €r.   r“   zRequest.set_body_reader¨  s>   ø€ Ü‰ÑÔ!Ü�d—i‘i×&Ñ&¬	Ô2Üœ\¨$¯-©-¸Ó;Ó<ˆD�Ið 3r:   )r2   r€   )r   )r3   r4   r5   r–   rå   r‘   rì   rí   ré   r  r  rë   r  r  r  r  r“   Ú__classcell__)rÜ   s   @r.   rÎ   rÎ   Þ  sV   ø„ õ3ó:ò1òVòpó@ó+ò&:òò,;ò;òz[2òzB7÷H=ð =r:   rÎ   )7Úenumr   rO   Ú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Ö   r�   r�   ÚRFC9110_5_6_2_TOKEN_SPECIALSÚcompileÚescaperª   rL  rM  r°   Ú	frozensetr­   rq   rW   rY   r‚   rÎ   r9   r:   r.   ú<module>r^     sM  ðõ
 Û Û 	Û Û ç 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Ð/JÓ$KÐ !ñ
 #,ð -ó #Ð ñ  )ð *ó  Ð ò÷(lñ lô^x&ˆlô x&ôvM=ˆgõ M=r:   