Ë
    oj;  ã                   óÐ  — d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZmZmZ ddlmZ ddlmZmZmZmZmZmZ dd	lmZmZ dd
lmZ ddlm Z m!Z! dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ* G d„ dejV                  «      Z, G d„ d«      Z- G d„ de-ej\                  «      Z/ G d„ de-ej\                  «      Z0 G d„ dej\                  «      Z1 G d„ d ej\                  «      Z2d!„ Z3y)"z!
Tests for L{twisted.web.twcgi}.
é    N)ÚBytesIO)ÚaddressÚerrorÚ
interfacesÚreactor)ÚConnectionLost)ÚfailureÚlogÚutil)Úunittest)ÚclientÚhttpÚhttp_headersÚresourceÚserverÚtwcgi)ÚINTERNAL_SERVER_ERRORÚ	NOT_FOUND)Ú_render)ÚDummyChannelÚDummyRequestz2print("Header: OK")
print("")
print("cgi output")
zJprint("Header: spam")
print("Header: eggs")
print("")
print("cgi output")
z+print("XYZ")
print("")
print("cgi output")
zPprint("Server: monkeys")
print("Date: last year")
print("")
print("cgi output")
a&  # This is an example of a correctly-written CGI script which reads a body
# from stdin, which only reads env['CONTENT_LENGTH'] bytes.

import os, sys

body_length = int(os.environ.get('CONTENT_LENGTH',0))
indata = sys.stdin.read(body_length)
print("Header: OK")
print("")
print("readinput ok")
a+  # This is an example of the typical (incorrect) CGI script which expects
# the server to close stdin when the body of the request is complete.
# A correct CGI should only read env['CONTENT_LENGTH'] bytes.

import sys

indata = sys.stdin.read()
print("Header: OK")
print("")
print("readallinput ok")
zMprint("content-type: text/cgi-duplicate-test")
print("")
print("cgi output")
z†import json
import os
print("")
print("")
vals = {x:y for x,y in os.environ.items() if x.startswith("HTTP_")}
print(json.dumps(vals))
z]import os
param = str(os.environ['QUERY_STRING'])
print("Header: OK")
print("")
print(param)
c                   ó$   — e Zd Zej                  Zy)ÚPythonScriptN)Ú__name__Ú
__module__Ú__qualname__ÚsysÚ
executableÚfilter© ó    ú;/usr/lib/python3/dist-packages/twisted/web/test/test_cgi.pyr   r   b   s   „ Ø�^‰^�Fr!   r   c                   ó   — e Zd Zd„ Zd„ Zd„ Zy)Ú_StartServerAndTearDownMixinc                 ó<  — t        j                  «       }t        j                  t        |«      }|j                  dt        |«      «       t        j                  |«      }t        j                  d|«      | _        | j                  j                  «       j                  S )Ns   cgir   )r   ÚResourcer   ÚsibpathÚ__file__ÚputChildr   r   ÚSiter   Ú	listenTCPÚpÚgetHostÚport)ÚselfÚcgiÚrootÚcgipathÚsites        r"   ÚstartServerz(_StartServerAndTearDownMixin.startServerg   sl   € Ü× Ñ Ó"ˆÜ—,‘,œx¨Ó-ˆØ�‰�fœl¨7Ó3Ô4Ü�{‰{˜4Ó ˆÜ×"Ñ" 1 dÓ+ˆŒØ�v‰v�~‰~Ó×$Ñ$Ð$r!   c                 óR   — t        | dd «      r| j                  j                  «       S y )Nr,   )Úgetattrr,   ÚstopListening)r/   s    r"   ÚtearDownz%_StartServerAndTearDownMixin.tearDowno   s&   € Ü�4˜˜dÔ#Ø—6‘6×'Ñ'Ó)Ð)ð $r!   c                 óÆ   — t         j                  j                  | j                  «       «      }t	        |d«      5 }|j                  |«       d d d «       |S # 1 sw Y   |S xY w)NÚwt)ÚosÚpathÚabspathÚmktempÚopenÚwrite)r/   ÚsourceÚcgiFilenameÚcgiFiles       r"   ÚwriteCGIz%_StartServerAndTearDownMixin.writeCGIs   sN   € Ü—g‘g—o‘o d§k¡k£mÓ4ˆÜ�+˜tÓ$ð 	"¨Ø�M‰M˜&Ô!÷	"àÐ÷	"àÐús   ºAÁA N)r   r   r   r4   r8   rD   r    r!   r"   r$   r$   f   s   „ ò%ò*ór!   r$   c                   óÈ   — e Zd ZdZej
                  j                  e«      sdZd„ Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd	„ Zd
