a ze@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 ddej'Z(Gddde(Z)Gddde(Z*Gddde(Z+dZ,dZ-dZ.dZ/e0e1e doe 2dkdGddde(Z3GdddeZ4Gdd d e4Z5Gd!d"d"Z6Gd#d$d$ej'Z7Gd%d&d&ej'Z8Gd'd(d(ej'Z9Gd)d*d*ej'Z:d+d,Z;e, Josip Dzolonga, and Michael Otteneder for the 2007/08 GHOP contest. ) OrderedDict)BaseHTTPRequestHandler HTTPServerSimpleHTTPRequestHandlerCGIHTTPRequestHandler)server HTTPStatusN)mock)BytesIO)supportc@seZdZddZdddZdS)NoLogRequestHandlercGsdSN)selfargsrrI/opt/bitninja-python-dojo/embedded/lib/python3.9/test/test_httpservers.py log_message$szNoLogRequestHandler.log_messageNcCsdSNr)rnrrrread(szNoLogRequestHandler.read)N)__name__ __module__ __qualname__rrrrrrr #sr c@s$eZdZddZddZddZdS)TestServerThreadcCstj|||_||_dSr ) threadingThread__init__request_handler test_object)rrrrrrr-s zTestServerThread.__init__cCsdtd|j|_|jj\|j_|j_|jj d|_z|j dW|j n |j 0dS)N) localhostrg?) rrrsocket getsocknamerHOSTPORTserver_startedsetZ serve_foreverZ server_closerrrrrun2s zTestServerThread.runcCs|j|dSr )rshutdownjoinr'rrrstop<s zTestServerThread.stopN)rrrrr(r+rrrrr,s rc@s,eZdZddZddZddifddZdS) BaseTestCasecCsDt|_tt_t|_t ||j |_ |j |j dSr )r Zthreading_setup_threadsZEnvironmentVarGuardosenvironrEventr%rrthreadstartwaitr'rrrsetUpBs     zBaseTestCase.setUpcCs*|jd|_tjtj|jdSr )r1r+r.r/__exit__r Zthreading_cleanupr-r'rrrtearDownJs  zBaseTestCase.tearDownGETNcCs0tj|j|j|_|j|||||jSr )httpclientHTTPConnectionr#r$ connectionrequest getresponse)rZurimethodbodyheadersrrrr<PszBaseTestCase.request)rrrr4r6r<rrrrr,Asr,c@seZdZGdddeeZddZddZddZd d Z d d Z d dZ ddZ ddZ ddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+S),BaseHTTPServerTestCasec@s\eZdZdZdZddZddZddZdd Zd d Z d d Z ddZ ddZ ddZ dS)z&BaseHTTPServerTestCase.request_handlerHTTP/1.1cCs0|tj|dd|dd|dS)N Content-Type text/html Connectionclose send_responser NO_CONTENT send_header end_headersr'rrrdo_TEST[s   z.BaseHTTPServerTestCase.request_handler.do_TESTcCs0|tj|dd|dd|dS)NrCrDrE keep-aliverGr'rrrdo_KEEPas   z.BaseHTTPServerTestCase.request_handler.do_KEEPcCs|ddS)N send_errorr'rrr do_KEYERRORgsz2BaseHTTPServerTestCase.request_handler.do_KEYERRORcCs|tjdSr rQr NOT_FOUNDr'rrr do_NOTFOUNDjsz2BaseHTTPServerTestCase.request_handler.do_NOTFOUNDcCs|ddddS)NrOz Short MessagezThis is a long explanationrPr'rrrdo_EXPLAINERRORmsz6BaseHTTPServerTestCase.request_handler.do_EXPLAINERRORcCs.|d|dd|dd|dS)NrOrCrDrErF)rHrJrKr'rrr do_CUSTOMqs   z0BaseHTTPServerTestCase.request_handler.do_CUSTOMcCsJ|d|dd|dd||jdd}|j|dS)NrO X-SpecialDängerous MindrErFzx-special-incomingutf-8)rHrJrKr@encodewfilewrite)rr?rrrdo_LATINONEHEADERws    z8BaseHTTPServerTestCase.request_handler.do_LATINONEHEADERcCs|t|jdddSNrQintpathr'rrr do_SEND_ERRORsz4BaseHTTPServerTestCase.request_handler.do_SEND_ERRORcCs|t|jdddSr_rar'rrrdo_HEADsz.BaseHTTPServerTestCase.request_handler.do_HEADN)rrrprotocol_versiondefault_request_versionrLrNrRrUrVrWr^rdrerrrrrWsrcCs,t|tj|j|j|_|jdSr ) r,r4r8r9r:r#r$conconnectr'rrrr4s zBaseHTTPServerTestCase.setUpcCs,|jdd|j}||jtjdS)Nr7/)rhr<r= assertEqualstatusrNOT_IMPLEMENTEDrresrrr test_commands z#BaseHTTPServerTestCase.test_commandcCs>d|j_|jdd|j|j}||jtjdS)Nz HTTP/1.1 ZXYZBOGUSrj rh _http_vsn_str putrequest endheadersr=rkrlrrmrnrrrtest_request_line_trimmings   z1BaseHTTPServerTestCase.test_request_line_trimmingcCs>d|j_|jdd|j|j}||jtjdS)NZFUBARr7rj rhrrrsrtr=rkrlrZ BAD_REQUESTrnrrrtest_version_boguss   z)BaseHTTPServerTestCase.test_version_boguscCs>d|j_|jdd|j|j}||jtjdS)Nz HTTP/9.9.9r7rjrvrnrrrtest_version_digitss   z*BaseHTTPServerTestCase.test_version_digitscCs>d|j_|jdd|j|j}||jtjdS)Nrr7rjrqrnrrrtest_version_none_gets   z,BaseHTTPServerTestCase.test_version_none_getcCs>d|j_|jdd|j|j}||jtjdS)NrCUSTOMrjrvrnrrrtest_version_nones   z(BaseHTTPServerTestCase.test_version_nonecCsFd|j_d|j_|jdd|j|j}||jtj dS)NczHTTP/9.9r7rj) rhZ _http_vsnrrrsrtr=rkrlrZHTTP_VERSION_NOT_SUPPORTEDrnrrrtest_version_invalids   z+BaseHTTPServerTestCase.test_version_invalidcCs>d|j_|jdd|j|j}||jtjdSrrvrnrrrtest_send_blanks   z&BaseHTTPServerTestCase.test_send_blankcCsD|jdd|jdd|j|j}||jtjdS)Nr7rjrErF) rhrs putheaderrtr=rkrlrrmrnrrrtest_header_closes   z(BaseHTTPServerTestCase.test_header_closecCsLd|j_|jdd|jdd|j|j}||jtj dS)NrBr7rjrErM) rhrrrsrrtr=rkrlrrmrnrrrtest_header_keep_alives   z-BaseHTTPServerTestCase.test_header_keep_alivecCs,|jdd|j}||jtjdS)NTESTrj)rhr<r=rkrlrrIrnrrr test_handlers z#BaseHTTPServerTestCase.test_handlercCsJ|jdd|j}||dd|jdd||jjdS)NZKEEPrjrErMr)rhr<r=rk getheaderZ addCleanuprFrnrrrtest_return_header_keep_alives  z4BaseHTTPServerTestCase.test_return_header_keep_alivecCs*|jdd|j}||jddS)NZKEYERRORrjrOrhr<r=rkrlrnrrrtest_internal_key_errors z.BaseHTTPServerTestCase.test_internal_key_errorcCs*|jdd|j}||jddS)NrzrjrOrrnrrrtest_return_custom_statuss z0BaseHTTPServerTestCase.test_return_custom_statuscCs>|jdd|j}||jd|t|ddS)NZ EXPLAINERRORrjrOContent-Length)rhr<r=rkrl assertTruerbrrnrrrtest_return_explain_errors z0BaseHTTPServerTestCase.test_return_explain_errorcCsL|jjddddid|j}||dd||dddS) NZLATINONEHEADERrjzX-Special-IncominguÄrger mit Unicoder@rXrYrZ)rhr<r=rkrrr[rnrrrtest_latin1_headers   z)BaseHTTPServerTestCase.test_latin1_headercCsN|jdd|j}||jtj|}|t| dt |dS)NZNOTFOUNDrjr) rhr<r=rkrlrrTrrbrlen)rrodatarrrtest_error_content_lengths  z0BaseHTTPServerTestCase.test_error_content_lengthcCstjtjf}tjtjtjtjtjfD]}|jdd||j }| ||j | d| d| d| d||vr| d| d| }| d|q$dS)NZ SEND_ERROR/{}rrCTransfer-Encoding)r NOT_MODIFIED RESET_CONTENTrIZ PROCESSINGSWITCHING_PROTOCOLSrhr<formatr=rkrlrrrZallow_transfer_encoding_codescoderorrrrtest_send_errors  z&BaseHTTPServerTestCase.test_send_errorcCstjtjf}tjtjtjtjtjfD]}|jdd||j }| ||j |tjkr| t |ddk|d|dn$| d|d| d|d||vr| d|d|}| d|q$dS) NHEADrrrrDrCrr)rrrOKrIrrhr<rr=rkrlrrbrassertInrrrrrtest_head_via_send_errors&  z/BaseHTTPServerTestCase.test_head_via_send_errorN)rrrr rrr4rprurwrxryr{r}r~rrrrrrrrrrrrrrrrAVs*. rAc@s,eZdZGdddeZddZddZdS)RequestHandlerLoggingTestCasec@s$eZdZdZdZddZddZdS)z-RequestHandlerLoggingTestCase.request_handlerrBcCs|tj|dSr )rHrrrKr'rrrdo_GET*s z4RequestHandlerLoggingTestCase.request_handler.do_GETcCs|tjddS)NzFile not foundrSr'rrrdo_ERROR.sz6RequestHandlerLoggingTestCase.request_handler.do_ERRORN)rrrrfrgrrrrrrr&srcCsvtj|j|j|_|jt(}|j dd|j Wdn1sT0Y| | ddS)Nr7rjz"GET / HTTP/1.1" 200 - )r8r9r:r#r$rhrir captured_stderrr<r=rgetvalueendswith)rerrrrrtest_get1s  ( z&RequestHandlerLoggingTestCase.test_getcCstj|j|j|_|jt(}|j dd|j Wdn1sT0Y| d}| |dd| |dddS)NERRORrj rz code 404, message File not foundr`z"ERROR / HTTP/1.1" 404 -)r8r9r:r#r$rhrir rr<r=rsplitrr)rrlinesrrrtest_err<s  (z&RequestHandlerLoggingTestCase.test_errN)rrrrrrrrrrrr%s  rc@seZdZGdddeeZddZddZd#dd Ze e j d kd e e j d kd e ejdddZddZddZddZddZddZddZddZdd Zd!d"ZdS)$SimpleHTTPServerTestCasec@s eZdZdS)z(SimpleHTTPServerTestCase.request_handlerNrrrrrrrrJsrcCst|t|_t}t|d|_tj |d|_ tj |j |_ d|j |_tj |j d}t|d$}||j|Wdn1s0Yt|j}tj|tjj}|jdd|_tjj|dd |_dS) NsWe are the knights who say Ni!)dirrjtestwbr)Z microsecondTZusegmt) r,r4r.getcwdcwdtempfile gettempdirchdirrmkdtemptempdirrcbasename tempdir_namebase_urlr*openr]flushstatst_mtimedatetimeZ fromtimestamptimezoneZutcreplacelast_modif_datetimeemailutilsZ formatdate timestamplast_modif_header)rZ basetempdirZtempnameZtempmtimeZ last_modifrrrr4Ms(      & zSimpleHTTPServerTestCase.setUpc CsJz8t|jzt|jWn Yn0Wt|n t|0dSr )r.rrshutilrmtreerr,r6r'rrrr6bs z!SimpleHTTPServerTestCase.tearDownNcsfdd}d|_}||j||j|rT||||jd|j ddd|ddd |S) Ncsjd_dS)zWDon't close reader yet so we can check if there was leftover buffered inputN)fprreaderresponserr close_connmszDSimpleHTTPServerTestCase.check_status_and_reason..close_conn rErFrzConnection should be closed) Z _close_connrrrkrlassertIsNotNonereasonversionmsggetrF)rrrlrrr?rrrcheck_status_and_reasonls   z0SimpleHTTPServerTestCase.check_status_and_reasondarwinz2undecodable name cannot always be decoded on macOSwin32z+undecodable name cannot be decoded on win32zneed support.TESTFN_UNDECODABLEcCst}ttjd}ttj|j |d}| tjWdn1sP0Y| |j d}tj dkrt|j D]}|dkr|}qq||tj}tjj|dd}|d||d ||d tj|d d |d || |j d|}|j|tjtjd dS)Nz.txtrrjrr surrogatepass)errorsz href="%s"surrogateescape>%s    *z!SimpleHTTPServerTestCase.test_getcCsT|j|jddd}||tj||dtt|j ||dddS)Nrrr>zcontent-lengthz content-typezapplication/octet-stream) r<rrrrrkrstrrrrrrrr test_heads    z"SimpleHTTPServerTestCase.test_headcCstj}|j|d<|j|jd|d}||tj|j t j dd}tj}tj j |dd|d<|j|jd|d}||tjdS) zCheck 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-Sincerrr`)ZhoursTrN)rmessageMessagerr<rrrrrr timedeltarformat_datetime)rr@rZnew_dtrrrtest_browser_caches    z+SimpleHTTPServerTestCase.test_browser_cachecCsZ|j}|tjdd}tj}tjj|dd|d<|j|j d|d}| |t j dS)Nim)ZdaysTrrrr) rrrrrrrrr<rrrr)rZdtZold_dtr@rrrrtest_browser_cache_file_changeds  z8SimpleHTTPServerTestCase.test_browser_cache_file_changedcCsBtj}|j|d<d|d<|j|jd|d}||tjdS)Nr*z If-None-Matchrr) rrrrr<rrrr)rr@rrrr,test_browser_cache_with_If_None_Match_headers   zESimpleHTTPServerTestCase.test_browser_cache_with_If_None_Match_headercCsX|jddd}||tj|jddd}||tj|jddd}||tjdS)NrjZFOOrZcustomZGETs)r<rrrmrrrrtest_invalid_requestss z.SimpleHTTPServerTestCase.test_invalid_requestscCs@||jd}|j|tj|jd|jd}|||jdS)zChecks that the datetime returned in Last-Modified response header is the actual datetime of last modification, rounded to the second rrz Last-modifiedN) r<rrrrrr@rkr)rrrrrrtest_last_modifieds z+SimpleHTTPServerTestCase.test_last_modifiedcCs||jd}|j|tj|jd||jd}||tj||jd}||tj||j}||tj||jd}||tj||jd}||tj|| d|jddS) Nrrrrjrrrr) r<rrrrrrTrrkrrrrrtest_path_without_leading_slash s  z8SimpleHTTPServerTestCase.test_path_without_leading_slashc Csd}tj|j|}zt|dWn tyFtd|Yn0z6| |j d}| |t j }|j}Wt|n t|0||dtj|dd}||||dS)Nz .txtwz-Can not create file %s on current file systemrjrFr)r.rcr*rrrFOSErrorunittestZSkipTestr<rrrrr@Zget_content_charsetunlinkrrrrr[)rrfullpathrr?rZ html_textrrrtest_html_escape_filenames     z2SimpleHTTPServerTestCase.test_html_escape_filename)N)rrrr rrr4r6rr skipIfrrZ skipUnlessr rrrrrrrrr r rrrrrrIs.   '     rzD#!%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"]) a'#!%s import os print("X-ambv: was here") print("Content-type: text/html") print() print("
")
for k, v in os.environ.items():
    try:
        k.encode('ascii')
        v.encode('ascii')
    except UnicodeEncodeError:
        continue  # see: BPO-44647
    print(f"{k}={v}")
