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@s eZdZdZddZddZdS) MockServerzNon-socket HTTP servercCst||||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____doc__rrrrrrrsrc@s eZdZdZddZddZdS) MockHandlerzNon-socket HTTP handlercCs|j|_|j\|_|_dSr)request connectionZrfileZwfilerrrrsetup*szMockHandler.setupcCsdSrrr)rrrfinish.szMockHandler.finishN)r"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 r4cCs2|dddgd|d|d|dgdgS) Nr,r-r/;ZHTTP_X_TEST_HEADER QUERY_STRING PATH_INFO iso-8859-1)joinencoder2rrr 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  rHcCs|}d}|D]}|||ks"t|d7}qz ||WntyJYn 0td|z ttfWntytYn\0|}t||urt|D]}t||kstqz t|WntyYn 0td|dS)aUtility to compare a generic 2.1/2.2+ iterator with an iterable If running under Python 2.2+, this tests the iterator using iter()/next(), as well as __getitem__. 'make_it' must be a function returning a fresh iterator to be tested (since this may test the iterator twice).rzToo many items from __getitem__zToo many items from .__next__()N)AssertionError IndexErroriter StopIteration NameErrornext)make_itmatchitnitemrrrcompare_generic_iterSs.        rUc@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!r8)rr?versionsplit assertEqualr:)rrF has_lengthpyverrrr check_hellozs   zIntegrationTests.check_hellocCst\}}||dSr)rHr]rrFrGrrrtest_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/)rHr;rZ splitlines)rr'rFrGrrr test_environs zIntegrationTests.test_environcCs2tddddd\}}||dddS)NsGET xis HTTP/1.0 rCrs!HTTP/1.0 414 Request-URI Too Long)rHrZrar^rrrtest_request_lengthsz$IntegrationTests.test_request_lengthcCs"ttt\}}|j|dddS)NF)r[)rHr r4r]r^rrrtest_validated_hellosz%IntegrationTests.test_validated_hellocCs@dd}tt|\}}||d||dddS)NcSs|dddgS)Nr,r-z Hello, world!rr2rrrbad_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: rHr assertTrueendswithrZrarrgrFrGrrrtest_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-8r1rr2statusrrrgs zWIntegrationTests.test_status_validation_errors..create_bad_app..bad_appr)rqrgrrprcreate_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 coderprhri)subTestrHrkrlrZra)rrrZtestsrqZ exc_messagerFrGrrrtest_status_validation_errorss z.IntegrationTests.test_status_validation_errorscCs@dd}tt|\}}||d||dddS)NcSs|d|ddgdgS)N wsgi.inputr,rodata)readesrrrrgs  z1IntegrationTests.test_wsgi_input..bad_apprhrirJrjrmrrrtest_wsgi_inputs z IntegrationTests.test_wsgi_inputcCsldd}tt|\}}||dtjdd}td}|d|}| d|d|dS) NcSs|dddgdgS)Nr,ror0zWed, 24 Dec 2008 13:29:32 GMTrvrrxrrrrBs 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) rHr rkrlr?rXrYr:rrZ)rrBrFrGverpyr\rrrtest_bytes_validations  z&IntegrationTests.test_bytes_validationcCs>dd}tt|dd\}}|dtjdddd g|dS) NcSs|dddg|ddgS)Nr,r-r|r7latin1r:rxrrrrBs z-IntegrationTests.test_cp1252_url..appsGET /%80 HTTP/1.0rdsHTTP/1.0 200 OKsContent-Type: text/plains#Date: Wed, 24 Dec 2008 13:29:32 GMTs/)rHr rZrANYra)rrBrFrGrrrtest_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_SIZEr2rrrrBs 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)NGETrWdrI)timeout) rrr'Z getresponserwsignalSIGUSR1waitfloatlenclose)httpresponser main_threadrZreceivedrDrr run_clients     *z;IntegrationTests.test_interrupted_write..run_client)targetr)rZ get_attributerrrrrZHOSTZ addCleanupZ server_close threadingEventr get_identThreadstartZhandle_requestr9rZr)rrBrrZoriginalrZ backgroundrrrtest_interrupted_writes"    z'IntegrationTests.test_interrupted_writeN)T)r"r#r$r]r_rbrerfrnrtr{rrrrrrrrVxs   rVc@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_NAMEr7r7r)r rrZZshift_path_info)rZsn_inZpi_inpartZsn_outZpi_outenvrrr checkShift2s   zUtilityTests.checkShiftNcCs|i}t|t|tr*|||tn,t|trF|||tn||||||i}t|||||dSr)r r isinstancerZassertIsInstancerrZZassertIs)rkeyvaluealtrrrr checkDefault:s    zUtilityTests.checkDefaultcKst|||||dSr)r rrZ)rrrkwrrrcheckCrossDefaultJs zUtilityTests.checkCrossDefaultcKs t||t||dSr)r rrZZapplication_uri)rurirrrr checkAppURINs zUtilityTests.checkAppURIrIcKs"t||t|||dSr)r rrZZ request_uri)rrqueryrrrr checkReqURIRs zUtilityTests.checkReqURI)categorycCs^||fdd}t|||}||jj|D]}q0||jj|||jjdS)NcSstt||Sr)r FileWrapperr)textsizerrrrPYsz%UtilityTests.checkFW..make_it)rU assertFalseZfilelikeclosedrrk)rrrrQrPrRrTrrrcheckFWVs zUtilityTests.checkFWcCsPttdd}|td ||ddWdn1sB0YdS)NZfoobarzUse iterator protocol insteadrIfoo)r rrassertWarnsRegexDeprecationWarningrZ)rwrapperrrr$test_filewrapper_getitem_deprecationis z1UtilityTests.test_filewrapper_getitem_deprecationcCs^|ddddd|ddddd|ddddd|ddddd|dd ddddS) Nr<rWz/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/rWz/./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<)r7rW) wsgi.versionrIr) wsgi.run_oncer)wsgi.multithreadr)wsgi.multiprocessrru 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)rZr 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)rr7r6z'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)rYtitleupperlowerrkr Z is_hop_by_hopr)rZhoprrrr testHopByHops  zUtilityTests.testHopByHop)N)rI)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)rrrrIrrrbarFooZFOObazZwheeZzoo)rZrrkeysvaluesitemsZ assertIsNot __contains__getget_all __getitem__rkr 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 )rrZstrZ add_headerrrrrrr testExtrass  zHeaderTests.testExtrasN)r"r#r$rrrrrrrrs rc@s&eZdZdZeejZddZ dS) ErrorHandlerz/Simple handler subclass for testing BaseHandlerc Ks*t|tj|ttt|ddddS)NT) multithread multiprocess)rr rrr)rrrrrrs zErrorHandler.__init__N) r"r#r$r%dictosr3r os_environrrrrrrsrc@seZdZdZddZdS) TestHandlerzASimple handler subclass for testing BaseHandler, w/error passthrucCsdSrrr)rrr handle_error#szTestHandler.handle_errorN)r"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)rXrrZrun_onceZ file_wrapperZwsgi_zwsgi.r<r>rFrT) rrrrrurrrrrrzwsgi.file_wrapper)rZ swap_attrr rrZgetattrr3rrupdate get_stdin get_stderrr rZassertDictEqual)rr handlerattrZexpectedrrrrr testEnviron+sB  &  zHandlerTests.testEnvironcCs2tdddi}|dD]}|||jqdS)N)rrur)r rassertInr3)rrrrrrtestCGIEnvironaszHandlerTests.testCGIEnvironcCsHtdd}|||jddt}|||jdddS)Nrrrrr)r rrZr3rrrr 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,rr8rrxrrr trivial_app1xs z4HandlerTests.testContentLength..trivial_app1cSs|dg|ddgSr"rrxrrr trivial_app2|sz4HandlerTests.testContentLength..trivial_app2cSs|dgddgS)Nr,uтестzutf-8rrxrrr trivial_app3s z4HandlerTests.testContentLength..trivial_app3cSs|ddggS)Nr,)zContent-LengthZ12345rrxrrr trivial_app4s z4HandlerTests.testContentLength..trivial_app4z)Status: 200 OK Content-Length: 4 httpr8zStatus: 200 OK https-Status: 200 OK Content-Length: 8 тестs)Status: 200 OK Content-Length: 12345 )r runrZstdoutrAr:)rr#r$r%r&rrrrtestContentLengthus8        zHandlerTests.testContentLengthcCsdd}dd}t}||||jdd||jdt}||||jd|jt|j fd|j | d |jdS) NcSs|dggSNr,rrxrrr non_error_apps z8HandlerTests.testBasicErrorOutput..non_error_appcSs tddS)N This should be caught by handlerrJrxrrr error_appsz4HandlerTests.testBasicErrorOutput..error_app%Status: 200 OK Content-Length: 0 r8r<z.error_appzStatus: 200 OK r8rJ)rr'rZr(rAr:rr@rr.rrr2rtestErrorAfterOutputs   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*rrxrrrr+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/r8)z FooBar/1.0Nz Server: %s r<)z1.0z1.1)HTTP/0.9rzHTTP/1.1)rFTr6r) r:r Z origin_serverZ http_versionZserver_softwarer'rZr(rArkrerQ) rr+ZstdpatZshortpatZsswswrXprotorrrrtestHeaderFormatss@    zHandlerTests.testHeaderFormatscCs.dd}t}|||d|jdS)NcSs|ddgdgS)Nr,rorvrrxrrrrBsz'HandlerTests.testBytesData..appsRStatus: 200 OK Content-Type: text/plain; charset=utf-8 Content-Length: 4 data)r r'rZr(rA)rrBrrrr testBytesDatas  zHandlerTests.testBytesDatacs>ddidfdd}t}|||dddS)N close_calledFr1cs(|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)ryrzr@r3r?rrr.sz0HandlerTests.testCloseOnError..error_appT)rr'rZr4rrBrtestCloseOnError 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$rIrJrrHrr PartialWriter s rKrrzshould 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'r4rZ)rrKr3rmsgrrHrtestPartialWrites (zHandlerTests.testPartialWritec sddi}tttfD]r|jdRGfddd}t}tt|||}|t| | Wdq1sz0YqdS)Nrr exceptioncseZdZfddZdS)zEHandlerTests.testClientConnectionTerminations..AbortingWritercsdSrrrrFrOrrrI?szKHandlerTests.testClientConnectionTerminations..AbortingWriter.writeNr"r#r$rIrrOrrAbortingWriter>srS) ConnectionAbortedErrorBrokenPipeErrorConnectionResetErrorrsrr rr'r4rrA)rr3rSr@rrrOr testClientConnectionTerminations6s z-HandlerTests.testClientConnectionTerminationscsGdddtGfddd}t}ddi}tt|||}|t|d|||j ||j ||j ||j dS)Nc@s eZdZdS)zKHandlerTests.testDontResetInternalStateOnException..CustomExceptionNrrrrrCustomExceptionIsrXcseZdZfddZdS)zJHandlerTests.testDontResetInternalStateOnException..AbortingWritercsdSrrrQrXrrrIQszPHandlerTests.testDontResetInternalStateOnException..AbortingWriter.writeNrRrrYrrrSPsrSrr) ValueErrorrr rr'r4rrAZassertIsNotNoneresultZheadersrqr3)rrSr@r3rrrYr%testDontResetInternalStateOnExceptionHs    z2HandlerTests.testDontResetInternalStateOnExceptionN)r"r#r$ZmaxDiffrrrr!r)r0r5r:r;rCrNrWr\rrrrr's62 +r__main__)6ZunittestrrrZ test.supportrZtest.test_httpserversrrZ wsgiref.utilrZwsgiref.headersrZwsgiref.handlersr r r Zwsgirefr Zwsgiref.validater Zwsgiref.simple_serverrrrZ http.clientriorrr socketserverrplatformrr r7rr?rrr&r4r;rHrUrVrrrr rr"mainrrrrsN               %9+7=