U a@sZdZddlZddlZddlZddlZddlZddlZddlZddlZ ddl Z ddl m Z ddl m Z ddl mZddlmZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZz ddlZWn*ek rGdddZeZYnXdZejdkr@z e dWnek r>dZYnXe!edZ"e"rXej#Z#nGdddZ#z ej$Z%Wne&k rdZ%YnXdZ'e(dk oe!edZ)e j*e j+de j,e-e j*e-fdfZ.e j/rddl0Z1ddl2m3Z3ddl2m4Z4ddl5m6Z6dd l7m8Z8Gd!d"d"ej9Z:Gd#d$d$eZ;e-e-e-d%d&d'Zdd/d0d1Z?dYe-e j*e-e j*e@dd2d3d4ZAdZe j*eBeCd5d6d7ZDe-e@ejEd8d9d:ZFe-e@ejEe j+e j,e-e@fe-fd;dd?d@ZHGdAdBdBeZIGdCdDdDejJeIZKGdEdFdFe#eIZLd[e-e@dGeCe@e j*e jMe;eCe j*e.e j*e@eIdH dIdJZNeCd/dKdLZOd\e-e@dGeCeCeCe j*e jPe-e j*e jPe-e@e-eCe@e j*e jMe;e j*e jQe-e j+e-e j,e-e-fffeCe j*e.ddNdOdPZRe jSe jSddQdRdSZTdd/dTdUZUeVdVkrVeUdS)]aA WSGI and HTTP server for use **during development only**. This server is convenient to use, but is not designed to be particularly stable, secure, or efficient. Use a dedicate WSGI server and HTTP server when deploying to production. It provides features like interactive debugging and code reloading. Use ``run_simple`` to start the server. Put this in a ``run.py`` script: .. code-block:: python from myapp import create_app from werkzeug import run_simple N)datetime) timedelta)timezone)BaseHTTPRequestHandler) HTTPServer_log)_wsgi_encoding_dance)InternalServerError) uri_to_iri) url_parse) url_unquotec@seZdZeejdddZdS) _SslDummy)namereturncCs tddS)NzSSL support unavailable) RuntimeError)selfrrQC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-1tps7o9u\werkzeug\serving.py __getattr__)sz_SslDummy.__getattr__N)__name__ __module__ __qualname__strtAnyrrrrrr(srTntcoloramaFforkc@s eZdZdS) ForkingMixInN)rrrrrrrr <sr Windowsfromfdzssl.SSLContextzte.Literal['adhoc'])WSGIApplication)WSGIEnvironment)RSAPrivateKeyWithSerialization) Certificatec@sNeZdZdZejddddZedddZe dd d Z e e d d d Z dS)DechunkedInputz8An input stream that handles Transfer-Encoding 'chunked'N)rfilercCs||_d|_d|_dS)NFr)_rfile_done_len)rr)rrr__init__YszDechunkedInput.__init__rcCsdS)NTrrrrrreadable^szDechunkedInput.readablecCsTz"|jd}t|d}Wntk r>tdYnX|dkrPtd|S)Nlatin1zInvalid chunk headerrz!Negative chunk length not allowed)r*readlinedecodeintstrip ValueErrorOSError)rliner,rrrread_chunk_lenaszDechunkedInput.read_chunk_len)bufrcCsd}|js|t|kr|jdkr*||_|jdkr:d|_|jdkrtt||j}||t|kr|jt||||d<|jt||8_t|}n.|j|||||<|j|8_||7}|jdkr|j}|dkrtdq|S)NrT) s  z!Missing chunk terminating newline) r+lenr,r:minr*readr3r8)rr;r@n terminatorrrrreadintoks(        zDechunkedInput.readinto) rrr__doc__rBinaryIOr-boolr0r5r: bytearrayrCrrrrr(Vs  r(cs>eZdZUdZded<eedddZdddd Zd dd d Z d dd dZ d dddZ d+e e jdd dddZd dddZd,ee jed dddZedfdd ZedddZedddZd-e jeefe jeefd d d!d"Zee jd d#d$d%Zee jd d#d&d'Zeee jd d(d)d*ZZS).WSGIRequestHandlerz3A request handler that implements WSGI dispatching.BaseWSGIServerserverr.cCsddlm}d|S)Nr) __version__z Werkzeug/)rK)rrKrrrserver_versions z!WSGIRequestHandler.server_versionr%c stj}ddfdd }jjdkr,dnd}js>d_ntjtrVjdf_|jsv|jrvd|j|j}n|j}t |}d |j t j jj jjd |jjjd t|t|jtjtjjjdtjjd jd }jD]^\}}|dd}|dd }|dkrXd|}||krX||d|}|||<q|dd dkrd|d<t|d|d<|jr|jr|j|d<z*jj dd}|dk rt!"||d<Wn8t#k rj$ddYnt%k rYnX|S)Nr.cstjddddj_dS)NzeThe 'environ['werkzeug.server.shutdown']' function is deprecated and will be removed in Werkzeug 2.1. stacklevelT)warningswarnrJshutdown_signalrr/rrshutdown_servers z8WSGIRequestHandler.make_environ..shutdown_serverhttphttps)rr/)rrFrLr)z wsgi.versionzwsgi.url_scheme wsgi.inputz wsgi.errorszwsgi.multithreadzwsgi.multiprocessz wsgi.run_oncezwerkzeug.server.shutdownzwerkzeug.socketSERVER_SOFTWAREREQUEST_METHODZ SCRIPT_NAMEZ PATH_INFO QUERY_STRINGZ REQUEST_URIZRAW_URI REMOTE_ADDRZ REMOTE_PORTZ SERVER_NAMEZ SERVER_PORTZSERVER_PROTOCOL-_ ) CONTENT_TYPECONTENT_LENGTHZHTTP_,ZHTTP_TRANSFER_ENCODINGchunkedTzwsgi.input_terminatedrYZ HTTP_HOST) binary_formZSSL_CLIENT_CERTerrorz&Cannot fetch SSL peer certificate info)&r pathrJ ssl_contextclient_address isinstancerschemenetlocrr)sysstderr multithread multiprocess connectionrMcommandr queryaddress_string port_integerserver_addressrequest_versionheadersitemsupperreplacegetr6lowerr( getpeercertsslDER_cert_to_PEM_certr7logAttributeError) r request_urlrTZ url_schemeZ path_infoenvironkeyvalueZ peer_certrr/r make_environsn            zWSGIRequestHandler.make_environNc sXjdddkr&jd_ddddtddfdd dfdd d dd fd d }z|j j Wnt t j fk r}z|W5d}~XYntk rRj jrddlm}|dd}z dkrdd|tWntk r:YnXj dd|jYnXdS)NZExpectrLz 100-continuesHTTP/1.1 100 Continue )datarcsJdk stddk s tddkrzdd\}}Wntk rdd}}YnXt|}||t}D]&\}}|||}||qd|ksddks|dks|dksd _ d d d |krd  d|krd  t |ts0tdj|jdS)Nzwrite() before start_responserrLzcontent-lengthr[HEAD)i0T ConnectioncloserJServerdateDatezapplications must write bytes)AssertionErrorsplitr7r5 send_responsesetZ send_headerr}addclose_connectionversion_stringZdate_time_stringZ end_headersrjbyteswfilewriteflush)rZcode_strmsgcodeZ header_keysrr)r headers_sent headers_setr status_sent status_setrrrsD         z*WSGIRequestHandler.run_wsgi..writecs@|r(zr|d|dW5d}Xn r4td||S)NrrNzHeaders already set)with_tracebackr)statusrxexc_info)rrrrrrstart_response%sz3WSGIRequestHandler.run_wsgi..start_responser$)apprc sF|}z"|D] }|qs*dW5t|dr@|XdS)Nr)hasattrr)rZapplication_iterr)rrrrrrexecute3s    z,WSGIRequestHandler.run_wsgi..executer)get_current_tracebackT)Zignore_system_exceptionsrfzError on request: %s)N)rxr|r}r6rrrrrrJrConnectionErrorsockettimeoutconnection_dropped Exceptionpassthrough_errorsZ debug.tbtoolsrr r plaintext)rrer tracebackr)rrrrrrrrrrun_wsgis6 $    zWSGIRequestHandler.run_wsgic Cszt|Wnvttjfk r@}z||W5d}~XYnFtk r}z(|jjdk rrt |rr| d|nW5d}~XYnX|jj r| dS)z/Handles a request ignoring dropped connections.NzSSL error occurred: %s) rhandlerrrrrrJrh is_ssl_error log_errorrSinitiate_shutdown)rrrrrrSszWSGIRequestHandler.handlecCs0tr$ttdtj}tt|d|j_dS)NZSIGKILLT) is_running_from_reloadergetattrsignalSIGTERMoskillgetpidrJ_BaseServer__shutdown_request)rsigrrrrasz$WSGIRequestHandler.initiate_shutdown)rfrrcCsdS)z`Called if the connection was closed by the client. By default nothing happens. Nr)rrfrrrrrisz%WSGIRequestHandler.connection_droppedcCs.|j|_|jsd|_n|r*|dS)zHandle a single HTTP request.TN)r)r3Zraw_requestlinerZ parse_requestrr/rrrhandle_one_requestps  z%WSGIRequestHandler.handle_one_request)rmessagercCsf|||dkr.||jkr*|j|dnd}|jdkrb|jd|d|d}|j|ddS)z3Send the response header and log the response code.NrrLzHTTP/0.9 r`ascii) log_request responsesrwZprotocol_versionrrencode)rrrhdrrrrrxs   z WSGIRequestHandler.send_responsecstSN)superrr6r/ __class__rrrsz!WSGIRequestHandler.version_stringcCs*t|ddr|jdS|js dS|jdS)Nrr]rWr)rrrir/rrrrts   z!WSGIRequestHandler.address_stringcCs |jdS)Nr)rir/rrrruszWSGIRequestHandler.port_integerr^)rsizercCsz&t|j}|jd|d|j}Wntk r@|j}YnXt|}tr|ddkrft|d}np|dkrpnf|dkrt|d}nR|ddkrt|d }n:|d krt|d }n&|dd krt|dd }n t|dd}| dd|||dS)Nrr1boldZ200Z304cyan3greenZ404yellow4redmagentainfoz "%s" %s %s) r rgrrrwrZ requestliner_log_add_style _ansi_styler)rrrrgrrrrrs*          zWSGIRequestHandler.log_request)formatargsrcGs|jd|f|dS)NrfrrrrrrrrszWSGIRequestHandler.log_errorcGs|jd|f|dS)Nrrrrrr log_messageszWSGIRequestHandler.log_messagetyperrrcGs.t||d|d|df|dS)Nz - - [z]  )r rtZlog_date_time_stringrrrrrrrrs zWSGIRequestHandler.log)N)N)r^r^)rrrrD__annotations__propertyrrMrrrr BaseExceptionrOptionalrrr5rrrtruUnionrrrrr __classcell__rrrrrHs: X\      rH)rstylesrcGs:ddddddd}|D]}d||d |}q|d S) Nr !#$)rrrrrrz[mzr)rrcodesstylerrrrs r)r'r&)cnrc Cs8z@ddlm}ddlm}ddlm}ddlm}ddlm }Wnt k r\t dYnX|}|j dd |d }|dkrd }| ||jd ||j|g}|}|||||ttjttjtd dj||j gddj|!|"d gdd#||$|} | |fS)Nr)x509)NameOID)default_backend)hashes)rsaz.log_startupr.c shzttjd}Wnttfk r.d}YnXt|d }|dkr\|j|dS)NWERKZEUG_SERVER_FDr_)r5rr LookupErrorr7r`rrM)rCZsrv rdrcrsrr,r[r^rhr]rrinners$   zrun_simple..innerrzsCannot bind to a random port with enabled reloader if the Python interpreter does not support socket opening by fd.Trtrz Unlinking %srun_with_reloader)rhriintervalrk)!rjr5rdebugrmZmiddleware.shared_datarnrrcan_open_by_fdr7r2r;r7 setsockopt SOL_SOCKET SO_REUSEADDRbindset_inheritablerfilenorrlistenrQrr5rr*r rG _reloaderry)rcr,rdrerfrgrhrirjrkr]r[r^rlrrhrmrnrwrErvr@_rwrrrvr run_simple)sP]     "            r)rkwargsrcOs*ddlm}tjdtdd|||dS)zRun a process with the reloader. This is not a public API, do not use this function. .. deprecated:: 2.0 Will be removed in Werkzeug 2.1. rrxzp'run_with_reloader' is a private API, it will no longer be accessible in Werkzeug 2.1. Use 'run_simple' instead.rNrON)rryrQrRDeprecationWarning)rrrrrrrys rycCsddl}ddlm}tdd|jddd }|jd d d d d|jddddd|jddddd|jddd|}d\}}|jr|jd\}}}t |pdt |pd||j |j |j ddS)z:A simple command-line interface for :py:func:`run_simple`.rNr) import_stringrpz:This CLI is deprecated and will be removed in version 2.1.z;Run the given WSGI application with the development server.F) descriptionZ allow_abbrevz-bz--bindaddressz+The hostname:port the app should listen on.)desthelpz-dz--debug store_truez7Show the interactive debugger for unhandled exceptions.)actionrz-rz--reloadz%Reload the process if modules change.rdz8Application to import and serve, in the form module:app.)r)NNr-r<i)rcr,rdrerf)argparseutilsrr ArgumentParser add_argument parse_argsr partitionrr5rdreloadr{)rrparserrrcr,r_rrrmainsP   r__main__)N)NN)NN)N)FrNFNN) FFTNNrrbFrNNFN)WrDiorplatformrr socketserverrmtypingrrQrrrrZ http.serverrr _internalr r exceptionsr urlsr r rrrrrr __import__rr\r r0r5rrQsystemr|rrrVrrT TYPE_CHECKINGZtyping_extensionsteZ_typeshed.wsgir$r%Z-cryptography.hazmat.primitives.asymmetric.rsar&Zcryptography.x509r' RawIOBaser(rHrr rr%r5r#rrFr AddressFamilyr2r;rArIThreadingMixInrWrYrSr`rIterableDictrrryrrrrrrs                         >* - ,   P % & K/