„ Zde_        d„ Zd„ Zde_        d„ Zd„ Zde_        d„ Zd„ Zy)ÚCGITestsz,
    Tests for L{twcgi.FilteredScript}.
    z5CGI tests require a functional reactor.spawnProcess()c                 óF  — | j                  t        «      }| j                  |«      }d|fz  }|j                  d«      }t	        j
                  t        «      j                  d|«      }|j                  t        j                  «       |j                  | j                  «       |S )Núhttp://localhost:%d/cgiÚasciió   GET)rD   Ú	DUMMY_CGIr4   Úencoder   ÚAgentr   ÚrequestÚaddCallbackÚreadBodyÚ
_testCGI_1)r/   rB   ÚportnumÚurlÚds        r"   Útest_CGIzCGITests.test_CGI‚   sz   € Ø—m‘m¤IÓ.ˆà×"Ñ" ;Ó/ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆÜ�L‰LœÓ!×)Ñ)¨&°#Ó6ˆØ	�‰”f—o‘oÔ&Ø	�‰�d—o‘oÔ&Øˆr!   c                 óh   — | j                  |dt        j                  j                  d«      z   «       y )Ns
   cgi outputrI   )ÚassertEqualr;   ÚlineseprL   )r/   Úress     r"   rQ   zCGITests._testCGI_1�   s&   € Ø×Ñ˜˜m¬b¯j©j×.?Ñ.?ÀÓ.HÑHÕIr!   c                 ó.  ‡ — ‰ j                  t        «      }‰ j                  |«      }d|fz  }|j                  d«      }t	        j
                  t        «      }|j                  d|«      }|j                  t        «       ˆ fd„}|j                  |«       |S )zc
        If the CGI script emits a I{Server} or I{Date} header, these are
        ignored.
        rH   rI   rJ   c                 ó²   •— ‰j                  d| j                  j                  d«      «       ‰j                  d| j                  j                  d«      «       y )NÚmonkeysr   z	last yearÚdate)ÚassertNotInÚheadersÚgetRawHeaders©Úresponser/   s    €r"   ÚcheckResponsez;CGITests.test_protectedServerAndDate.<locals>.checkResponsež   sE   ø€ Ø×Ñ˜Y¨×(8Ñ(8×(FÑ(FÀxÓ(PÔQØ×Ñ˜[¨(×*:Ñ*:×*HÑ*HÈÓ*PÕQr!   )
rD   ÚSPECIAL_HEADER_CGIr4   rL   r   rM   r   rN   rO   ÚdiscardBody©r/   rB   rR   rS   ÚagentrT   rc   s   `      r"   Útest_protectedServerAndDatez$CGITests.test_protectedServerAndDate�   s�   ø€ ð
 —m‘mÔ$6Ó7ˆà×"Ñ" ;Ó/ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆÜ—‘œWÓ%ˆØ�M‰M˜& #Ó&ˆØ	�‰”kÔ"ô	Rð 	
�‰�mÔ$Øˆr!   c                 ó.  ‡ — ‰ j                  t        «      }‰ j                  |«      }d|fz  }|j                  d«      }t	        j
                  t        «      }|j                  d|«      }|j                  t        «       ˆ fd„}|j                  |«       |S )z¤
        If the CGI script emits a I{content-type} header, make sure that the
        server doesn't add an additional (duplicate) one, as per ticket 4786.
        rH   rI   rJ   c                 ó`   •— ‰j                  | j                  j                  d«      dg«       | S )Nzcontent-typeztext/cgi-duplicate-test©rW   r_   r`   ra   s    €r"   rc   zBCGITests.test_noDuplicateContentTypeHeaders.<locals>.checkResponse³   s2   ø€ Ø×ÑØ× Ñ ×.Ñ.¨~Ó>Ø*Ð+ôð ˆOr!   )
rD   Ú$NO_DUPLICATE_CONTENT_TYPE_HEADER_CGIr4   rL   r   rM   r   rN   rO   re   rf   s   `      r"   Ú"test_noDuplicateContentTypeHeadersz+CGITests.test_noDuplicateContentTypeHeaders¥   s€   ø€ ð
 —m‘mÔ$HÓIˆà×"Ñ" ;Ó/ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆÜ—‘œWÓ%ˆØ�M‰M˜& #Ó&ˆØ	�‰”kÔ"ô	ð 	
