§
    Ètºf;  ã                   óÄ  — 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j+        ¦  «        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!„ Z3dS )"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dS )ÚPythonScriptN)Ú__name__Ú
__module__Ú__qualname__ÚsysÚ
executableÚfilter© ó    úX/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/web/test/test_cgi.pyr   r   b   s   € € € € € ØŒ^€F€F€Fr!   r   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )Ú_StartServerAndTearDownMixinc                 ó:  — t          j        ¦   «         }t          j        t          |¦  «        }|                     dt          |¦  «        ¦  «         t          j        |¦  «        }t          j
        d|¦  «        | _        | 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   su   € ÝÔ Ñ"Ô"ˆÝ”,�x¨Ñ-Ô-ˆØ�Š�f�l¨7Ñ3Ô3Ñ4Ô4Ð4ÝŒ{˜4Ñ Ô ˆÝÔ" 1 dÑ+Ô+ˆŒØŒv�~Š~ÑÔÔ$Ð$r!   c                 óZ   — t          | dd ¦  «        r| j                             ¦   «         S d S )Nr,   )Úgetattrr,   ÚstopListening)r/   s    r"   ÚtearDownz%_StartServerAndTearDownMixin.tearDowno   s4   € Ý�4˜˜dÑ#Ô#ð 	*Ø”6×'Ò'Ñ)Ô)Ð)ð	*ð 	*r!   c                 óâ   — t           j                             |                      ¦   «         ¦  «        }t	          |d¦  «        5 }|                     |¦  «         d d d ¦  «         n# 1 swxY w Y   |S )NÚwt)ÚosÚpathÚabspathÚmktempÚopenÚwrite)r/   ÚsourceÚcgiFilenameÚcgiFiles       r"   ÚwriteCGIz%_StartServerAndTearDownMixin.writeCGIs   s—   € Ý”g—o’o d§k¢k¡m¤mÑ4Ô4ˆÝ�+˜tÑ$Ô$ð 	"¨Ø�MŠM˜&Ñ!Ô!Ð!ð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"àÐs   ÁA$Á$A(Á+A(N)r   r   r   r4   r8   rD   r    r!   r"   r$   r$   f   sA   € € € € € ð%ð %ð %ð*ð *ð *ðð ð ð ð r!   r$   c                   óÈ   — e Zd ZdZe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dS )ÚCGITestsz,
    Tests for L{twcgi.FilteredScript}.
    z5CGI tests require a functional reactor.spawnProcess()c                 óf  — |                       t          ¦  «        }|                      |¦  «        }d|fz  }|                     d¦  «        }t	          j        t          ¦  «                             d|¦  «        }|                     t          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‚   s�   € Ø—m’m¥IÑ.Ô.ˆà×"Ò" ;Ñ/Ô/ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆÝŒL�Ñ!Ô!×)Ò)¨&°#Ñ6Ô6ˆØ	�Š•f”oÑ&Ô&Ð&Ø	�Š�d”oÑ&Ô&Ð&Øˆr!   c                 ór   — |                       |dt          j                             d¦  «        z   ¦  «         d S )Ns
   cgi outputrI   )ÚassertEqualr;   ÚlineseprL   )r/   Úress     r"   rQ   zCGITests._testCGI_1�   s3   € Ø×Ò˜˜m­b¬j×.?Ò.?ÀÑ.HÔ.HÑHÑIÔIÐIÐIÐIr!   c                 ób  ‡ — ‰                       t          ¦  «        }‰                      |¦  «        }d|fz  }|                     d¦  «        }t	          j        t          ¦  «        }|                     d|¦  «        }|                     t          ¦  «         ˆ fd„}|                     |¦  «         |S )zc
        If the CGI script emits a I{Server} or I{Date} header, these are
        ignored.
        rH   rI   rJ   c                 óÀ   •— ‰                      d| j                             d¦  «        ¦  «         ‰                      d| j                             d¦  «        ¦  «         d S )NÚmonkeysr   z	last yearÚdate)ÚassertNotInÚheadersÚgetRawHeaders©Úresponser/   s    €r"   ÚcheckResponsez;CGITests.test_protectedServerAndDate.<locals>.checkResponsež   sW   ø€ Ø×Ò˜Y¨Ô(8×(FÒ(FÀxÑ(PÔ(PÑQÔQÐQØ×Ò˜[¨(Ô*:×*HÒ*HÈÑ*PÔ*PÑQÔQÐQÐQÐ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ˆà×"Ò" ;Ñ/Ô/ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆÝ”�WÑ%Ô%ˆØ�MŠM˜& #Ñ&Ô&ˆØ	�Š•kÑ"Ô"Ð"ð	Rð 	Rð 	Rð 	Rð 	Rð 	