print("
") rz7This test can't be run reliably as root (issue #13308).c@seZdZGdddeeZejdZddZ ddZ dd Z d d Z d d Z ddZddZddZddZddZddZddZddZddZd d!Zd"d#Zd$S)%CGIHTTPServerTestCasec@s eZdZdS)z%CGIHTTPServerTestCase.request_handlerNrrrrrrdsrasciicCs 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|jd|_d|_d|_d|_d|_d|_d|_trtj |jd|_t|j|_ntj|_z|jdWn&tyL| |!dYn0tj |jd|_t"|jd  }|#t$|jWdn1s0Yt%|jd tj |j d |_t"|jd dd  }|#t$|jWdn1s0Yt%|jd tj |j d |_t"|jd dd  }|#t&|jWdn1sX0Yt%|jd tj |j d|_t"|jd dd  }|#t$|jWdn1s0Yt%|jd tj |j d|_t"|jd dd $}|#t'|jdfWdn1s 0Yt%|jd tj |jd|_t"|jd dd  }|#t$|jWdn1s0Yt%|jd tj |j d|_(t"|j(d dd  }|#t)|jWdn1s0Yt%|j(d t*|jdS)Nzcgi-binz child-dirsubrpythonrZz0Python executable path is not encodable to utf-8znocgi.pyr izfile1.py)encodingzfile2.pyzfile3.pyzfile4.pyZ QUERY_STRINGzfile5.pyzfile6.py)+r,r4r.rrrr parent_dirrcr*cgi_dir cgi_child_dir sub_dir_1 sub_dir_2cgi_dir_in_sub_dirmkdir nocgi_path file1_path file2_path file3_path file4_path file5_path_pythonexe_symlinkr Z can_symlinkZ pythonexeZ PythonSymlink __enter__r executabler[UnicodeEncodeErrorr6ZskipTestrr] cgi_file1r cgi_file2 cgi_file4 file6_path cgi_file6r)rrZfile1Zfile2Zfile3Zfile4Zfile5Zfile6rrrr4ist         0000400zCGIHTTPServerTestCase.setUpc Cszt|j|jr$|jddd|jr6t|j|jrHt|j|jrZt|j|j rlt|j |j r~t|j |j rt|j |j rt|j t |jt |jt |jt |jt |jt |jWt|n t|0dSr )r.rrr$r5rremoverr r!r"r#r+rmdirrrrrrrr,r6r'rrrr6s2             zCGIHTTPServerTestCase.tearDowncCsdttddddddddddddddddd d d td d tddd }|D]R\}}t|trtt|trt||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.pyr0az/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) IndexErroritems isinstancetype issubclass Exception assertRaisesrZ_url_collapse_pathrk)rZ test_vectorsrcexpectedactualrrrtest_url_collapse_pathsP z,CGIHTTPServerTestCase.test_url_collapse_pathcCs:|d}|||d|jfd|jdtjfdS)Nr0 Content-type Hello WorldrD)r<rkrrrllineseprrrnrrrtest_headers_and_contents  z.CGIHTTPServerTestCase.test_headers_and_contentcCs|d}||jtjdS)Nz)///////////nocgi.py/../cgi-bin/nothere.sh)r<rkrlrrTrnrrrtest_issue19435s z%CGIHTTPServerTestCase.test_issue19435cCsFtjdddd}ddi}|dd||}||d |jdS) Nr`ri@)ZspamZeggsZbaconr@z!application/x-www-form-urlencodedz/cgi-bin/file2.pyZPOSTs1, python, 123456)rr urlencoder<rkrrB)rparamsr@rorrr test_posts  zCGIHTTPServerTestCase.test_postcCs&|d}|||jtjdS)Nz/cgi-bin/invalid)r<rrkrlrrTrnrrrtest_invaliduri s z%CGIHTTPServerTestCase.test_invaliduricCsRddtdi}|jdd|d}|d|jdtjf||d |j fdS) Ns AuthorizationsBasic s username:passr0r7rrArDr@) base64Z b64encoder<rkrBrrrrrl)rr@rorrrtest_authorizationsz(CGIHTTPServerTestCase.test_authorizationcCs:|d}|d|jdtjf||d|jfdS)Nr4rArDr@r<rkrBrrrrrlrnrrrtest_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<rkrBrrrrrl)rZ signaturerorrrtest_os_environ_is_not_altered!s  z4CGIHTTPServerTestCase.test_os_environ_is_not_alteredcCs:|d}|d|jdtjf||d|jfdS)Nz/cgi-bin%2ffile1.pyrArDr@rKrnrrr#test_urlquote_decoding_in_cgi_check*s  z9CGIHTTPServerTestCase.test_urlquote_decoding_in_cgi_checkcCs:|d}|d|jdtjf||d|jfdS)Nz/cgi-bin/child-dir/file3.pyrArDr@rKrnrrrtest_nested_cgi_path_issue213230s  z5CGIHTTPServerTestCase.test_nested_cgi_path_issue21323cCs:|d}|d|jdtjf||d|jfdS)Nz/cgi-bin/file4.py?a=b?c=dsa=b?c=drDr@rKrnrrr&test_query_with_multiple_question_mark6s  zData )r\rHrrrJrKr\r]r'rrrris   zSocketlessRequestHandler.do_GETcGsdSr r)rrrrrrrpsz$SocketlessRequestHandler.log_message)N)rrrrrr __classcell__rrr]rrV`srVc@seZdZddZdS)!RejectingSocketlessRequestHandlercCs|tjdS)NF)rQrZEXPECTATION_FAILEDr'rrrhandle_expect_100ts z3RejectingSocketlessRequestHandler.handle_expect_100N)rrrrbrrrrrassrac@s0eZdZddZddZddZeddZd S) AuditableBytesIOcCs g|_dSr )datasr'rrrr{szAuditableBytesIO.__init__cCs|j|dSr )rdrR)rrrrrr]~szAuditableBytesIO.writecCs d|jS)Nr)r*rdr'rrrgetDataszAuditableBytesIO.getDatacCs t|jSr )rrdr'rrr numWritesszAuditableBytesIO.numWritesN)rrrrr]repropertyrfrrrrrcys rcc@seZdZdZedZddZddZddZ d d Z d d Z d dZ ddZ ddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/S)0BaseHTTPRequestHandlerTestCasezrTest the functionality of the BaseHTTPServer. Test the support for the Expect 100-continue header. sHTTP/1.[0-9]+ 200 OKcCs t|_dSr )rVhandlerr'rrrr4sz$BaseHTTPRequestHandlerTestCase.setUpcCs:t|}t}||j_||j_|j|d|SNr)r rirfiler\handle_one_requestseek readlines)rrinputoutputrrrsend_typical_requests  z3BaseHTTPRequestHandlerTestCase.send_typical_requestcCs||jjdSr )rrir\r'rrrverify_get_calledsz0BaseHTTPRequestHandlerTestCase.verify_get_calledcs,dD]"|tfdd|DdqdS)N)sServer: sDate: sContent-Type: c3s|]}|VqdSr ) startswith).0hZ fieldNamerr rzIBaseHTTPRequestHandlerTestCase.verify_expected_headers..r`)rksum)rr@rrvrverify_expected_headerssz6BaseHTTPRequestHandlerTestCase.verify_expected_headerscCs|j|}||dSr )HTTPResponseMatchsearchr)rrmatchrrrverify_http_server_responses z:BaseHTTPRequestHandlerTestCase.verify_http_server_responsecCs|d}||d||dd|||dd||jjd||jjd||jjd||jj d | |jj d dS) NGET / HTTP/1.1 rr`r_GET / HTTP/1.1r7rjrBr rqr}ryrrrkri requestlinecommandrcrequest_versionassertSequenceEqualr@r7rresultrrr test_http_1_1s 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.0r7rjHTTP/1.0rrrrrr test_http_1_0s z,BaseHTTPRequestHandlerTestCase.test_http_1_0cCs6|d}|t|d||dd|dS)NsGET / HTTP/0.9 r`rr_)rqrkrrrrrrr test_http_0_9s z,BaseHTTPRequestHandlerTestCase.test_http_0_9cCsH|d}||dd||d|d||jjdS)Ns)GET /spaced out HTTP/1.1 Host: dummy rs HTTP/1.1 400 r` )rqrrsryindex assertFalserir\rrrrtest_extra_spaces 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_rr7rjr)ZExpectz 100-continuerrrr@rrrtest_with_continue_1_0s 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`rsHTTP/1.1 200 OK rr_rr7rjrBr) rqrkryrrrirrrcrrr@r7rrrrtest_with_continue_1_1s z5BaseHTTPRequestHandlerTestCase.test_with_continue_1_1cCsNtd}t}t}||_||_d|_d|_d|_|d| |j ddS)Nr~rBrr) r rcrVrkr\rrrrQrkrfrrorprirrr#test_header_buffering_of_send_errors zBBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_errorcCsXtd}t}t}||_||_d|_|d||jd| ||jddS)Nr~rBrrr`) r rcrVrkr\rZsend_response_onlyrkrfrKrrrr+test_header_buffering_of_send_response_onlys zJBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_response_onlycCsvtd}t}t}||_||_d|_|dd|dd||jd| || d||jddS) Nr~rBZFoofoobarrsFoo: foo bar: bar r`) r rcrVrkr\rrJrkrfrKrerrrr$test_header_buffering_of_send_headers  zCBaseHTTPRequestHandlerTestCase.test_header_buffering_of_send_headercCsdd}td}t}||j_||j_d|j_|j|||d||d}||dd||d d||d d dS) NcSs(|}|d|}|||Srj)tellrmr)rposrrrr_readAndReseeks   z[BaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continue.._readAndReseekrrBrrrsHTTP/1.1 100 Continuer`rsHTTP/1.1 200 OK) r rirkr\rrlZassertNotEqualrrk)rrrorprrrr$test_header_unbuffered_when_continues zCBaseHTTPRequestHandlerTestCase.test_header_unbuffered_when_continuecCst|j}t|_|d}||dd||dd||jj|tdd|ddDd||_dS)Nrrs!HTTP/1.1 417 Expectation Failed r`rcss|]}|dkVqdS)sConnection: close Nr)rtrrrrrw7rzMBaseHTTPRequestHandlerTestCase.test_with_continue_rejected..)rirarqrkryrr\rx)rZ usual_handlerrrrrtest_with_continue_rejected.s "z:BaseHTTPRequestHandlerTestCase.test_with_continue_rejectedcCsD|ddd}||dd||jj||jjtdS)NsGET xrs#HTTP/1.1 414 Request-URI Too Long )rqrkrrir\ZassertIsInstancerrrrrrtest_request_length:sz2BaseHTTPRequestHandlerTestCase.test_request_lengthcCsH|dddd}||dd||jj||jjddS)NsGET / HTTP/1.1 X-Foo: barrrs rsHTTP/1.1 431 Line too long rrqrkrrir\rrrrrtest_header_lengthBs z1BaseHTTPRequestHandlerTestCase.test_header_lengthcCs<|d}||dd||jj||jjddS)NsGET / 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 rrrrrrtest_too_many_headersJs z4BaseHTTPRequestHandlerTestCase.test_too_many_headerscCs8|d}d|}d}|tj|ddd|dS)Ns* / HTTP/1.1rzFrr)rqr*rrrr[)rrtextrrrtest_html_escape_on_errorQs  z8BaseHTTPRequestHandlerTestCase.test_html_escape_on_errorcsZfdd}|j_tdjtttdjttdS)Ncstj_dSr )nextriZclose_connectionrZ close_valuesrrrrl[szPBaseHTTPRequestHandlerTestCase.test_close_connection..handle_one_request)T)FFT)rirliterhandler< StopIterationr)rrlrrrtest_close_connectionXs  z4BaseHTTPRequestHandlerTestCase.test_close_connectionc Csdt}t|\ }}}}}}}} } d|jj|||jj|||||f} ||jj|d| dS)Nz#%s, %02d %3s %4d %02d:%02d:%02d GMT)r)timegmtimeriZ weekdaynameZ monthnamerkZdate_time_string) rZnowZyearZmonthZdayZhhZmmssZwdyzr=rrrtest_date_time_stringgs  z4BaseHTTPRequestHandlerTestCase.test_date_time_stringN)rrr__doc__recompilerzr4rqrrryr}rrrrrrrrrrrrrrrrrrrrrrhs0       rhc@s0eZdZdZddZddZddZdd Zd S) SimpleHTTPRequestHandlerTestCasez Test url parsing cCs^tjtd|_tjdd|_tjdd|_t|_tdd|_ tt dd|_ dS)NrrrrW) r.rcr*r translated_1 translated_2 translated_3rV handler_1 handler_2pathlibPurePath handler_3r'rrrr4vs  z&SimpleHTTPRequestHandlerTestCase.setUpcCs|jd}|||j|jd}|||j|jd}|||j|jd}|||j|jd}|||j|jd}|||j|jd}|||j|jd}|||j|jd}|||jdS)Nz /filenamez/filename?foo=barz/filename?a=b&spam=eggs#zotrtranslate_pathrkrrrrrrrcrrrtest_query_arguments~s$         z5SimpleHTTPRequestHandlerTestCase.test_query_argumentscCs|jd}|||j|jd}|||j|jd}|||j|jd}|||j|jd}|||j|jd}|||jdS)Nz //filenamez//filename?foo=barrrrrrtest_start_with_double_slashs      z=SimpleHTTPRequestHandlerTestCase.test_start_with_double_slashcCs0ttjdt|jd}|tjtj}| ||j |j d}|tjtj}| ||j |j d}|tjtj}| ||j|jd}|tjtj}| ||j |j d}|tjtj}| ||j |j d}|tjtj}| ||j|jd}|tjtj}| ||j |j d}|tjtj}| ||j |j d}|tjtj}| ||j|jd}|tjtj}| ||j |j d}|tjtj}| ||j |j d}|tjtj}| ||jWdn1s"0YdS)Nrczc:c:c:foo/filenamez\c:../filenamezc:\c:..\foo/filenamezc:c:foo\c:c:bar/filename)r Z swap_attrrr.ntpathrrrseprkrrrrrrrrrtest_windows_colonsJ            z3SimpleHTTPRequestHandlerTestCase.test_windows_colonN)rrrrr4rrrrrrrrts rc@seZdZddZdS) MiscTestCasecCsdg}hd}ttD]<}|ds||vr,qtt|}t|dddkr||q|tj|dS)N>Z nobody_uidrr&_rz http.server)rrrsgetattrrRZassertCountEqual__all__)rr=Z blacklistrZ module_objectrrrtest_alls   zMiscTestCase.test_allN)rrrrrrrrrsrc@sdeZdZddZedddZedddZdZd Z edd d Z edd d Z dS)ScriptTestCasecCs0tjtjtjtjtjdddddddS)NcSsdS)N)rrrrrrrrz2ScriptTestCase.mock_server_class..)r")r!)rZ)r%)r Z MagicMockr'rrrmock_server_classsz ScriptTestCase.mock_server_classzbuiltins.printcCs0|}tj|dd||jtjtjfdSNZ ServerClassbindrrrraddress_familyr!AF_INET6AF_INETrr mock_serverrrrtest_server_test_unspecs  z&ScriptTestCase.test_server_test_unspeccCs0|}tj|dd||jtjtjfdS)Nr rrrrrrtest_server_test_localhosts  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||jtjqdSr) ipv6_addrsrrrrkrr!rrrrrrrrtest_server_test_ipv6s z$ScriptTestCase.test_server_test_ipv6cCs6|jD]*}|}tj||d||jtjqdSr) ipv4_addrsrrrrkrr!rrrrrtest_server_test_ipv4s z$ScriptTestCase.test_server_test_ipv4N) rrrrr Zpatchrrrrrrrrrrrs    rcCsttjtdSr )r ZaddModuleCleanupr.rrrrrr setUpModulesr__main__)>r collectionsrZ http.serverrrrrr8rrr.r!rrrIrrrZ email.messagerZ email.utilsrZ http.client urllib.parserrrrrr r ior rr r rrZTestCaser,rArrr(r)r*r,rhasattrrrrVrarcrhrrrrrmainrrrrsh     P$h  ~lZ <