�‰�mÔ$Øˆr!   c                 óz  ‡ — ‰ j                  t        «      }‰ j                  |«      }d|fz  }|j                  d«      }t	        j
                  t        «      }t        j                  dgdgdœ«      }|j                  d||¬«      }ˆ fd„}|j                  t        j                  «       |j                  |«       |S )	zV
        The CGI script is never called with the Proxy header passed through.
        rH   rI   s   foos   bar)s   Proxys   X-Innocent-HeaderrJ   )r_   c                 ó¤   •— t        j                  | j                  d«      «      }‰j                  t	        |j                  «       «      h d£«       y )NrI   >   Ú	HTTP_HOSTÚHTTP_CONNECTIONÚHTTP_X_INNOCENT_HEADER)ÚjsonÚloadsÚdecoderW   ÚsetÚkeys)rb   r_   r/   s     €r"   rc   z7CGITests.test_noProxyPassthrough.<locals>.checkResponseÎ   s9   ø€ Ü—j‘j §¡°Ó!9Ó:ˆGØ×ÑÜ�G—L‘L“NÓ#ÚJõr!   )rD   ÚHEADER_OUTPUT_CGIr4   rL   r   rM   r   r   ÚHeadersrN   rO   rP   )r/   rB   rR   rS   rg   r_   rT   rc   s   `       r"   Útest_noProxyPassthroughz CGITests.test_noProxyPassthrough½   s¦   ø€ ð —m‘mÔ$5Ó6ˆà×"Ñ" ;Ó/ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆä—‘œWÓ%ˆä×&Ñ&Ø�x¸°xÑ@ó
ˆð �M‰M˜& #¨wˆMÓ7ˆô	ð 	
�‰”f—o‘oÔ&Ø	�‰�mÔ$Øˆr!   c                 ó.  ‡ — ‰ j                  t        «      }‰ j                  |«      }d|fz  }|j                  d«      }t	        j
                  t        «      }|j                  d|«      }|j                  t        «       ˆ fd„}|j                  |«       |S )zp
        If a CGI script emits two instances of the same header, both are sent
        in the response.
        rH   rI   rJ   c                 ó`   •— ‰j                  | j                  j                  d«      ddg«       y )NÚheaderÚspamÚeggsrk   ra   s    €r"   rc   z7CGITests.test_duplicateHeaderCGI.<locals>.checkResponseç   s*   ø€ Ø×Ñ˜X×-Ñ-×;Ñ;¸HÓEÈÐPVÐGWÕXr!   )
rD   ÚDUAL_HEADER_CGIr4   rL   r   rM   r   rN   rO   re   rf   s   `      r"   Útest_duplicateHeaderCGIz CGITests.test_duplicateHeaderCGIÙ   s€   ø€ ð
 —m‘m¤OÓ4ˆà×"Ñ" ;Ó/ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆÜ—‘œWÓ%ˆØ�M‰M˜& #Ó&ˆØ	�‰”kÔ"ô	Yð 	
�‰�mÔ$Øˆr!   c                 óª  ‡ ‡— ‰ j                  t        «      }‰ j                  |«      }d|fz  }|j                  d«      }t	        j
                  t        «      }|j                  d|«      }|j                  t        «       g Šˆfd„}t        j                  |«       ‰ j                  t        j                  |«       ˆˆ fd„}|j                  |«       |S )zF
        Check for the error message in the duplicated header
        rH   rI   rJ   c                 óN   •— ‰j                  t        j                  | «      «       y ©N)Úappendr
   ÚtextFromEventDict)Ú	eventDictÚloggedMessagess    €r"   Ú
addMessagez4CGITests.test_malformedHeaderCGI.<locals>.addMessageû   s   ø€ Ø×!Ñ!¤#×"7Ñ"7¸	Ó"BÕCr!   c                 óB   •— ‰j                  dt        d«      z   ‰«       y )Nzignoring malformed CGI header: s   XYZ)ÚassertInÚrepr)Úignoredrˆ   r/   s    €€r"   rc   z7CGITests.test_malformedHeaderCGI.<locals>.checkResponse  s   ø€ Ø�M‰MØ1´D¸³LÑ@À.õr!   )rD   ÚBROKEN_HEADER_CGIr4   rL   r   rM   r   rN   rO   re   r
   ÚaddObserverÚ