�Š�mÑ$Ô$Ð$Øˆr!   c                 ób  ‡ — ‰                       t          ¦  «        }‰                      |¦  «        }d|fz  }|                     d¦  «        }t	          j        t          ¦  «        }|                     d|¦  «        }|                     t          ¦  «         ˆ fd„}|                     |¦  «         |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                 óf   •— ‰                      | j                             d¦  «        dg¦  «         | S )Nzcontent-typeztext/cgi-duplicate-test©rW   r_   r`   ra   s    €r"   rc   zBCGITests.test_noDuplicateContentTypeHeaders.<locals>.checkResponse³   s<   ø€ Ø×ÒØÔ ×.Ò.¨~Ñ>Ô>Ø*Ð+ñô ð ð ˆ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ÔIˆà×"Ò" ;Ñ/Ô/ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆÝ”�WÑ%Ô%ˆØ�MŠM˜& #Ñ&Ô&ˆØ	�Š•kÑ"Ô"Ð"ð	ð 	ð 	ð 	ð 	ð 	
�Š�mÑ$Ô$Ð$Øˆr!   c                 ó¢  ‡ — ‰                       t          ¦  «        }‰                      |¦  «        }d|fz  }|                     d¦  «        }t	          j        t          ¦  «        }t          j        dgdgdœ¦  «        }| 	                    d||¬¦  «        }ˆ fd„}| 
                    t          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        |                      d¦  «        ¦  «        }‰                     t	          |                     ¦   «         ¦  «        h d£¦  «         d S )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Î   s\   ø€ Ý”j §¢°Ñ!9Ô!9Ñ:Ô:ˆGØ×ÒÝ�G—L’L‘N”NÑ#Ô#ØJÐJÐ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Ô6ˆà×"Ò" ;Ñ/Ô/ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆå”�WÑ%Ô%ˆåÔ&Ø�x¸°xÐ@Ð@ñ
ô 
ˆð �MŠM˜& #¨wˆMÑ7Ô7ˆð	ð 	ð 	ð 	ð 	ð 	
�Š•f”oÑ&Ô&Ð&Ø	�Š�mÑ$Ô$Ð$Øˆr!   c                 ób  ‡ — ‰                       t          ¦  «        }‰                      |¦  «        }d|fz  }|                     d¦  «        }t	          j        t          ¦  «        }|                     d|¦  «        }|                     t          ¦  «         ˆ fd„}|                     |¦  «         |S )zp
        If a CGI script emits two instances of the same header, both are sent
        in the response.
        rH   rI   rJ   c                 óh   •— ‰                      | j                             d¦  «        ddg¦  «         d S )NÚheaderÚspamÚeggsrk   ra   s    €r"   rc   z7CGITests.test_duplicateHeaderCGI.<locals>.checkResponseç   s6   ø€ Ø×Ò˜XÔ-×;Ò;¸HÑEÔEÈÐPVÐGWÑXÔXÐXÐXÐ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Ô4ˆà×"Ò" ;Ñ/Ô/ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆÝ”�WÑ%Ô%ˆØ�MŠM˜& #Ñ&Ô&ˆØ	�Š•kÑ"Ô"Ð"ð	Yð 	Yð 	Yð 	Yð 	Yð 	
�Š�mÑ$Ô$Ð$Øˆr!   c                 óÜ  ‡ ‡— ‰                       t          ¦  «        }‰                      |¦  «        }d|fz  }|                     d¦  «        }t	          j        t          ¦  «        }|                     d|¦  «        }|                     t          ¦  «         g Šˆfd„}t          j        |¦  «         ‰                      t          j        |¦  «         ˆˆ fd„}|                     |¦  «         |S )zF
        Check for the error message in the duplicated header
        rH   rI   rJ   c                 óV   •— ‰                      t          j        | ¦  «        ¦  «         d S ©N)Úappendr
   ÚtextFromEventDict)Ú	eventDictÚloggedMessagess    €r"   Ú
addMessagez4CGITests.test_malformedHeaderCGI.<locals>.addMessageû   s(   ø€ Ø×!Ò!¥#Ô"7¸	Ñ"BÔ"BÑCÔCÐCÐCÐCr!   c                 óT   •— ‰                      dt          d¦  «        z   ‰¦  «         d S )Nzignoring malformed CGI header: s   XYZ)ÚassertInÚrepr)Úignoredrˆ   r/   s    €€r"   rc   z7CGITests.test_malformedHeaderCGI.<locals>.checkResponse  s3   ø€ Ø�MŠMØ1µD¸±L´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Ô6ˆà×"Ò" ;Ñ/Ô/ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆÝ”�WÑ%Ô%ˆØ�MŠM˜& #Ñ&Ô&ˆØ	�Š•kÑ"Ô"Ð"Øˆð	Dð 	Dð 	Dð 	Dð 	Dõ 	Œ˜
Ñ#Ô#Ð#Ø�Š�Ô*¨JÑ7Ô7Ð7ð	ð 	ð 	ð 	ð 	ð 	ð
 	
�Š�mÑ$Ô$Ð$Øˆr!   c                 ó  — t           j                             |                      ¦   «         ¦  «        }t	          |d¦  «        5 }|                     t          ¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |¦  «        }t          j	        t          ¦  «        }d|fz  }|                     d¦  «        }|                     d|¦  «        }|                     t          j        ¦  «         |                     | j        ¦  «         |S )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—o’o d§k¢k¡m¤mÑ4Ô4ˆÝ�+˜tÑ$Ô$ð 	)¨Ø�MŠM�-Ñ(Ô(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð ×"Ò" ;Ñ/Ô/ˆÝ”�WÑ%Ô%ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆØ�MŠM˜& #Ñ&Ô&ˆØ	�Š•f”oÑ&Ô&Ð&Ø	�Š�dÔ1Ñ2Ô2Ð2Øˆó   ÁA)Á)A-Á0A-é   c                 óz   — dt           j        › �}|                     d¦  «        }|                      ||¦  «         d S ©Nzreadinput okrI   ©r;   rX   rL   rW   ©r/   rY   Úexpecteds      r"   r•   zCGITests._test_ReadEmptyInput_1  ó>   € Ø.¥"¤*Ð.Ð.ˆØ—?’? 7Ñ+Ô+ˆØ×Ò˜˜hÑ'Ô'Ð'Ð'Ð'r!   c           	      ó^  — t           j                             |                      ¦   «         ¦  «        }t	          |d¦  «        5 }|                     t          ¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |¦  «        }t          j	        t          ¦  «        }d|fz  }|                     d¦  «        }|                     |dt          j        t          d¦  «        ¦  «        ¬¦  «        }|                     t          j        ¦  «         |                     | j        ¦  «         |S ©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  s7  € Ý”g—o’o d§k¢k¡m¤mÑ4Ô4ˆÝ�+˜tÑ$Ô$ð 	)¨Ø�MŠM�-Ñ(Ô(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð ×"Ò" ;Ñ/Ô/ˆÝ”�WÑ%Ô%ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆØ�MŠMØØÝÔ0µÐ9NÑ1OÔ1OÑPÔPð ñ 
ô 
ˆð
 	
�Š•f”oÑ&Ô&Ð&Ø	�Š�dÔ,Ñ-Ô-Ð-Øˆr˜   c                 óz   — dt           j        › �}|                     d¦  «        }|                      ||¦  «         d S r›   rœ   r�   s      r"   r¦   zCGITests._test_ReadInput_12  rŸ   r!   c           	      óZ  — t           j                             |                      ¦   «         ¦  «        }t	          |d¦  «        5 }|                     t          ¦  «         d d d ¦  «         n# 1 swxY w Y   |                      |¦  «        }d|fz  }|                     d¦  «        }t          j
        t          ¦  «                             |dt          j        t          d¦  «        ¦  «        ¬¦  «        }|                     t          j        ¦  «         |                     | j        ¦  «         |S 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  s5  € Ý”g—o’o d§k¢k¡m¤mÑ4Ô4ˆÝ�+˜tÑ$Ô$ð 	,¨Ø�MŠMÕ*Ñ+Ô+Ð+ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,ð ×"Ò" ;Ñ/Ô/ˆØ'¨7¨*Ñ4ˆØ�jŠj˜Ñ!Ô!ˆÝŒL�Ñ!Ô!×)Ò)ØØÝÔ0µÐ9NÑ1OÔ1OÑPÔPð *ñ 
ô 
ˆð
 	
�Š•f”oÑ&Ô&Ð&Ø	�Š�dÔ/Ñ0Ô0Ð0Øˆr˜   c                 óz   — dt           j        › �}|                     d¦  «        }|                      ||¦  «         d S )Nzreadallinput okrI   rœ   r�   s      r"   r«   zCGITests._test_ReadAllInput_1J  s>   € Ø1¥R¤ZÐ1Ð1ˆØ—?’? 7Ñ+Ô+ˆØ×Ò˜˜hÑ'Ô'Ð'Ð'Ð'r!   c                 ó  —  G d„ d¦  «        } |¦   «         }t          ddg¦  «        }t          j        ddd¦  «        |_        t	          j        d|¬	¦  «        }t          ||¦  «         |                      |j        ¦  «         d
S )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dS )ú5CGITests.test_useReactorArgument.<locals>.FakeReactorzR
            A fake reactor recording whether spawnProcess is called.
            Fc                 ó   — d| _         dS )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  s4   € € € € € ðð ð ˆ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  sž   € ð	#ð 	#ð 	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð  "�k‘m”mˆÝ  S˜zÑ*Ô*ˆÝ Ô,¨U°KÀÑGÔGˆŒÝÔ'¨¸kÐJÑJÔ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   s4  € € € € € ðð ð Ô%×0Ò0°Ñ9Ô9ð GØFˆð	ð 	ð 	ðJð Jð Jðð ð ð*ð ð ð0ð ð ð8ð ð ð(ð ð ð8ð ð ð #$ÐÔð(ð (ð (ð
ð ð ð$ €NÔð(ð (ð (ð
ð ð ð" !"ÐÔð(ð (ð (ð
,ð ,ð ,ð ,ð ,r!   rF   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚCGIScriptTestsz'
    Tests for L{twcgi.CGIScript}.
    c                 ó@  — |                       t          ¦  «        }|                      |¦  «        }d|fz  }t          j        t
          ¦  «        }|                     d|¦  «        }|                     t          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  s…   € ð
 —m’mÕ$5Ñ6Ô6ˆØ×"Ò" ;Ñ/Ô/ˆØ3°w°jÑ@ˆÝ”�WÑ%Ô%ˆØ�MŠM˜& #Ñ&Ô&ˆØ	�Š•f”oÑ&Ô&Ð&Ø	�Š�dÔ0Ñ1Ô1Ð1Øˆr!   c                 óz   — dt           j        › �}|                     d¦  «        }|                      ||¦  «         d S )Nz
param=1234rI   rœ   r�   s      r"   rË   z$CGIScriptTests._test_urlParameters_1�  s>   € Ø,¥¤
Ð,Ð,ˆØ—?’? 7Ñ+Ô+ˆØ×Ò˜˜hÑ'Ô'Ð'Ð'Ð'r!   c                 ó>  —  G d„ d¦  «        } |¦   «         }t          j        |                      ¦   «         |¬¦  «        }t          ddg¦  «        }t	          j        ddd¦  «        |_        t          ||¦  «         |                      |j	        d	         d
¦  «         dS )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dS )ú1CGIScriptTests.test_pathInfo.<locals>.FakeReactorzZ
            A fake reactor recording the environment passed to spawnProcess.
            c                 ó   — || _         dS )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†  s®   € ð	'ð 	'ð 	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð" �;‘=”=ˆÝ”? 4§;¢;¡=¤=¸(ÐCÑCÔCˆÝ  S˜zÑ*Ô*ˆÝ Ô,¨U°KÀÑGÔGˆŒÝ�˜'Ñ"Ô"Ð"à×Ò˜Ô-¨kÔ:¸FÑCÔCÐCÐCÐCr!   N)r   r   r   r¶   rÌ   rË   rÚ   r    r!   r"   rÈ   rÈ   n  sP   € € € € € ðð ðð ð ð(ð (ð (ð
Dð Dð Dð Dð Dr!   rÈ   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚCGIDirectoryTestsz*
    Tests for L{twcgi.CGIDirectory}.
    c                 óÌ   ‡ ‡— t          j        ‰                      ¦   «         ¦  «        }t          dg¦  «        Št	          |‰¦  «        }ˆˆ fd„}|                     |¦  «         |S )zc
        L{twcgi.CGIDirectory.render} sets the HTTP response code to I{NOT
        FOUND}.
        Ú c                 óH   •— ‰                      ‰j        t          ¦  «         d S r„   ©rW   ÚresponseCoder   ©r�   rN   r/   s    €€r"   Ú
cbRenderedz1CGIDirectoryTests.test_render.<locals>.cbRendered´  ó"   ø€ Ø×Ò˜WÔ1µ9Ñ=Ô=Ð=Ð=Ð=r!   )r   ÚCGIDirectoryr>   r   r   rO   )r/   r   rT   rã   rN   s   `   @r"   Útest_renderzCGIDirectoryTests.test_render«  ss   øø€ õ
 Ô% d§k¢k¡m¤mÑ4Ô4ˆÝ ˜tÑ$Ô$ˆÝ�H˜gÑ&Ô&ˆð	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	
