a zex@sddlmZddlmZddlmZddlmZddlmZddl m Z ddl m Z ddl mZmZmZdd lmZdd lmZdd lmZmZdd lmZdd lmZddlmZmZmZddlm Z ddl!m"Z"ddl#Z#ddl$Z$ddl%Z%ddl&Z&ddl'Z'ddlZGdddeZ(GdddeZ)ddZ*ddZ+e*dfddZ,ddZ-Gdd d eZ.Gd!d"d"eZ/Gd#d$d$eZ0Gd%d&d&eZ1Gd'd(d(e1Z2Gd)d*d*eZ3e4d+kre5dS),)mock)support) socket_helper)NoLogRequestHandler)TestCase)setup_testing_defaults)Headers) BaseHandlerBaseCGIHandler SimpleHandler)util) validator) WSGIServerWSGIRequestHandler) make_server)HTTPConnection)StringIOBytesIOBufferedReader) BaseServer)python_implementationNc@seZdZddZddZdS) MockServercCst||||dSN)r__init__ server_bind)selfserver_addressZRequestHandlerClassrE/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_wsgiref.pyrszMockServer.__init__cCs"|j\}}||_||_|dSr)rZ server_nameZ server_port setup_environ)rhostportrrrr!s zMockServer.server_bindN)__name__ __module__ __qualname__rrrrrrrsrc@seZdZddZddZdS) MockHandlercCs|j|_|j\|_|_dSr)request connectionZrfileZwfilerrrrsetup*szMockHandler.setupcCsdSrrr(rrrfinish.szMockHandler.finishN)r"r#r$r)r*rrrrr%(sr%cCs|dddgdgS)N200 OK Content-Typez text/plainDatezMon, 05 Jun 2006 18:49:54 GMT Hello, world!renvironZstart_responserrr hello_app2s r3cCs2|dddgd|d|d|dgdgS) Nr+r,r.;ZHTTP_X_TEST_HEADER QUERY_STRING PATH_INFO iso-8859-1)joinencoder1rrr header_app:s r:sGET / HTTP/1.0 cCshtdd|tt}tt|}t}tj}t}t_z|||fdW|t_n|t_0| | fS)NP) 127.0.0.1i") rrr%rrsysstderrrZfinish_requestgetvalue)appdataserverinpoutZolderrerrrrr run_amockEs  rGcCs|}d}|D]}|||ks"t|d7}qz ||WntyJYn 0td|z ttfWntytYn\0|}t||urt|D]}t||kstqz t|WntyYn 0td|dS)NrzToo many items from __getitem__zToo many items from .__next__())AssertionError IndexErroriter StopIteration NameErrornext)make_itmatchitnitemrrrcompare_generic_iterSs.        rTc@sfeZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ dS)IntegrationTestsTcCsFtdtjd}||d|d|r0dp2ddddS) N/rz(HTTP/1.0 200 OK Server: WSGIServer/0.2 zA Content-Type: text/plain Date: Mon, 05 Jun 2006 18:49:54 GMT zContent-Length: 13 r;z Hello, world!r7)rr>versionsplit assertEqualr9)rrE has_lengthpyverrrr check_hellozs   zIntegrationTests.check_hellocCst\}}||dSr)rGr\rrErFrrrtest_plain_hellos z!IntegrationTests.test_plain_hellocCs*d}tt|\}}||dddS)NsmGET /p%61th/?query=test HTTP/1.0 X-Test-Header: Python test X-Test-Header: Python test 2 Content-Length: 0 s+Python test,Python test 2;query=test;/path/)rGr:rY splitlines)rr&rErFrrr test_environs zIntegrationTests.test_environcCs2tddddd\}}||dddS)NsGET xis HTTP/1.0 rBrs!HTTP/1.0 414 Request-URI Too Long)rGrYr`r]rrrtest_request_lengthsz$IntegrationTests.test_request_lengthcCs"ttt\}}|j|dddS)NF)rZ)rGr r3r\r]rrrtest_validated_hellosz%IntegrationTests.test_validated_hellocCs@dd}tt|\}}||d||dddS)NcSs|dddgS)Nr+r,z Hello, world!rr1rrrbad_apps z>IntegrationTests.test_simple_validation_error..bad_app;A server error occurred. Please contact the administrator.z^AssertionError: Headers (('Content-Type', 'text/plain')) must be of type list: rGr assertTrueendswithrYr`rrfrErFrrrtest_simple_validation_errors z-IntegrationTests.test_simple_validation_errorc Csdd}gd}|D]h\}}|j|dDt||\}}||d||d|Wdq1sr0YqdS)Ncsfdd}|S)Ncs|dgdgS)Nr-ztext/plain; charset=utf-8r0rr1statusrrrfs zWIntegrationTests.test_status_validation_errors..create_bad_app..bad_appr)rprfrrorcreate_bad_apps zFIntegrationTests.test_status_validation_errors..create_bad_app))Z200z4AssertionError: Status must be at least 4 characters)z20X OKz8AssertionError: Status message must begin w/3-digit code)Z200OKz;AssertionError: Status message must have a space after coderorgrh)subTestrGrjrkrYr`)rrqZtestsrpZ exc_messagerErFrrrtest_status_validation_errorss z.IntegrationTests.test_status_validation_errorscCs@dd}tt|\}}||d||dddS)NcSs|d|ddgdgS)N wsgi.inputr+rndata)readesrrrrfs  z1IntegrationTests.test_wsgi_input..bad_apprgrhrIrirlrrrtest_wsgi_inputs z IntegrationTests.test_wsgi_inputcCsldd}tt|\}}||dtjdd}td}|d|}| d|d|dS) NcSs|dddgdgS)Nr+rnr/zWed, 24 Dec 2008 13:29:32 GMTrurrwrrrrAs z3IntegrationTests.test_bytes_validation..appz"GET / HTTP/1.0" 200 4 rascii/s(HTTP/1.0 200 OK Server: WSGIServer/0.2 sV Content-Type: text/plain; charset=utf-8 Date: Wed, 24 Dec 2008 13:29:32 GMT data) rGr rjrkr>rWrXr9rrY)rrArErFverpyr[rrrtest_bytes_validations  z&IntegrationTests.test_bytes_validationcCs>dd}tt|dd\}}|dtjdddd g|dS) NcSs|dddg|ddgS)Nr+r,r{r6latin1r9rwrrrrAs z-IntegrationTests.test_cp1252_url..appsGET /%80 HTTP/1.0rcsHTTP/1.0 200 OKsContent-Type: text/plains#Date: Wed, 24 Dec 2008 13:29:32 GMTs/)rGr rYrANYr`)rrArErFrrrtest_cp1252_urls  z IntegrationTests.test_cp1252_urlcsttddd}Gdddtt}ttjd||d|j t fdd }ttj |}|tjtj |dt fd d }t j|d }|||tjd dS)N pthread_killcSs|dgdtjgS)Nr+)r SOCK_MAX_SIZEr1rrrrAs z4IntegrationTests.test_interrupted_write..appc@s eZdZdS)z.WsgiHandlerNr"r#r$rrrr WsgiHandlersrr)Z handler_classcs dSr)set)signumframe) interruptedrrsignal_handlersz?IntegrationTests.test_interrupted_write..signal_handlercstj}|dd|F}|dtjjtddr*qJq*t |Wdn1sj0Y| dS)NGETrVdrH)timeout) rrr&Z getresponservsignalSIGUSR1waitfloatlenclose)httpresponser main_threadrZreceivedrCrr run_clients     *z;IntegrationTests.test_interrupted_write..run_client)targetr)rZ get_attributerrrrrZHOSTZ addCleanupZ server_close threadingEventr get_identThreadstartZhandle_requestr8rYr)rrArrZoriginalrZ backgroundrrrtest_interrupted_writes"    z'IntegrationTests.test_interrupted_writeN)T)r"r#r$r\r^rardrermrsrzrrrrrrrrUxs   rUc@seZdZddZd$ddZddZdd Zd%d d Zej e d ddZ ddZ ddZ ddZddZddZddZddZddZd d!Zd"d#ZdS)& UtilityTestscCsJ||d}t||t||||d|||d||S)N SCRIPT_NAMEr6r6r)r rrYZshift_path_info)rZsn_inZpi_inpartZsn_outZpi_outenvrrr checkShift2s   zUtilityTests.checkShiftNcCs|i}t|t|tr*|||tn,t|trF|||tn||||||i}t|||||dSr)r r isinstancerZassertIsInstancerrYZassertIs)rkeyvaluealtrrrr checkDefault:s    zUtilityTests.checkDefaultcKst|||||dSr)r rrY)rrrkwrrrcheckCrossDefaultJs zUtilityTests.checkCrossDefaultcKs t||t||dSr)r rrYZapplication_uri)rurirrrr checkAppURINs zUtilityTests.checkAppURIrHcKs"t||t|||dSr)r rrYZ request_uri)rrqueryrrrr checkReqURIRs zUtilityTests.checkReqURI)categorycCs^||fdd}t|||}||jj|D]}q0||jj|||jjdS)NcSstt||Sr)r FileWrapperr)textsizerrrrOYsz%UtilityTests.checkFW..make_it)rT assertFalseZfilelikeclosedrrj)rrrrPrOrQrSrrrcheckFWVs zUtilityTests.checkFWcCsPttdd}|td ||ddWdn1sB0YdS)NZfoobarzUse iterator protocol insteadrHfoo)r rrassertWarnsRegexDeprecationWarningrY)rwrapperrrr$test_filewrapper_getitem_deprecationis z1UtilityTests.test_filewrapper_getitem_deprecationcCs^|ddddd|ddddd|ddddd|ddddd|dd ddddS) Nr;rVz/xx/az/x/yz/a/x/yz/x/rr(rrrtestSimpleShiftsps zUtilityTests.testSimpleShiftscCs|ddddd|ddddd|dddd d|dd dd d |dd dd d|dd dd d |ddddd|ddddd|ddddd|ddddd |ddddddS)Nz/a/bz/../yz..rrr;z//yyz/a/b/yz//y/rVz/./yz/./y/z///./..//y/.//z/y/z///z/a/b/z/.//z/x//rz/a/b/xz/.rr(rrrtestNormalizedShiftswsz!UtilityTests.testNormalizedShiftscCsFddddddddd d d d tfd tfdfD]\}}|||q,dS)N) SERVER_NAMEr=) SERVER_PORT80)SERVER_PROTOCOLHTTP/1.0) HTTP_HOSTr=)ZREQUEST_METHODr)rr;)r6rV) wsgi.versionrHr) wsgi.run_oncer)wsgi.multithreadr)wsgi.multiprocessrrt wsgi.errors)wsgi.url_schemer)rrr)rrrrrr testDefaultss  zUtilityTests.testDefaultscCst|jdddd|jdddd|jdddd|jddd d|jdd d d|jd d d d|jd ddddS)Nrzfoo.barrrhttpsonHTTPS1yesrrrrZ443)rr(rrrtestCrossDefaultsszUtilityTests.testCrossDefaultscCsn|tid|tddid|tddid|tddid|tddiddS)Nrrrrrrr)rYr Z guess_schemer(rrrtestGuessSchemes zUtilityTests.testGuessSchemecCsv|d|jddd|jddd|jddd d |jd d d |jddd d|jddd|jdddddS)Nhttp://127.0.0.1/http://127.0.0.1/spam/spamrhttp://127.0.0.1/sp%E4m/spämzhttp://spam.example.com:2071/zspam.example.com:2071Z2071)rrzhttp://spam.example.com/zspam.example.comrr=)rrzhttps://127.0.0.1/rrzhttp://127.0.0.1:8000/Z8000)rr)rr(rrr testAppURIss  zUtilityTests.testAppURIscCs|d|jddd|jddd|jdddd |jd ddd |jd dd d |jd ddd |jddddd|jddddd|jdddddddS)Nrrrrrrzhttp://127.0.0.1/spammity/spamz /spammityrz http://127.0.0.1/spammity/sp%E4mz"http://127.0.0.1/spammity/spam;hamz /spam;hamz/http://127.0.0.1/spammity/spam;cookie=1234,5678z/spam;cookie=1234,5678z%http://127.0.0.1/spammity/spam?say=nizsay=ni)rr6r5z'http://127.0.0.1/spammity/spam?s%E4y=nizs%E4y=nir)rr(rrr testReqURIss0 zUtilityTests.testReqURIscCs|ddddgdS)NZxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxZxxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyzZxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz)rr(rrrtestFileWrapperszUtilityTests.testFileWrappercCs|dD]2}||||fD]}|t|q$qdD]2}||||fD]}|t|q`qDdS)NzbConnection Keep-Alive Proxy-Authenticate Proxy-Authorization TE Trailers Transfer-Encoding Upgradez4Accept Cache-Control Date Pragma Trailer Via Warning)rXtitleupperlowerrjr Z is_hop_by_hopr)rZhoprrrr testHopByHops  zUtilityTests.testHopByHop)N)rH)r"r#r$rrrrrrZignore_warningsrrrrrrrrrrrrrrrrr0s"      rc@s$eZdZddZddZddZdS) HeaderTestscCsdg}|ttd|ttgd|tt|ddd|t|dddg|t|dddg|t|dd||t||t}|d=d|d<|j|j|j |j fD]<}| |d| |d| |d | |dq||ddd |d<||d d || dd g||dd d ||d d d || dd d || d d d ||dd ||d d dS) N)rrrrHrrrbarFooZFOObazZwheeZzoo)rYrrkeysvaluesitemsZ assertIsNot __contains__getget_all __getitem__rjr setdefault)rtesthmrrrtestMappingInterfaces4z HeaderTests.testMappingInterfacecCs|ttddS)Nr) assertRaises TypeErrorrr(rrrtestRequireListszHeaderTests.testRequireListcCst}|t|d|jdddd||dd|t|d|jdddd ||ddd g|t|d dS) Nz rrZspam)rzbar; baz="spam"zfoo: bar; baz="spam" r)Zcheesez bar; cheesez*foo: bar; baz="spam" Foo: bar; cheese )rrYstrZ add_headerrrrrrr testExtrass  zHeaderTests.testExtrasN)r"r#r$rrrrrrrrs rc@s"eZdZeejZddZdS) ErrorHandlerc Ks*t|tj|ttt|ddddS)NT) multithread multiprocess)rr rrr)rrrrrrs zErrorHandler.__init__N) r"r#r$dictosr2r os_environrrrrrrsrc@seZdZddZdS) TestHandlercCsdSrrr(rrr handle_error#szTestHandler.handle_errorN)r"r#r$r rrrrr  sr c@sxeZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZdS) HandlerTestsicCsdddddd}ttd|$tdd d }|Wdn1sH0Yd D]$}|t|d ||jd |qVi}t||D]\}}||vr|||<q| dd dd| | dddddt j d ||j|dS)Nz/my/homez/my/pathz fr_FR.UTF-8Ztest_script_nameZtest_server_name)HOMEPATHLANGrrr Yz/override/home)Xr)rWrrZrun_onceZ file_wrapperZwsgi_zwsgi.r;r=rFrT) rrrrrtrrrrrrzwsgi.file_wrapper)rZ swap_attrr rrYgetattrr2rrupdate get_stdin get_stderrr rZassertDictEqual)rr handlerattrZexpectedrrrrr testEnviron+sB  &  zHandlerTests.testEnvironcCs2tdddi}|dD]}|||jqdS)N)rrtr)r rassertInr2)rrrrrrtestCGIEnvironaszHandlerTests.testCGIEnvironcCsHtdd}|||jddt}|||jdddS)Nrrrrr)r rrYr2rrrr testSchemegszHandlerTests.testSchemecCs6t}dD]}|tt||q |t|jddS)N)Z_flushrrZ add_cgi_varsr)r rNotImplementedErrorr_write)rrnamerrrtestAbstractMethodsmsz HandlerTests.testAbstractMethodscCsdd}dd}dd}dd}t}||||jd d t}||||jd d t}||||jd t}||||jd dS)NcSs|dg|ddgSNr+rr7rrwrrr trivial_app1xs z4HandlerTests.testContentLength..trivial_app1cSs|dg|ddgSr!rrwrrr trivial_app2|sz4HandlerTests.testContentLength..trivial_app2cSs|dgddgS)Nr+uтестzutf-8rrwrrr trivial_app3s z4HandlerTests.testContentLength..trivial_app3cSs|ddggS)Nr+)zContent-LengthZ12345rrwrrr trivial_app4s z4HandlerTests.testContentLength..trivial_app4z)Status: 200 OK Content-Length: 4 httpr7zStatus: 200 OK https-Status: 200 OK Content-Length: 8 тестs)Status: 200 OK Content-Length: 12345 )r runrYstdoutr@r9)rr"r#r$r%rrrrtestContentLengthus8        zHandlerTests.testContentLengthcCsdd}dd}t}||||jdd||jdt}||||jd|jt|j fd|j | d |jdS) NcSs|dggSNr+rrwrrr non_error_apps z8HandlerTests.testBasicErrorOutput..non_error_appcSs tddS)N This should be caught by handlerrIrwrrr error_appsz4HandlerTests.testBasicErrorOutput..error_app%Status: 200 OK Content-Length: 0 r7r;z.error_appzStatus: 200 OK r7rI)rr&rYr'r@r9rr?rr-rrr1rtestErrorAfterOutputs   z!HandlerTests.testErrorAfterOutputc Csdd}d}dd}dD]}|r*d|p,d}d D]}d D]}t|d }d |_||_||_|||||jt|d }d |_||_||_|||dkr||jdq:| t |||fd|j|||fd|jfq:q2qdS)NcSs|dggSr)rrwrrrr*s z5HandlerTests.testHeaderFormats..non_error_appzfHTTP/%s 200 OK\r\nDate: \w{3}, [ 0123]\d \w{3} \d{4} \d\d:\d\d:\d\d GMT\r\n%sContent-Length: 0\r\n\r\nr.r7)z FooBar/1.0Nz Server: %s r;)z1.0z1.1)HTTP/0.9rzHTTP/1.1)rFTr5r) r9r Z origin_serverZ http_versionZserver_softwarer&rYr'r@rjrerP) rr*ZstdpatZshortpatZsswswrWprotorrrrtestHeaderFormatss@    zHandlerTests.testHeaderFormatscCs.dd}t}|||d|jdS)NcSs|ddgdgS)Nr+rnrurrwrrrrAsz'HandlerTests.testBytesData..appsRStatus: 200 OK Content-Type: text/plain; charset=utf-8 Content-Length: 4 data)r r&rYr'r@)rrArrrr testBytesDatas  zHandlerTests.testBytesDatacs>ddidfdd}t}|||dddS)N close_calledFr0cs(|dgGfdddt}|S)Nr+cs eZdZddZfddZdS)zHHandlerTests.testCloseOnError..error_app..CrashyIterablecssdVtdqdS)Nsblahr+r,r(rrr__iter__szQHandlerTests.testCloseOnError..error_app..CrashyIterable.__iter__cs dd<dS)NTr;rr( side_effectsrrrszNHandlerTests.testCloseOnError..error_app..CrashyIterable.closeN)r"r#r$r<rrr=rrCrashyIterablesr?)object)rxryr?r2r>rrr-sz0HandlerTests.testCloseOnError..error_appT)rr&rYr3rrArtestCloseOnError s   zHandlerTests.testCloseOnErrorcs~tGfddd}ddi}tt|tj|}d}|t||tWdn1sd0Y| ddS)Ncs eZdZfddZddZdS)z4HandlerTests.testPartialWrite..PartialWritercs|dd}|t|S)N)extendr)rbpartialZwrittenrrwrite!s  z:HandlerTests.testPartialWrite..PartialWriter.writecSsdSrrr(rrrflush&sz:HandlerTests.testPartialWrite..PartialWriter.flushN)r"r#r$rHrIrrGrr PartialWriter s rJrrzshould not do partial writesssHTTP/1.0 200 OK Content-Type: text/plain Date: Mon, 05 Jun 2006 18:49:54 GMT Content-Length: 13 Hello, world!) bytearrayr rr>r?rrr&r3rY)rrJr2rmsgrrGrtestPartialWrites (zHandlerTests.testPartialWritec sddi}tttfD]r|jdRGfddd}t}tt|||}|t| | Wdq1sz0YqdS)Nrr exceptioncseZdZfddZdS)zEHandlerTests.testClientConnectionTerminations..AbortingWritercsdSrrrrErNrrrH?szKHandlerTests.testClientConnectionTerminations..AbortingWriter.writeNr"r#r$rHrrNrrAbortingWriter>srR) ConnectionAbortedErrorBrokenPipeErrorConnectionResetErrorrrrr rr&r3rr@)rr2rRr?rrrNr testClientConnectionTerminations6s z-HandlerTests.testClientConnectionTerminationscsGdddtGfddd}t}ddi}tt|||}|t|d|||j ||j ||j ||j dS)Nc@s eZdZdS)zKHandlerTests.testDontResetInternalStateOnException..CustomExceptionNrrrrrCustomExceptionIsrWcseZdZfddZdS)zJHandlerTests.testDontResetInternalStateOnException..AbortingWritercsdSrrrPrWrrrHQszPHandlerTests.testDontResetInternalStateOnException..AbortingWriter.writeNrQrrXrrrRPsrRrr) ValueErrorrr rr&r3rr@ZassertIsNotNoneresultZheadersrpr2)rrRr?r2rrrXr%testDontResetInternalStateOnExceptionHs    z2HandlerTests.testDontResetInternalStateOnExceptionN)r"r#r$ZmaxDiffrrrr r(r/r4r9r:rBrMrVr[rrrrr 's62 +r __main__)6ZunittestrrrZ test.supportrZtest.test_httpserversrrZ wsgiref.utilrZwsgiref.headersrZwsgiref.handlersr r r Zwsgirefr Zwsgiref.validater Zwsgiref.simple_serverrrrZ http.clientriorrr socketserverrplatformrr r6rr>rrr%r3r:rGrTrUrrrr r r"mainrrrrsN               %9+7=