addCleanupÚremoveObserver)	r/   rB   rR   rS   rg   rT   r‰   rc   rˆ   s	   `       @r"   Útest_malformedHeaderCGIz CGITests.test_malformedHeaderCGIí   s­   ù€ ð —m‘mÔ$5Ó6ˆà×"Ñ" ;Ó/ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆÜ—‘œWÓ%ˆØ�M‰M˜& #Ó&ˆØ	�‰”kÔ"Øˆô	Dô 	�‰˜
Ô#Ø�‰œ×*Ñ*¨JÔ7õ	ð
 	
�‰�mÔ$Øˆr!   c                 óæ  — t         j                  j                  | j                  «       «      }t	        |d«      5 }|j                  t        «       d d d «       | j                  |«      }t        j                  t        «      }d|fz  }|j                  d«      }|j                  d|«      }|j                  t        j                  «       |j                  | j                  «       |S # 1 sw Y   Œ˜xY w)Nr:   rH   rI   rJ   )r;   r<   r=   r>   r?   r@   ÚREADINPUT_CGIr4   r   rM   r   rL   rN   rO   rP   Ú_test_ReadEmptyInput_1©r/   rB   rC   rR   rg   rS   rT   s          r"   Útest_ReadEmptyInputzCGITests.test_ReadEmptyInput	  s¸   € Ü—g‘g—o‘o d§k¡k£mÓ4ˆÜ�+˜tÓ$ð 	)¨Ø�M‰Mœ-Ô(÷	)ð ×"Ñ" ;Ó/ˆÜ—‘œWÓ%ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆØ�M‰M˜& #Ó&ˆØ	�‰”f—o‘oÔ&Ø	�‰�d×1Ñ1Ô2Øˆ÷	)ð 	)ús   ºC'Ã'C0é   c                 óp   — dt         j                  › �}|j                  d«      }| j                  ||«       y ©Nzreadinput okrI   ©r;   rX   rL   rW   ©r/   rY   Úexpecteds      r"   r•   zCGITests._test_ReadEmptyInput_1  ó0   € Ø!¤"§*¡* Ð.ˆØ—?‘? 7Ó+ˆØ×Ñ˜˜hÕ'r!   c           	      ó"  — t         j                  j                  | j                  «       «      }t	        |d«      5 }|j                  t        «       d d d «       | j                  |«      }t        j                  t        «      }d|fz  }|j                  d«      }|j                  |dt        j                  t        d«      «      ¬«      }|j                  t        j                   «       |j                  | j"                  «       |S # 1 sw Y   Œ¶xY w©Nr:   rH   rI   s   POSTs   Here is your stdin)ÚuriÚmethodÚbodyProducer)r;   r<   r=   r>   r?   r@   r”   r4   r   rM   r   rL   rN   ÚFileBodyProducerr   rO   rP   Ú_test_ReadInput_1r–   s          r"   Útest_ReadInputzCGITests.test_ReadInput  s×   € Ü—g‘g—o‘o d§k¡k£mÓ4ˆÜ�+˜tÓ$ð 	)¨Ø�M‰Mœ-Ô(÷	)ð ×"Ñ" ;Ó/ˆÜ—‘œWÓ%ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆØ�M‰MØØÜ×0Ñ0´Ð9NÓ1OÓPð ó 
ˆð
 	
�‰”f—o‘oÔ&Ø	�‰�d×,Ñ,Ô-Øˆ÷	)ð 	)ús   ºDÄDc                 óp   — dt         j                  › �}|j                  d«      }| j                  ||«       y rš   r›   rœ   s      r"   r¥   zCGITests._test_ReadInput_12  rž   r!   c           	      ó  — t         j                  j                  | j                  «       «      }t	        |d«      5 }|j                  t        «       d d d «       | j                  |«      }d|fz  }|j                  d«      }t        j                  t        «      j                  |dt        j                  t        d«      «      ¬«      }|j                  t        j                   «       |j                  | j"                  «       |S # 1 sw Y   Œ´xY wr    )r;   r<   r=   r>   r?   r@   ÚREADALLINPUT_CGIr4   rL   r   rM   r   rN   r¤   r   rO   rP   Ú_test_ReadAllInput_1)r/   rB   rC   rR   rS   rT   s         r"   Útest_ReadAllInputzCGITests.test_ReadAllInput7  sÕ   € Ü—g‘g—o‘o d§k¡k£mÓ4ˆÜ�+˜tÓ$ð 	,¨Ø�M‰MÔ*Ô+÷	,ð ×"Ñ" ;Ó/ˆØ'¨7¨*Ñ4ˆØ�j‰j˜Ó!ˆÜ�L‰LœÓ!×)Ñ)ØØÜ×0Ñ0´Ð9NÓ1OÓPð *ó 
ˆð
 	
�‰”f—o‘oÔ&Ø	�‰�d×/Ñ/Ô0Øˆ÷	,ð 	,ús   ºDÄDc                 óp   — dt         j                  › �}|j                  d«      }| j                  ||«       y )Nzreadallinput okrI   r›   rœ   s      r"   rª   zCGITests._test_ReadAllInput_1J  s0   € Ø$¤R§Z¡Z LÐ1ˆØ—?‘? 7Ó+ˆØ×Ñ˜˜hÕ'r!   c                 óô   —  G d„ d«      } |«       }t        ddg«      }t        j                  ddd«      |_        t	        j
                  d|¬	«      }t        ||«       | j                  |j                  «       y
)zw
        L{twcgi.FilteredScript.runProcess} uses the reactor passed as an
        argument to the constructor.
        c                   ó   — e Zd ZdZdZd„ Zy)ú5CGITests.test_useReactorArgument.<locals>.FakeReactorzR
            A fake reactor recording whether spawnProcess is called.
            Fc                 ó   — d| _         y)zÇ
                Set the C{called} flag to C{True} if C{spawnProcess} is called.

                @param args: Positional arguments.
                @param kwargs: Keyword arguments.
                TN)Úcalled)r/   ÚargsÚkwargss      r"   ÚspawnProcesszBCGITests.test_useReactorArgument.<locals>.FakeReactor.spawnProcess\  s   € ð #�•r!   N)r   r   r   Ú__doc__r±   r´   r    r!   r"   ÚFakeReactorr¯   U  s   „ ñð ˆFó#r!   r¶   ÚaÚbÚTCPú	127.0.0.1é90  z
dummy-file©r   N)	r   r   ÚIPv4Addressr   r   ÚFilteredScriptr   Ú
assertTruer±   )r/   r¶   ÚfakeReactorrN   r   s        r"   Útest_useReactorArgumentz CGITests.test_useReactorArgumentO  sg   € ÷	#ñ 	#ñ  "“mˆÜ  S˜zÓ*ˆÜ ×,Ñ,¨U°KÀÓGˆŒÜ×'Ñ'¨¸kÔJˆÜ�˜'Ô"à�‰˜×*Ñ*Õ+r!   N)r   r   r   rµ   r   ÚIReactorProcessÚ
providedByr   ÚskiprU   rQ   rh   rm   rz   r�   r’   r—   Útimeoutr•   r¦   r¥   r«   rª   rÁ   r    r!   r"   rF   rF   z   s‰   „ ñð ×%Ñ%×0Ñ0°Ô9ØFˆò	òJòò*ò0ò8ò(ò8ð #$ÐÔò(ò
ð$ €NÔò(ò
ð" !"ÐÔò(ó
,r!   rF   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚCGIScriptTestsz'
    Tests for L{twcgi.CGIScript}.
    c                 ó(  — | j                  t        «      }| j                  |«      }d|fz  }t        j                  t
        «      }|j                  d|«      }|j                  t        j                  «       |j                  | j                  «       |S )zk
        If the CGI script is passed URL parameters, do not fall over,
        as per ticket 9887.
        s"   http://localhost:%d/cgi?param=1234rJ   )
rD   ÚURL_PARAMETER_CGIr4   r   rM   r   rN   rO   rP   Ú_test_urlParameters_1)r/   rB   rR   rS   rg   rT   s         r"   Útest_urlParametersz!CGIScriptTests.test_urlParameterss  st   € ð
 —m‘mÔ$5Ó6ˆØ×"Ñ" ;Ó/ˆØ3°w°jÑ@ˆÜ—‘œWÓ%ˆØ�M‰M˜& #Ó&ˆØ	�‰”f—o‘oÔ&Ø	�‰�d×0Ñ0Ô1Øˆr!   c                 óp   — dt         j                  › �}|j                  d«      }| j                  ||«       y )Nz
param=1234rI   r›   rœ   s      r"   rÊ   z$CGIScriptTests._test_urlParameters_1�  s0   € Ø¤§
¡
˜|Ð,ˆØ—?‘? 7Ó+ˆØ×Ñ˜˜hÕ'r!   c                 ó  —  G d„ d«      } |«       }t        j                  | j                  «       |¬«      }t        ddg«      }t	        j
                  ddd«      |_        t        ||«       | j                  |j                  d	   d
«       y)zt
        L{twcgi.CGIScript.render} sets the process environment
        I{PATH_INFO} from the request path.
        c                   ó   — e Zd ZdZd„ Zy)ú1CGIScriptTests.test_pathInfo.<locals>.FakeReactorzZ
            A fake reactor recording the environment passed to spawnProcess.
            c                 ó   — || _         y)a9  
                Store the C{env} L{dict} to an instance attribute.

                @param process: Ignored
                @param filename: Ignored
                @param args: Ignored
                @param env: The environment L{dict} which will be stored
                @param wdir: Ignored
                N)Úprocess_env)r/   ÚprocessÚfilenamer²   ÚenvÚwdirs         r"   r´   z>CGIScriptTests.test_pathInfo.<locals>.FakeReactor.spawnProcess‘  s   € ð $'�Õ r!   N)r   r   r   rµ   r´   r    r!   r"   r¶   rÏ   Œ  s   „ ñó
'r!   r¶   r¼   r·   r¸   r¹   rº   r»   Ú	PATH_INFOz/a/bN)
r   Ú	CGIScriptr>   r   r   r½   r   r   rW   rÑ   )r/   r¶   Ú_reactorr   rN   s        r"   Útest_pathInfozCGIScriptTests.test_pathInfo†  st   € ÷	'ñ 	'ñ" “=ˆÜ—?‘? 4§;¡;£=¸(ÔCˆÜ  S˜zÓ*ˆÜ ×,Ñ,¨U°KÀÓGˆŒÜ�˜'Ô"à×Ñ˜×-Ñ-¨kÑ:¸FÕCr!   N)r   r   r   rµ   rË   rÊ   rÙ   r    r!   r"   rÇ   rÇ   n  s   „ ñòò(ó
Dr!   rÇ   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚCGIDirectoryTestsz*
    Tests for L{twcgi.CGIDirectory}.
    c                 ó®   ‡ ‡— t        j                  ‰ j                  «       «      }t        dg«      Št	        |‰«      }ˆˆ fd„}|j                  |«       |S )zc
        L{twcgi.CGIDirectory.render} sets the HTTP response code to I{NOT
        FOUND}.
        Ú c                 óF   •— ‰j                  ‰j                  t        «       y r„   ©rW   ÚresponseCoder   ©r�   rN   r/   s    €€r"   Ú
cbRenderedz1CGIDirectoryTests.test_render.<locals>.cbRendered´  ó   ø€ Ø×Ñ˜W×1Ñ1´9Õ=r!   )r   ÚCGIDirectoryr>   r   r   rO   )r/   r   rT   râ   rN   s   `   @r"   Útest_renderzCGIDirectoryTests.test_render«  sK   ù€ ô
 ×%Ñ% d§k¡k£mÓ4ˆÜ ˜tÓ$ˆÜ�H˜gÓ&ˆõ	>ð 	