�Š�jÑ!Ô!Ð!Øˆr!   c                 ó  ‡ ‡— ‰                       ¦   «         }t          j        |¦  «         t          j        |¦  «        }t          dg¦  «        Š |j        d‰¦  «        }t          |‰¦  «        }ˆˆ fd„}|                     |¦  «         |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                 óH   •— ‰                      ‰j        t          ¦  «         d S 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º  sœ   øø€ ð �{Š{‰}Œ}ˆÝ
Œ�DÑÔÐÝÔ% dÑ+Ô+ˆÝ ˜wÑ'Ô'ˆØ!�Ô! %¨Ñ1Ô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dS )ÚCGIProcessProtocolTestsz0
    Tests for L{twcgi.CGIProcessProtocol}.
    c                 óþ   — t          dg¦  «        }t          j        |¦  «        }|                     t	          j        t          j        ¦   «         ¦  «        ¦  «         |                      |j	        t          ¦  «         dS )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Ô  sj   € õ  ˜tÑ$Ô$ˆÝÔ+¨GÑ4Ô4ˆØ×Ò�gœo­eÔ.EÑ.GÔ.GÑHÔHÑIÔIÐIØ×Ò˜Ô-Õ/DÑEÔEÐEÐEÐEr!   c                 óL  — t          ¦   «         }t          j        |d¦  «        }t          j        |¦  «        }|                     t          j        t          d¦  «        ¦  «        ¦  «         | 	                    t          j        t          j        ¦   «         ¦  «        ¦  «         dS )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ß  s‚   € õ
 ‰NŒNˆÝ”,˜q $Ñ'Ô'ˆÝÔ+¨GÑ4Ô4ˆØ×Ò�wœ­~Ð>OÑ/PÔ/PÑQÔQÑRÔRÐRØ×Ò�gœo­eÔ.EÑ.GÔ.GÑHÔHÑIÔIÐIÐIÐIr!   N)r   r   r   r¶   rö   rú   r    r!   r"   rï   rï   Ï  sD   € € € € € ðð ð	Fð 	Fð 	Fð	Jð 	Jð 	Jð 	Jð 	Jr!   rï   c                 óX   ‡ — t          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Ð1CÐ1CÐ1CÑDÔ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Ð 1Ð 1Ð 1Ð 1Ð 1Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø "Ð "Ð "Ð "Ð "Ð "Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø *Ð *Ð *Ð *Ð *Ð *Ø EÐ EÐ EÐ EÐ EÐ EÐ EÐ Eð€	ð€ðÐ ðÐ ð€ðÐ ð(Ð $ðÐ ðÐ ðð ð ð ð �5Ô'ñ ô ð ðð ð ð ð ñ ô ð ð(q,ð q,ð q,ð q,ð q,Ð+¨XÔ->ñ q,ô q,ð q,ðh5Dð 5Dð 5Dð 5Dð 5DÐ1°8Ô3Dñ 5Dô 5Dð 5Dðp&ð &ð &ð &ð &˜Ô)ñ &ô &ð &ðRJð Jð Jð Jð J˜hÔ/ñ Jô Jð Jð8Eð Eð Eð Eð Er!   