a 5êdgLÊã@s*dZddlmZddlmZmZmZmZddlm Z m Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddl m!Z!ddlZddl"m#Z#Gd d „d ƒZ$Gd d „d ej%ƒZ&Gd d„dej'ƒZ(Gdd„de(ƒZ)Gdd„de(ƒZ*Gdd„de(ƒZ+dZ,dZ-dZ.dZ/e 0e1e dƒo€e  2¡dkd¡Gdd„de(ƒƒZ3Gdd„deƒZ4Gdd „d e4ƒZ5Gd!d"„d"ƒZ6Gd#d$„d$ej'ƒZ7Gd%d&„d&ej'ƒZ8Gd'd(„d(ej'ƒZ9Gd)d*„d*ej'ƒZ:d.d+d,„Z;e, Josip Dzolonga, and Michael Otteneder for the 2007/08 GHOP contest. é)Ú OrderedDict)ÚBaseHTTPRequestHandlerÚ HTTPServerÚSimpleHTTPRequestHandlerÚCGIHTTPRequestHandler)ÚserverÚ HTTPStatusN)Úmock)ÚBytesIO)Úsupportc@seZdZdd„Zddd„ZdS)ÚNoLogRequestHandlercGsdS©N©)ÚselfÚargsrrú1/usr/local/lib/python3.9/test/test_httpservers.pyÚ log_message$szNoLogRequestHandler.log_messageNcCsdS©NÚr)rÚnrrrÚread(szNoLogRequestHandler.read)N)Ú__name__Ú __module__Ú __qualname__rrrrrrr #sr c@s$eZdZdd„Zdd„Zdd„ZdS)ÚTestServerThreadcCstj |¡||_||_dSr )Ú threadingÚThreadÚ__init__Úrequest_handlerÚ test_object)rrrrrrr-s zTestServerThread.__init__cCsdtd|jƒ|_|jj ¡\|j_|j_|jj  ¡d|_z|j  d¡W|j  ¡n |j  ¡0dS)N)Ú localhostrgš™™™™™©?) rrrÚsocketÚ getsocknamerÚHOSTÚPORTÚserver_startedÚsetZ serve_foreverZ server_close©rrrrÚrun2s zTestServerThread.runcCs|j ¡| ¡dSr )rÚshutdownÚjoinr'rrrÚstop<s zTestServerThread.stopN)rrrrr(r+rrrrr,s rc@s,eZdZdd„Zdd„Zddifdd„ZdS) Ú BaseTestCasecCsDt ¡|_t ¡t_t ¡|_t ||j ƒ|_ |j   ¡|j  ¡dSr )r Zthreading_setupÚ_threadsZEnvironmentVarGuardÚosÚenvironrÚEventr%rrÚthreadÚstartÚwaitr'rrrÚsetUpBs     zBaseTestCase.setUpcCs*|j ¡d|_tj ¡tj|jŽdSr )r1r+r.r/Ú__exit__r Zthreading_cleanupr-r'rrrÚtearDownJs  zBaseTestCase.tearDownÚGETNcCs0tj |j|j¡|_|j ||||¡|j ¡Sr )ÚhttpÚclientÚHTTPConnectionr#r$Ú connectionÚrequestÚ getresponse)rZuriÚmethodÚbodyÚheadersrrrr<PszBaseTestCase.request)rrrr4r6r<rrrrr,Asr,c@s¾eZdZGdd„deeƒZdd„Zdd„Zdd„Zd d „Z d d „Z d d„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+S),ÚBaseHTTPServerTestCasec@s\eZdZdZdZdd„Zdd„Zdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z dd„Z dS)z&BaseHTTPServerTestCase.request_handlerúHTTP/1.1cCs0| tj¡| dd¡| dd¡| ¡dS)Nú Content-Typeú text/htmlÚ ConnectionÚclose©Ú send_responserÚ NO_CONTENTÚ send_headerÚ end_headersr'rrrÚdo_TEST[s   z.BaseHTTPServerTestCase.request_handler.do_TESTcCs0| tj¡| dd¡| dd¡| ¡dS)NrCrDrEú keep-aliverGr'rrrÚdo_KEEPas   z.BaseHTTPServerTestCase.request_handler.do_KEEPcCs| d¡dS)Néç©Ú send_errorr'rrrÚ do_KEYERRORgsz2BaseHTTPServerTestCase.request_handler.do_KEYERRORcCs| tj¡dSr ©rQrÚ NOT_FOUNDr'rrrÚ do_NOTFOUNDjsz2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDcCs| ddd¡dS)NrOz Short MessagezThis is a long explanationrPr'rrrÚdo_EXPLAINERRORmsÿz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORcCs.| d¡| dd¡| dd¡| ¡dS)NrOrCrDrErF)rHrJrKr'rrrÚ do_CUSTOMqs   z0BaseHTTPServerTestCase.request_handler.do_CUSTOMcCsJ| d¡| dd¡| dd¡| ¡|jd d¡}|j |¡dS)NrOú X-SpecialõDängerous MindrErFzx-special-incomingúutf-8)rHrJrKr@ÚencodeÚwfileÚwrite)rr?rrrÚdo_LATINONEHEADERws    z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERcCs| t|jdd…ƒ¡dS©Né©rQÚintÚpathr'rrrÚ do_SEND_ERRORsz4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORcCs| t|jdd…ƒ¡dSr_rar'rrrÚdo_HEAD‚sz.BaseHTTPServerTestCase.request_handler.do_HEADN)rrrÚprotocol_versionÚdefault_request_versionrLrNrRrUrVrWr^rdrerrrrrWsrcCs,t |¡tj |j|j¡|_|j ¡dSr ) r,r4r8r9r:r#r$ÚconÚconnectr'rrrr4…s zBaseHTTPServerTestCase.setUpcCs,|j dd¡|j ¡}| |jtj¡dS)Nr7ú/)rhr<r=Ú assertEqualÚstatusrÚNOT_IMPLEMENTED©rÚresrrrÚ test_commandŠs z#BaseHTTPServerTestCase.test_commandcCs>d|j_|j dd¡|j ¡|j ¡}| |jtj¡dS)Nz HTTP/1.1 ZXYZBOGUSrj© rhÚ _http_vsn_strÚ putrequestÚ endheadersr=rkrlrrmrnrrrÚtest_request_line_trimmings   z1BaseHTTPServerTestCase.test_request_line_trimmingcCs>d|j_|j dd¡|j ¡|j ¡}| |jtj¡dS)NZFUBARr7rj© rhrrrsrtr=rkrlrZ BAD_REQUESTrnrrrÚtest_version_bogus–s   z)BaseHTTPServerTestCase.test_version_boguscCs>d|j_|j dd¡|j ¡|j ¡}| |jtj¡dS)Nz HTTP/9.9.9r7rjrvrnrrrÚtest_version_digitss   z*BaseHTTPServerTestCase.test_version_digitscCs>d|j_|j dd¡|j ¡|j ¡}| |jtj¡dS)Nrr7rjrqrnrrrÚtest_version_none_get¤s   z,BaseHTTPServerTestCase.test_version_none_getcCs>d|j_|j dd¡|j ¡|j ¡}| |jtj¡dS)NrÚCUSTOMrjrvrnrrrÚtest_version_none«s   z(BaseHTTPServerTestCase.test_version_nonecCsFd|j_d|j_|j dd¡|j ¡|j ¡}| |jtj ¡dS)NéczHTTP/9.9r7rj) rhZ _http_vsnrrrsrtr=rkrlrZHTTP_VERSION_NOT_SUPPORTEDrnrrrÚtest_version_invalid³s   z+BaseHTTPServerTestCase.test_version_invalidcCs>d|j_|j dd¡|j ¡|j ¡}| |jtj¡dSrrvrnrrrÚtest_send_blank»s   z&BaseHTTPServerTestCase.test_send_blankcCsD|j dd¡|j dd¡|j ¡|j ¡}| |jtj¡dS)Nr7rjrErF) rhrsÚ putheaderrtr=rkrlrrmrnrrrÚtest_header_closeÂs   z(BaseHTTPServerTestCase.test_header_closecCsLd|j_|j dd¡|j dd¡|j ¡|j ¡}| |jtj ¡dS)NrBr7rjrErM) rhrrrsrrtr=rkrlrrmrnrrrÚtest_header_keep_aliveÉs   z-BaseHTTPServerTestCase.test_header_keep_alivecCs,|j dd¡|j ¡}| |jtj¡dS)NÚTESTrj)rhr<r=rkrlrrIrnrrrÚ test_handlerÑs z#BaseHTTPServerTestCase.test_handlercCsJ|j dd¡|j ¡}| | d¡d¡|j dd¡| |jj¡dS)NZKEEPrjrErMr‚)rhr<r=rkÚ getheaderZ addCleanuprFrnrrrÚtest_return_header_keep_aliveÖs  z4BaseHTTPServerTestCase.test_return_header_keep_alivecCs*|j dd¡|j ¡}| |jd¡dS)NZKEYERRORrjrO©rhr<r=rkrlrnrrrÚtest_internal_key_errorÝs z.BaseHTTPServerTestCase.test_internal_key_errorcCs*|j dd¡|j ¡}| |jd¡dS)NrzrjrOr†rnrrrÚtest_return_custom_statusâs z0BaseHTTPServerTestCase.test_return_custom_statuscCs>|j dd¡|j ¡}| |jd¡| t| d¡ƒ¡dS)NZ EXPLAINERRORrjrOúContent-Length)rhr<r=rkrlÚ assertTruerbr„rnrrrÚtest_return_explain_errorçs z0BaseHTTPServerTestCase.test_return_explain_errorcCsL|jjddddid|j ¡}| | d¡d¡| | ¡d d¡¡dS) NZLATINONEHEADERrjzX-Special-IncominguÄrger mit Unicode©r@rXrYrZ)rhr<r=rkr„rr[rnrrrÚtest_latin1_headerís  ÿ z)BaseHTTPServerTestCase.test_latin1_headercCsN|j dd¡|j ¡}| |jtj¡| ¡}| t|  d¡ƒt |ƒ¡dS)NZNOTFOUNDrjr‰) rhr<r=rkrlrrTrrbr„Úlen)rroÚdatarrrÚtest_error_content_lengthõs  z0BaseHTTPServerTestCase.test_error_content_lengthcCs¬tjtjf}tjtjtjtjtjfD]‚}|j dd |¡¡|j  ¡}|  ||j ¡|  d|  d¡¡|  d|  d¡¡||vr’|  d|  d¡¡|  ¡}|  d|¡q$dS)NZ SEND_ERRORú/{}r‰rCúTransfer-Encodingó)rÚ NOT_MODIFIEDÚ RESET_CONTENTrIZ PROCESSINGÚSWITCHING_PROTOCOLSrhr<Úformatr=rkrlr„r©rZallow_transfer_encoding_codesÚcoderorrrrÚtest_send_errorþs ÿþ z&BaseHTTPServerTestCase.test_send_errorcCsâtjtjf}tjtjtjtjtjfD]¸}|j dd |¡¡|j  ¡}|  ||j ¡|tjkrŠ|  t | d¡ƒdk¡| d| d¡¡n$|  d| d¡¡|  d| d¡¡||vrÈ|  d| d¡¡| ¡}|  d|¡q$dS) NÚHEADr‘r‰rrDrCr’r“)rr”r•ÚOKrIr–rhr<r—r=rkrlrŠrbr„ÚassertInrr˜rrrÚtest_head_via_send_errors&ÿþ  z/BaseHTTPServerTestCase.test_head_via_send_errorN)rrrr rrr4rprurwrxryr{r}r~r€rrƒr…r‡rˆr‹rrršržrrrrrAVs*. rAc@s,eZdZGdd„deƒZdd„Zdd„ZdS)ÚRequestHandlerLoggingTestCasec@s$eZdZdZdZdd„Zdd„ZdS)z-RequestHandlerLoggingTestCase.request_handlerrBcCs| tj¡| ¡dSr )rHrrœrKr'rrrÚdo_GET*s z4RequestHandlerLoggingTestCase.request_handler.do_GETcCs| tjd¡dS)NzFile not foundrSr'rrrÚdo_ERROR.sz6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)rrrrfrgr r¡rrrrr&srcCsvtj |j|j¡|_|j ¡t ¡(}|j  dd¡|j  ¡Wdƒn1sT0Y|  |  ¡  d¡¡dS)Nr7rjz"GET / HTTP/1.1" 200 - )r8r9r:r#r$rhrir Úcaptured_stderrr<r=rŠÚgetvalueÚendswith)rÚerrrrrÚtest_get1s  ( ÿz&RequestHandlerLoggingTestCase.test_getcCs˜tj |j|j¡|_|j ¡t ¡(}|j  dd¡|j  ¡Wdƒn1sT0Y|  ¡  d¡}|  |d d¡¡|  |d d¡¡dS)NÚERRORrjÚ rz code 404, message File not foundr`z"ERROR / HTTP/1.1" 404 -)r8r9r:r#r$rhrir r¢r<r=r£ÚsplitrŠr¤)rr¥ÚlinesrrrÚtest_err<s  (z&RequestHandlerLoggingTestCase.test_errN)rrrrrr¦r«rrrrrŸ%s  rŸc@sºeZdZGdd„deeƒZdd„Zdd„Zd#dd „Ze   e j d kd ¡e   e j d kd ¡e   ejd¡dd„ƒƒƒZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„ZdS)$ÚSimpleHTTPServerTestCasec@s eZdZdS)z(SimpleHTTPServerTestCase.request_handlerN©rrrrrrrrJsrcCsêt |¡t ¡|_t ¡}t |¡d|_tj |d|_ tj   |j ¡|_ d|j |_tj  |j d¡}t|dƒ$}| |j¡| ¡Wdƒn1sš0Yt |¡j}tj |tjj¡}|jdd|_tjj| ¡dd |_dS) NsWe are the knights who say Ni!)ÚdirrjÚtestÚwbr)Z microsecondT©Zusegmt) r,r4r.ÚgetcwdÚcwdÚtempfileÚ gettempdirÚchdirrÚmkdtempÚtempdirrcÚbasenameÚ tempdir_nameÚbase_urlr*Úopenr]ÚflushÚstatÚst_mtimeÚdatetimeZ fromtimestampÚtimezoneZutcÚreplaceÚlast_modif_datetimeÚemailÚutilsZ formatdateÚ timestampÚlast_modif_header)rZ basetempdirZtempnameZtempÚmtimeZ last_modifrrrr4Ms(      & ÿÿzSimpleHTTPServerTestCase.setUpc CsJz8t |j¡zt |j¡Wn Yn0Wt |¡n t |¡0dSr )r.r¶r³ÚshutilÚrmtreer¸r,r6r'rrrr6bs z!SimpleHTTPServerTestCase.tearDownNcs˜‡‡fdd„}d‰|ˆ_ˆ ¡}| ˆ¡| ˆj|¡| ˆj¡|rT| ||¡| ˆjd¡| ˆj  dd¡d¡| ˆ d¡dd¡ˆ  ¡|S) Ncsˆj‰dˆ_dS)zWDon't close reader yet so we can check if there was leftover buffered inputN)Úfpr©ÚreaderÚresponserrÚ close_connmszDSimpleHTTPServerTestCase.check_status_and_reason..close_conné rErFér“zConnection should be closed) Z _close_connrrŠrkrlÚassertIsNotNoneÚreasonÚversionÚmsgÚgetrF)rrÎrlrrÏr?rrÌrÚcheck_status_and_reasonls   z0SimpleHTTPServerTestCase.check_status_and_reasonÚdarwinz2undecodable name cannot always be decoded on macOSÚwin32z+undecodable name cannot be decoded on win32zneed support.TESTFN_UNDECODABLEcCst ¡}t tj¡d}ttj |j |¡dƒ}|  tj¡Wdƒn1sP0Y|  |j d¡}tj dkr–t |j ¡D]}|dkr€|}q–q€| |tj¡}tjj|dd}| d| |d ¡|¡| d tj|d d  |d ¡|¡|  |j d|¡}|j|tjtjd dS)Nz.txtr°rjrØr¯Ú surrogatepass)Úerrorsz href="%s"Úsurrogateescapeú>%s  ÿ  *z!SimpleHTTPServerTestCase.test_getcCsT|j|jddd}| |tj¡| | d¡tt|j ƒƒ¡| | d¡d¡dS)Nrðr›©r>zcontent-lengthz content-typezapplication/octet-stream) r<r»r×rrœrkr„ÚstrrŽr©rrÎrrrÚ test_headÉs ÿ  ÿ ÿz"SimpleHTTPServerTestCase.test_headcCsŒtj ¡}|j|d<|j|jd|d}| |tj¡|j t j dd}tj ¡}tj j |dd|d<|j|jd|d}| |tj¡dS) z»Check that when a request to /test is sent with the request header If-Modified-Since set to date of last modification, the server returns status code 304, not 200 úIf-Modified-SincerðrŒr`)ZhoursTr±N)rÄÚmessageÚMessagerÇr<r»r×rr”rÃrÀÚ timedeltarÅÚformat_datetime)rr@rÎZnew_dtrrrÚtest_browser_cacheÒs   ÿ z+SimpleHTTPServerTestCase.test_browser_cachecCsZ|j}|tjdd}tj ¡}tjj|dd|d<|j|j d|d}|  |t j ¡dS)Nim)ZdaysTr±rÿrðrŒ) rÃrÀrrÄrrrÅrr<r»r×rrœ)rZdtZold_dtr@rÎrrrÚtest_browser_cache_file_changedäs ÿ z8SimpleHTTPServerTestCase.test_browser_cache_file_changedcCsBtj ¡}|j|d<d|d<|j|jd|d}| |tj¡dS)NrÿÚ*z If-None-MatchrðrŒ) rÄrrrÇr<r»r×rrœ)rr@rÎrrrÚ,test_browser_cache_with_If_None_Match_headerïs   zESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_headercCsX|jddd}| |tj¡|jddd}| |tj¡|jddd}| |tj¡dS)NrjZFOOrûZcustomZGETs)r<r×rrmrýrrrÚtest_invalid_requestsøs z.SimpleHTTPServerTestCase.test_invalid_requestscCs@| |jd¡}|j|tj|jd|jd}| ||j¡dS)z–Checks that the datetime returned in Last-Modified response header is the actual datetime of last modification, rounded to the second rðràz Last-modifiedN) r<r»r×rrœrr@rkrÇ)rrÎrÇrrrÚtest_last_modifieds z+SimpleHTTPServerTestCase.test_last_modifiedcCsÒ| |jd¡}|j|tj|jd| |jd¡}| |tj¡| |jd¡}| |tj¡| |j¡}| |tj¡| |jd¡}| |tj¡| |jd¡}| |tj¡| |  d¡|jd¡dS) Nrðràrñrjrórôrõrö) r<rºr×rrœrrTrørkr„rýrrrÚtest_path_without_leading_slash s  ÿz8SimpleHTTPServerTestCase.test_path_without_leading_slashc Cs¾d}tj |j|¡}zt|dƒ ¡Wn tyFt d|¡‚Yn0z6|  |j d¡}|  |t j ¡}|j ¡}Wt |¡n t |¡0| |¡dtj|dd}| | |¡|¡dS)Nz .txtÚwz-Can not create file %s on current file systemrjrÝFrÞ)r.rcr*r¸r¼rFÚOSErrorÚunittestZSkipTestr<r»r×rrœr@Zget_content_charsetÚunlinkrÒrérêrr[)rrìÚfullpathrÎr?rëZ html_textrrrÚtest_html_escape_filenames  ÿ   z2SimpleHTTPServerTestCase.test_html_escape_filename)N)rrrr rrr4r6r×r ÚskipIfráråZ skipUnlessr rärïr¦rþrrrrr r rrrrrr¬Is.  ÿ ÿÿ'     r¬zD#!%s print("Content-type: text/html") print() print("Hello World") zÐ#!%s import cgi print("Content-type: text/html") print() form = cgi.FieldStorage() print("%%s, %%s, %%s" %% (form.getfirst("spam"), form.getfirst("eggs"), form.getfirst("bacon"))) zR#!%s import os print("Content-type: text/html") print() print(os.environ["%s"]) zR#!%s import os print("Content-type: text/plain") print() print(repr(os.environ)) rùz7This test can't be run reliably as root (issue #13308).c@sªeZdZGdd„deeƒZej d¡Zdd„Z dd„Z dd „Z d d „Z d d „Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$S)%ÚCGIHTTPServerTestCasec@s eZdZdS)z%CGIHTTPServerTestCase.request_handlerNr­rrrrr[srÚasciicCs t |¡t ¡|_t ¡|_tj  |jd¡|_ tj  |j d¡|_ tj  |jd¡|_ tj  |j d¡|_ tj  |j d¡|_t |j ¡t |j ¡t |j ¡t |j ¡t |j¡d|_d|_d|_d|_d|_d|_d|_t ¡rtj  |jd¡|_t |j¡ ¡|_ntj|_z|j d¡Wn&tyL|  ¡| !d¡Yn0tj  |jd¡|_t"|jd ƒ }| #t$|j¡Wdƒn1s”0Yt %|jd ¡tj  |j d ¡|_t"|jd dd  }| #t$|j¡Wdƒn1sö0Yt %|jd ¡tj  |j d ¡|_t"|jd dd  }| #t&|j¡Wdƒn1sX0Yt %|jd ¡tj  |j d¡|_t"|jd dd  }| #t$|j¡Wdƒn1sº0Yt %|jd ¡tj  |j d¡|_t"|jd dd $}| #t'|jdf¡Wdƒn1s 0Yt %|jd ¡tj  |jd¡|_t"|jd dd  }| #t$|j¡Wdƒn1s‚0Yt %|jd ¡tj  |j d¡|_(t"|j(d dd  }| #t)|j¡Wdƒn1sä0Yt %|j(d ¡t *|j¡dS)Nzcgi-binz child-dirÚsubr®ÚpythonrZz0Python executable path is not encodable to utf-8znocgi.pyr iÿzfile1.py)Úencodingzfile2.pyzfile3.pyzfile4.pyZ QUERY_STRINGzfile5.pyzfile6.py)+r,r4r.r²r³r´r·Ú parent_dirrcr*Úcgi_dirÚ cgi_child_dirÚ sub_dir_1Ú sub_dir_2Úcgi_dir_in_sub_dirÚmkdirÚ nocgi_pathÚ file1_pathÚ file2_pathÚ file3_pathÚ file4_pathÚ file5_pathÚ_pythonexe_symlinkr Z can_symlinkZ pythonexeZ PythonSymlinkÚ __enter__ráÚ executabler[ÚUnicodeEncodeErrorr6ZskipTestr¼r]Ú cgi_file1rúÚ cgi_file2Ú cgi_file4Ú file6_pathÚ cgi_file6r¶)rrËZfile1Zfile2Zfile3Zfile4Zfile5Zfile6rrrr4`st         0000400zCGIHTTPServerTestCase.setUpc Cszöt |j¡|jr$|j ddd¡|jr6t |j¡|jrHt |j¡|jrZt |j¡|j rlt |j ¡|j r~t |j ¡|j rt |j ¡|j r¢t |j ¡t  |j¡t  |j¡t  |j¡t  |j¡t  |j¡t  |j¡Wt |¡n t |¡0dSr )r.r¶r³r$r5rÚremoverr r!r"r#r+Úrmdirrrrrrrr,r6r'rrrr6¬s2             zCGIHTTPServerTestCase.tearDowncCsždttddddddddddddddddd d d td d tddd œ}| ¡D]R\}}t|tƒrtt|tƒrt| |tj|¡qFt |¡}|j ||d|||fdqFdS)Nú//z//\ú/cgi-bin/file1.pyú//az/C:/ú/a/bú/a/b/z/a/b/dz/a/b/d/fz/a/b/fz/a/fz//f)rz..z/.//..rjr/z/\z/.//úcgi-bin/file1.pyr0Úaz/ar1z./az./C:/r2r3z/a/b/.z /a/b/c/..z /a/b/c/../dz/a/b/c/../d/e/../fz/a/b/c/../d/e/../../fz/a/b/c/../d/e/.././././..//fz../a/b/c/../d/e/.././././..//fz/a/b/c/../d/e/../../../fz/a/b/c/../d/e/../../../../fz/a/b/c/../d/e/../../../../../fz/a/b/c/../d/e/../../../../f/..z /a/b/c/../d/e/../../../../f/../.zpath = %r Got: %r Wanted: %r)rÕ) Ú IndexErrorÚitemsÚ isinstanceÚtypeÚ issubclassÚ ExceptionÚ assertRaisesrZ_url_collapse_pathrk)rZ test_vectorsrcÚexpectedÚactualrrrÚtest_url_collapse_pathÈsPäÿ ÿÿz,CGIHTTPServerTestCase.test_url_collapse_pathcCs:| d¡}| | ¡| d¡|jfd|jdtjf¡dS)Nr0ú Content-typeó Hello WorldrD)r<rkrr„rlÚlineseprrœrnrrrÚtest_headers_and_contentòs  þz.CGIHTTPServerTestCase.test_headers_and_contentcCs| d¡}| |jtj¡dS)Nz)///////////nocgi.py/../cgi-bin/nothere.sh)r<rkrlrrTrnrrrÚtest_issue19435øs z%CGIHTTPServerTestCase.test_issue19435cCsFtj ddddœ¡}ddi}| dd||¡}| | ¡d |j¡dS) Nr`ri@â)ZspamZeggsZbaconr@z!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs1, python, 123456)rçrèÚ urlencoder<rkrrB)rÚparamsr@rorrrÚ test_postüs  ÿzCGIHTTPServerTestCase.test_postcCs&| d¡}| ¡| |jtj¡dS)Nz/cgi-bin/invalid)r<rrkrlrrTrnrrrÚtest_invaliduris z%CGIHTTPServerTestCase.test_invaliduricCsRddt d¡i}|jdd|d}| d|jdtjf| ¡| d ¡|j f¡dS) Ns AuthorizationsBasic s username:passr0r7rŒrArDr@) Úbase64Z b64encoder<rkrBrrœrr„rl)rr@rorrrÚtest_authorization sÿþz(CGIHTTPServerTestCase.test_authorizationcCs:| d¡}| d|jdtjf| ¡| d¡|jf¡dS)Nr4rArDr@©r<rkrBrrœrr„rlrnrrrÚtest_no_leading_slashs  þz+CGIHTTPServerTestCase.test_no_leading_slashcCsZd}|tjd<| d¡}| d|jdtjf| ¡| d¡|j f¡| tjd|¡dS)NzTest CGI ServerZSERVER_SOFTWAREr0rArDr@) r.r/r<rkrBrrœrr„rl)rZ signaturerorrrÚtest_os_environ_is_not_altereds  þz4CGIHTTPServerTestCase.test_os_environ_is_not_alteredcCs:| d¡}| d|jdtjf| ¡| d¡|jf¡dS)Nz/cgi-bin%2ffile1.pyrArDr@rKrnrrrÚ#test_urlquote_decoding_in_cgi_check!s  þz9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkcCs:| d¡}| d|jdtjf| ¡| d¡|jf¡dS)Nz/cgi-bin/child-dir/file3.pyrArDr@rKrnrrrÚtest_nested_cgi_path_issue21323's  þz5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323cCs:| d¡}| d|jdtjf| ¡| d¡|jf¡dS)Nz/cgi-bin/file4.py?a=b?c=dsa=b?c=drDr@rKrnrrrÚ&test_query_with_multiple_question_mark-s  þzData )r\rHrrœrJrKr\r]r'rrrr `s   zSocketlessRequestHandler.do_GETcGsdSr r)rr—rrrrrgsz$SocketlessRequestHandler.log_message)N)rrrrr rÚ __classcell__rrr]rrVWsrVc@seZdZdd„ZdS)Ú!RejectingSocketlessRequestHandlercCs| tj¡dS)NF)rQrZEXPECTATION_FAILEDr'rrrÚhandle_expect_100ks z3RejectingSocketlessRequestHandler.handle_expect_100N)rrrrbrrrrrajsrac@s0eZdZdd„Zdd„Zdd„Zedd„ƒZd S) ÚAuditableBytesIOcCs g|_dSr )Údatasr'rrrrrszAuditableBytesIO.__init__cCs|j |¡dSr )rdrR)rrrrrr]uszAuditableBytesIO.writecCs d |j¡S)Nr“)r*rdr'rrrÚgetDataxszAuditableBytesIO.getDatacCs t|jƒSr )rŽrdr'rrrÚ numWrites{szAuditableBytesIO.numWritesN)rrrrr]reÚpropertyrfrrrrrcps rcc@sÊeZdZdZe d¡Zdd„Zdd„Zdd„Z d d „Z d d „Z d d„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/S)0ÚBaseHTTPRequestHandlerTestCasezrTest the functionality of the BaseHTTPServer. Test the support for the Expect 100-continue header. sHTTP/1.[0-9]+ 200 OKcCs tƒ|_dSr )rVÚhandlerr'rrrr4ˆsz$BaseHTTPRequestHandlerTestCase.setUpcCs:t|ƒ}tƒ}||j_||j_|j ¡| d¡| ¡S©Nr)r riÚrfiler\Úhandle_one_requestÚseekÚ readlines)rrÚinputÚoutputrrrÚsend_typical_request‹s  z3BaseHTTPRequestHandlerTestCase.send_typical_requestcCs| |jj¡dSr )rŠrir\r'rrrÚverify_get_called”sz0BaseHTTPRequestHandlerTestCase.verify_get_calledcs,dD]"‰| t‡fdd„|Dƒƒd¡qdS)N)sServer: sDate: sContent-Type: c3s|]}| ˆ¡VqdSr )Ú startswith)Ú.0Úh©Z fieldNamerrÚ ™r“zIBaseHTTPRequestHandlerTestCase.verify_expected_headers..r`)rkÚsum)rr@rrvrÚverify_expected_headers—sz6BaseHTTPRequestHandlerTestCase.verify_expected_headerscCs|j |¡}| |¡dSr )ÚHTTPResponseMatchÚsearchrÒ)rrÎÚmatchrrrÚverify_http_server_response›s z:BaseHTTPRequestHandlerTestCase.verify_http_server_responsecCsš| d¡}| |d¡| |dd…¡| ¡| |dd¡| |jjd¡| |jjd¡| |jjd¡| |jj d ¡|  |jj   ¡d ¡dS) NóGET / HTTP/1.1 rr`éÿÿÿÿr_úGET / HTTP/1.1r7rjrBr© rqr}ryrrrkriÚ requestlineÚcommandrcÚrequest_versionÚassertSequenceEqualr@r7©rÚresultrrrÚ test_http_1_1Ÿs z,BaseHTTPRequestHandlerTestCase.test_http_1_1cCsš| d¡}| |d¡| |dd…¡| ¡| |dd¡| |jjd¡| |jjd¡| |jjd¡| |jj d ¡|  |jj   ¡d ¡dS) NsGET / HTTP/1.0 rr`rr_úGET / HTTP/1.0r7rjúHTTP/1.0rrr†rrrÚ test_http_1_0«s z,BaseHTTPRequestHandlerTestCase.test_http_1_0cCs6| d¡}| t|ƒd¡| |dd¡| ¡dS)NsGET / HTTP/0.9 r`rr_)rqrkrŽrrr†rrrÚ test_http_0_9·s z,BaseHTTPRequestHandlerTestCase.test_http_0_9cCsH| d¡}| |d d¡¡| |d| d¡…¡| |jj¡dS)Ns)GET /spaced out HTTP/1.1 Host: dummy rs HTTP/1.1 400 r`ó )rqrŠrsryÚindexÚ assertFalserir\r†rrrÚtest_extra_space½s ÿz/BaseHTTPRequestHandlerTestCase.test_extra_spacecCsž| d¡}| |d¡| |dd…¡| ¡| |dd¡| |jjd¡| |jjd¡| |jjd¡| |jj d ¡d }|  |jj   ¡|¡dS) Ns(GET / HTTP/1.0 Expect: 100-continue rr`rr_r‰r7rjrŠ©)ZExpectz 100-continuer©rr‡r@rrrÚtest_with_continue_1_0Çs z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_0cCsÀ| d¡}| |dd¡| |dd¡| |dd¡| |dd…¡| ¡| |dd ¡| |jjd ¡| |jjd ¡| |jjd ¡| |jjd ¡d}|  |jj   ¡|¡dS)Nó(GET / HTTP/1.1 Expect: 100-continue rsHTTP/1.1 100 Continue r`résHTTP/1.1 200 OK rr_r€r7rjrBr‘) rqrkryrrrir‚rƒrcr„r…r@r7r’rrrÚtest_with_continue_1_1Ôs z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1cCsNtdƒ}tƒ}tƒ}||_||_d|_d|_d|_| d¡|  |j d¡dS)Nr~rBré¢r•) r rcrVrkr\r„r‚rƒrQrkrf©rrorprirrrÚ#test_header_buffering_of_send_errorãs zBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorcCsXtdƒ}tƒ}tƒ}||_||_d|_| d¡| |jd¡|  ¡| |jd¡dS)Nr~rBr—rr`) r rcrVrkr\r„Zsend_response_onlyrkrfrKr˜rrrÚ+test_header_buffering_of_send_response_onlyñs zJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_onlycCsvtdƒ}tƒ}tƒ}||_||_d|_| dd¡| dd¡| |jd¡|  ¡| |  ¡d¡| |jd¡dS) Nr~rBZFooÚfooÚbarrsFoo: foo bar: bar r`) r rcrVrkr\r„rJrkrfrKrer˜rrrÚ$test_header_buffering_of_send_headerÿs  zCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_headercCsŠdd„}tdƒ}tƒ}||j_||j_d|j_|j ¡| ||ƒd¡||ƒ d¡}| |dd¡| |d d¡| |d d ¡dS) NcSs(| ¡}| d¡| ¡}| |¡|Srj)Útellrmr)ríÚposrrrrÚ_readAndReseeks   z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.._readAndReseekr”rBr“rrsHTTP/1.1 100 Continuer`r•sHTTP/1.1 200 OK) r rirkr\r„rlZassertNotEqualr©rk)rr rorpr‡rrrÚ$test_header_unbuffered_when_continues zCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continuecCst|j}tƒ|_| d¡}| |dd¡| |dd…¡| |jj¡| tdd„|dd…Dƒƒd¡||_dS)Nr”rs!HTTP/1.1 417 Expectation Failed r`rcss|]}|dkVqdS)sConnection: close Nr)rtÚrrrrrw.r“zMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected..)rirarqrkryrr\rx)rZ usual_handlerr‡rrrÚtest_with_continue_rejected%s "z:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedcCsD| ddd¡}| |dd¡| |jj¡| |jjt¡dS)NsGET óxérs#HTTP/1.1 414 Request-URI Too Long )rqrkrrir\ZassertIsInstancer‚rür†rrrÚtest_request_length1sz2BaseHTTPRequestHandlerTestCase.test_request_lengthcCsH| dddd¡}| |dd¡| |jj¡| |jjd¡dS)NsGET / HTTP/1.1 X-Foo: barórr¥s rsHTTP/1.1 431 Line too long r€©rqrkrrir\r‚r†rrrÚtest_header_length9s ÿz1BaseHTTPRequestHandlerTestCase.test_header_lengthcCs<| d¡}| |dd¡| |jj¡| |jjd¡dS)NsÎGET / HTTP/1.1 X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar X-Foo: bar rsHTTP/1.1 431 Too many headers r€r¨r†rrrÚtest_too_many_headersAs ÿz4BaseHTTPRequestHandlerTestCase.test_too_many_headerscCs8| d¡}d |¡}d}| tj|dd d¡|¡dS)Ns* / HTTP/1.1r“zFrÞr)rqr*rrérêr[)rr‡ÚtextrrrÚtest_html_escape_on_errorHs ÿ z8BaseHTTPRequestHandlerTestCase.test_html_escape_on_errorcsZ‡‡fdd„}|ˆj_tdƒ‰ˆj ¡ˆ ttˆ¡tdƒ‰ˆj ¡ˆ ttˆ¡dS)Ncstˆƒˆj_dSr )ÚnextriZclose_connectionr©Z close_valuesrrrrlRszPBaseHTTPRequestHandlerTestCase.test_close_connection..handle_one_request)T)FFT)rirlÚiterÚhandler<Ú StopIterationr­)rrlrr®rÚtest_close_connectionOs  z4BaseHTTPRequestHandlerTestCase.test_close_connectionc Csdt ¡}t |¡\ }}}}}}}} } d|jj|||jj|||||f} | |jj|d| ¡dS)Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)rÆ)ÚtimeÚgmtimeriZ weekdaynameZ monthnamerkZdate_time_string) rZnowZyearZmonthZdayZhhZmmÚssZwdÚyÚzr=rrrÚtest_date_time_string^s  üz4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)rrrÚ__doc__ÚreÚcompilerzr4rqrrryr}rˆr‹rŒrr“r–r™ršrr¡r£r¦r©rªr¬r²r¸rrrrrh€s0       rhc@s0eZdZdZdd„Zdd„Zdd„Zdd „Zd S) Ú SimpleHTTPRequestHandlerTestCasez Test url parsing cCs^tj t ¡d¡|_tj dd¡|_tj dd¡|_tƒ|_tdd|_ tt   d¡d|_ dS)Nrìr›rœrW) r.rcr*r²Ú translated_1Ú translated_2Ú translated_3rVÚ handler_1Ú handler_2ÚpathlibÚPurePathÚ handler_3r'rrrr4ms  z&SimpleHTTPRequestHandlerTestCase.setUpcCsî|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡dS)Nz /filenamez/filename?foo=barz/filename?a=b&spam=eggs#zot©rÀÚtranslate_pathrkr½rÁr¾rÄr¿©rrcrrrÚtest_query_argumentsus$         z5SimpleHTTPRequestHandlerTestCase.test_query_argumentscCs |j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡|j d¡}| ||j¡dS)Nz //filenamez//filename?foo=barrÅrÇrrrÚtest_start_with_double_slash‹s      z=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slashcCs0t tjdt¡|j d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j¡|j d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j¡|j d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j¡|j d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j ¡|j  d¡}| tjtj¡}|  ||j¡Wdƒn1s"0YdS)Nrczc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r Z swap_attrrr.ÚntpathrÀrÆrÂÚseprkr½rÁr¾rÄr¿rÇrrrÚtest_windows_colonšsJ            z3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)rrrr¹r4rÈrÉrÌrrrrr¼ks r¼c@seZdZdd„ZdS)Ú MiscTestCasecCsdg}hd£}ttƒD]<}| d¡s||vr,qtt|ƒ}t|ddƒdkr| |¡q| tj|¡dS)N>r&Z nobody_uidr¯Ú_rz http.server)r®rrsÚgetattrrRZassertCountEqualÚ__all__)rr=Z blacklistrîZ module_objectrrrÚtest_allÆs   zMiscTestCase.test_allN)rrrrÑrrrrrÍÅsrÍc@sdeZdZdd„Ze d¡dd„ƒZe d¡dd„ƒZdZd Z e d¡d d „ƒZ e d¡d d „ƒZ dS)ÚScriptTestCasecCs0tjtjtjtjtjdd„dddddS)NcSsdS)N)rrrrrrrÚÚr“z2ScriptTestCase.mock_server_class..)r")r!)rZ)r%)r Z MagicMockr'rrrÚmock_server_classÔsÿÿÿÿÿz ScriptTestCase.mock_server_classzbuiltins.printcCs0| ¡}tj|dd| |jtjtjf¡dS©N©Z ServerClassÚbind©rÔrr¯rÚaddress_familyr!ÚAF_INET6ÚAF_INET©rrÎÚ mock_serverrrrÚtest_server_test_unspecás  þz&ScriptTestCase.test_server_test_unspeccCs0| ¡}tj|dd| |jtjtjf¡dS)Nr rÖrØrÜrrrÚtest_server_test_localhostês  þz)ScriptTestCase.test_server_test_localhost)z::z'2001:0db8:85a3:0000:0000:8a2e:0370:7334z::1)z0.0.0.0z8.8.8.8z 127.0.0.1cCs6|jD]*}| ¡}tj||d| |jtj¡qdSrÕ)Ú ipv6_addrsrÔrr¯rkrÙr!rÚ©rrÎr×rÝrrrÚtest_server_test_ipv6ÿs z$ScriptTestCase.test_server_test_ipv6cCs6|jD]*}| ¡}tj||d| |jtj¡qdSrÕ)Ú ipv4_addrsrÔrr¯rkrÙr!rÛrárrrÚtest_server_test_ipv4s z$ScriptTestCase.test_server_test_ipv4N) rrrrÔr ZpatchrÞrßràrãrârärrrrrÒÒs    rÒc Cs@t ¡}z&t tttttt t t ¡Wt  |¡n t  |¡0dSr ) r.r²r Z run_unittestrŸrhrAr¬rr¼rÍrÒr¶)Úverboser³rrrÚ test_mainsø ræÚ__main__)N)=r¹Ú collectionsrZ http.serverrrrrr8rrr.r!rárºrIrÊrÂrÉZ email.messagerÄZ email.utilsréZ http.clientÚ urllib.parserçr´r³rÀrr r Úior r¯r r rrZTestCaser,rArŸr¬r(r)r*r,rÚhasattrrùrrVrarcrhr¼rÍrÒrærrrrrÚsh     P$h   ÿ~lZ <