�‰�jÔ!Øˆr!   c                 ó  ‡ ‡— ‰ j                  «       }t        j                  |«       t        j                  |«      }t        dg«      Š |j                  d‰«      }t        |‰«      }ˆˆ fd„}|j                  |«       |S )a  
        L{twcgi.CGIDirectory.getChild} returns a resource which renders an
        response with the HTTP I{NOT FOUND} status code if the indicated child
        does not exist as an entry in the directory used to initialized the
        L{twcgi.CGIDirectory}.
        Úfooc                 óF   •— ‰j                  ‰j                  t        «       y r„   rß   rá   s    €€r"   râ   z8CGIDirectoryTests.test_notFoundChild.<locals>.cbRenderedÈ  rã   r!   )	r>   r;   Úmakedirsr   rä   r   ÚgetChildr   rO   )r/   r<   r   ÚchildrT   râ   rN   s   `     @r"   Útest_notFoundChildz$CGIDirectoryTests.test_notFoundChildº  sp   ù€ ð �{‰{‹}ˆÜ
�‰�DÔÜ×%Ñ% dÓ+ˆÜ ˜wÓ'ˆØ!�×!Ñ! %¨Ó1ˆÜ�E˜7Ó#ˆõ	>ð 	
�‰�jÔ!Øˆr!   N)r   r   r   rµ   rå   rì   r    r!   r"   rÛ   rÛ   ¦  s   „ ñòór!   rÛ   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚCGIProcessProtocolTestsz0
    Tests for L{twcgi.CGIProcessProtocol}.
    c                 óò   — t        dg«      }t        j                  |«      }|j                  t	        j
                  t        j                  «       «      «       | j                  |j                  t        «       y)zÂ
        If the process communicating with L{CGIProcessProtocol} ends before
        finishing writing out headers, the response has I{INTERNAL SERVER
        ERROR} as its status code.
        rÝ   N)r   r   ÚCGIProcessProtocolÚprocessEndedr	   ÚFailurer   ÚProcessTerminatedrW   rà   r   )r/   rN   Úprotocols      r"   Útest_prematureEndOfHeadersz2CGIProcessProtocolTests.test_prematureEndOfHeadersÔ  sW   € ô  ˜tÓ$ˆÜ×+Ñ+¨GÓ4ˆØ×ÑœgŸo™o¬e×.EÑ.EÓ.GÓHÔIØ×Ñ˜×-Ñ-Ô/DÕEr!   c                 ó4  — t        «       }t        j                  |d«      }t        j                  |«      }|j                  t        j                  t        d«      «      «       |j                  t        j                  t        j                  «       «      «       y)zg
        Ensure that the CGI process ends cleanly when the request connection
        is lost.
        TzConnection doneN)r   r   ÚRequestr   rð   ÚconnectionLostr	   rò   r   rñ   r   ró   )r/   rT   rN   rô   s       r"   Útest_connectionLostz+CGIProcessProtocolTests.test_connectionLostß  sh   € ô
 ‹NˆÜ—,‘,˜q $Ó'ˆÜ×+Ñ+¨GÓ4ˆØ×ÑœwŸ™¬~Ð>OÓ/PÓQÔRØ×ÑœgŸo™o¬e×.EÑ.EÓ.GÓHÕIr!   N)r   r   r   rµ   rõ   rù   r    r!   r"   rî   rî   Ï  s   „ ñò	Fó	Jr!   rî   c                 óR   ‡ — t        j                  ‰ «      j                  ˆ fd„«      S )zn
    Discard the body of a HTTP response.

    @param response: The response.

    @return: The response.
    c                 ó   •— ‰S r„   r    )Ú_rb   s    €r"   ú<lambda>zdiscardBody.<locals>.<lambda>ó  s   ø€ ¸8€ r!   )r   rP   rO   )rb   s   `r"   re   re   ë  s    ø€ ô �?‰?˜8Ó$×0Ñ0Ó1CÓDÐDr!   )4rµ   rs   r;   r   Úior   Útwisted.internetr   r   r   r   Útwisted.internet.errorr   Útwisted.pythonr	   r
   r   Útwisted.trialr   Útwisted.webr   r   r   r   r   r   Útwisted.web.httpr   r   Útwisted.web.test._utilr   Útwisted.web.test.requesthelperr   r   rK   r€   rŽ   rd   r”   r©   rl   rx   rÉ   r¾   r   r$   ÚTestCaserF   rÇ   rÛ   rî   re   r    r!   r"   ú<module>r     s÷   ðñó Û 	Û 
Ý ç @Ó @Ý 1ß -Ñ -Ý "ß K× Kß =Ý *ß Eð€	ð€ðÐ ðÐ ð€ðÐ ð(Ð $ðÐ ðÐ ô�5×'Ñ'ô ÷ñ ô(q,Ð+¨X×->Ñ->ô q,ôh5DÐ1°8×3DÑ3Dô 5Dôp&˜×)Ñ)ô &ôRJ˜h×/Ñ/ô Jó8Er!   