PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  aNc@sDdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddlmZmZddlmZddlmZddlZyddlmZWnek reZnXdd d d gZd Zd efdYZdfdYZy2ddlm Z m!Z!ej"e j#e j$fZ%Wn9ek reZ ej"fZ%defdYZ&n6XdefdYZ'defdYZ&dZ(d eefdYZ)defdYZ*defdYZ+defdYZ,de&fdYZ-d ee-fd YZ.d!e,e-fd"YZ/d#e0fd$YZ1eeeeeeee2eeed%ed&d'Z3d(Z4e3jpd)d*e4_e5d+kr@dd,l6m7Z7e3e7d-d.d/d0d1d2ndS(3s WSGI HTTP Server This is a minimalistic WSGI server using Python's built-in BaseHTTPServer; if pyOpenSSL is installed, it also provides SSL capabilities. iN(tcount(tBaseHTTPRequestHandlert HTTPServer(tThreadingMixIn(t converters(t killthreadtWSGIHandlerMixint WSGIServert WSGIHandlertserves0.5t ContinueHookcBsDeZdZdZdZddZddZddZRS(sN When a client request includes a 'Expect: 100-continue' header, then it is the responsibility of the server to send 100 Continue when it is ready for the content body. This allows authentication, access levels, and other exceptions to be detected *before* bandwith is spent on the request body. This is a rfile wrapper that implements this functionality by sending 100 Continue to the client immediately after the user requests the content via a read() operation on the rfile stream. After this response is sent, it becomes a pass-through object. cCs||_||_x9d D]1}t||rt||t||qqWx=d D]5}t||rUt||t|d |qUqUWdS(Ntclosetclosedtfilenotflushtmodetbufsizet softspacetreadtreadlinet readlinest_ContinueFile_(sclosesclosedsfilenosflushsmodesbufsizes softspace(sreadsreadlines readlines(t_ContinueFile_rfilet_ContinueFile_writethasattrtsetattrtgetattr(tselftrfiletwritetattr((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt__init__7s     cCsV|jd|j}x9dD]1}t||rt||t||qqWdS(NsHTTP/1.1 100 Continue RRR(sreadsreadlines readlines(RRRRR(RRR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt_ContinueFile_sendBs    icCs|j|jj|S(N(R RR(Rtsize((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt_ContinueFile_readIs cCs|j|jj|S(N(R RR(RR!((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt_ContinueFile_readlineMs icCs|j|jj|S(N(R RR(Rtsizehint((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt_ContinueFile_readlinesQs (t__name__t __module__t__doc__RR R"R#R%(((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR )s     cBsheZdZeZdZdZdZdZd dZ d dZ d dZ d dZ RS( s WSGI mix-in for HTTPRequestHandler This class is a mix-in to provide WSGI functionality to any HTTPRequestHandler derivative (as provided in Python's BaseHTTPServer). This assumes a ``wsgi_application`` handler on ``self.server``. cOsdS(s disable success request logging Logging transactions should not be part of a WSGI server, if you want logging; look at paste.translogger N((Rtargstkwargs((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt log_request_scOsdS(s disable error message logging Logging transactions should not be part of a WSGI server, if you want logging; look at paste.translogger N((RR)R*((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt log_messagegscCs&|js|jS|jd|jSdS(s. behavior that BaseHTTPServer should have had t N(t sys_versiontserver_version(R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pytversion_stringos c Cs6|j r#|j r#tdn|js"t|_|j\}}|jdd\}}|jt||t}xx|D]p\}}|j} d| krt}nd| krd|jkrd|_ t}qn|j ||qW|rd|_ |j ddn|j n|j j |dS( sn Write a chunk of the output stream; send headers if they have not already been sent. s-Content returned before start_response calledR-iscontent-lengtht connectionR t ConnectionN(twsgi_headers_senttwsgi_curr_headerst RuntimeErrortTruetsplitt send_responsetinttlowertFalsetclose_connectiont send_headert end_headerstwfileR( Rtchunktstatustheaderstcodetmessaget send_closetktvtlk((s4/usr/lib/python2.7/site-packages/paste/httpserver.pytwsgi_write_chunkvs.           cCs]|r;z(|jr-|d|d|dnWdd}Xn |jrGn||f|_|jS(Niii(R3tNoneR4RI(RRAtresponse_headerstexc_info((s4/usr/lib/python2.7/site-packages/paste/httpserver.pytwsgi_start_responses   cCstj|j\}}}}}tj|}|jd}tj|}|rm|dkrm|d7}n|jj d \}} |j } yt |j j dd} Wntk rd} nXd|j j ddjkrtt| |jj| } n$t|jd s+t| | } n|jd} id0d 6d d 6| d6tjd6td6td6td6|jd6dd6|d6|d6|j j ddd6|j j ddd6|d6t| d6|jd6| d6|_|r||jd(treprRR(Rt base_repr((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt__repr__scCsi|j|j}|dkr%|}nt||}|s>dS|jj|}|jt|7_|S(NRQ(RRRJtminRRR(RRtlefttdata((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRs  cGs]|j|j}t|r2t|d|}n|jj|}|jt|7_|S(Ni(RRRRRR(RR)tmax_readR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRs  cCs<|jj|}x#|D]}|jt|7_qW|S(N(RRRR(RthintRR@((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRs cCs|S(N((R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt__iter__scCs)|j|jdkrtn|jS(Ni(RRt StopIterationR(R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pytnexts cCs|jj|||_dS(N(RRR(Rtplace((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRscCs*t|jdr|jjS|jSdS(Nttell(RRRR(R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRs N( R&R'RRRJRRRRRRR(((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRus       t ThreadPoolc BseZdZeZdedddddddddd Zd Zd Z d Z d Z d Z dZ dZddZddZdedZRS(s0 Generic thread pool with a queue of callables to consume. Keeps a notion of the status of its worker threads: idle: worker thread with nothing to do busy: worker thread doing its job hung: worker thread that's been doing a job for too long dying: a hung thread that has been killed, but hasn't died quite yet. zombie: what was a worker thread that we've tried to kill but isn't dead yet. At any time you can call track_threads, to get a dictionary with these keys and lists of thread_ids that fall in that status. All keys will be present, even if they point to emty lists. hung threads are threads that have been busy more than hung_thread_limit seconds. Hung threads are killed when they live longer than kill_thread_limit seconds. A thread is then considered dying for dying_limit seconds, if it is still alive after that it is considered a zombie. When there are no idle workers and a request comes in, another worker *may* be spawned. If there are less than spawn_if_under threads in the busy state, another thread will be spawned. So if the limit is 5, and there are 4 hung threads and 6 busy threads, no thread will be spawned. When there are more than max_zombie_threads_before_die zombie threads, a SystemExit exception will be raised, stopping the server. Use 0 or None to never raise this exception. Zombie threads *should* get cleaned up, but killing threads is no necessarily reliable. This is turned off by default, since it is only a good idea if you've deployed the server with some process watching from above (something similar to daemontools or zdaemon). Each worker thread only processes ``max_requests`` tasks before it dies and replaces itself with a new worker thread. Ridiii,iic Csb||_||_||_tj|_g|_||_| dkrZtj d} nt | t r{tj | } n| |_ | |_ t|_tsd}|j jdn||_||_||_||_| |_| |_d|_i|_g|_i|_d|_|s4tj|jnx't |jD]} |j!ddqDWdS(sD Create thread pool with `nworkers` worker threads. spaste.httpserver.ThreadPoolisBCannot use kill_thread_limit as ctypes/killthread is not availableRDsInitial worker poolN("tnworkerst max_requeststnametQueuetqueuetworkerstdaemonRJtloggingt getLoggert isinstancet basestringtloggert error_emailRt _worker_countRRtkill_thread_limitt dying_limitthung_thread_limittspawn_if_undertmax_zombie_threads_before_diethung_check_periodtrequests_since_last_hung_checkRt idle_workerst dying_threadst_last_added_new_idle_workerstatexittregistertshutdowntrangetadd_worker_thread(RRRRRRRRRRRRRti((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR0s@                      cCsk|jjd|jj|jr_|jd7_|j|jkr_d|_|jq_n|j r|jrd}t j }|jjdxs|j D]h}t |dsqn|j j |jd\}}|d k r|||jkr|d7}qqqW||jkrv|jjd||j|t j |_xAt|j|D]}|jddqYWq|jjd |nt|j |jkrWt|jd krWt j |j|jkrW|jjd t|j |jt|j|jjd |jx:tt|j |jD]}|jj|jq7Wn|jj|d S(s) Add a task to the queue sAdded task (%i tasks queued)iisBNo idle workers for task; checking if we need to make more workerst thread_ids=No idle tasks, and only %s busy tasks; adding %s more workersRDs Response to lack of idle workerss)No extra workers needed (%s busy workers)is2Culling %s extra workers (%s idle workers present)sIdle workers: %sN(NN(RtdebugRtqsizeRRtkill_hung_threadsRRRRRRRsRRJRRRR R RRtputtSHUTDOWN(Rttasktbusytnowtworkert time_startedRR ((s4/usr/lib/python2.7/site-packages/paste/httpserver.pytadd_tasknsN        #  #c Cs~tdgdgdgdgdg}tj}x|jD]}t|dsXq=n|jj|jd \}}|dk r|||jkr|dj |q|dj |q=|dj |q=Wx|j j D]\}\}}|j |s>|j jd|y|j |=Wqtk r7qXqn|||jkre|dj |q|dj |qW|S( sw Return a dict summarizing the threads in the pool (as described in the ThreadPool docstring). tidleRthungtdyingtzombieRs!Killed thread %s no longer aroundN(NN(tdictRRRRRsRRJRtappendRRt thread_existsRRtKeyErrorR(RRRRRRRt time_killed((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt track_threadss2'  "  cCstdkrtdntjj|}tj|ty|j|=Wnt k r^nX|j j d|||j kr|j j |ntj|f|j|<|jdd|dS(s Removes the worker with the given thread_id from the pool, and replaces it with a new worker thread. This should only be done for mis-behaving workers. s3Cannot kill worker; killthread/ctypes not availablesKilling thread %sRDs Replacement for killed thread %sN(RRJR5t threadingt_activeRst async_raiset SystemExitRR!RRRtremoveRRR (RRt thread_obj((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt kill_workers   cCs |tjkS(sH Returns true if a thread with this id is still running (R$R%(RR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR sc OsX|jj}tjd|jd|d|dd|}|j|j|jdS(NttargetR)R*Rs worker %d(RRR$tThreadtworker_thread_callbackt setDaemonRtstart(RR)R*tindexR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR s   c Cs|js dStj}d}d}d}d}d}d}xj|jD]_}t|dsl|d7}qGn|jj|jd\} } | dkr|d7}qGn|d7}t||| }||| 7}|| |jkrG|j j d|j|| yddl } | j | } Wn0t } tjd| d| j} nX|jd td|jd || d |jd | |j|j|d7}qGqGW|rt||}d |}nd}|j jd|||||||||f|jdS(s0 Tries to kill any hung threads NiRis/Thread %s hung (working on task for %i seconds)iRs Error: %ssKilling worker thread (id=%(thread_id)s) because it has been working on task for %(time)s seconds (limit is %(limit)s) Info on task: %(info)sRtlimitRs%.2fsecsN/Asxkill_hung_threads status: %s threads (%s working, %s idle, %s starting) ave time %s, max time %.2fsec, killed %s workers(NN(RRRRRRsRRJtmaxRtwarningtpprinttpformattStringIOt tracebackt print_exctgetvaluetnotify_problemRR*tfloatRtcheck_max_zombies(RRtmax_timet total_timeRtstarting_workerstworking_workerstkilled_workersRRRR4t info_desctouttave_time((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRsd                c Cse|js dSg}tj}x}|jjD]l\}\}}|j|sxy|j|=Wq/tk rqq/Xq/n|||jkr/|j|q/q/W|r|jj d|nt ||jkra|jj dt ||j|j dt dt |d|jddjtt|d d |jd d GtjGHtd ndS(ss Check if we've reached max_zombie_threads_before_die; if so then kill the entire process. NsFound %s zombie threadss?Exiting process because %s zombie threads is more than %s limitsmExiting process because %(found)s zombie threads (more than limit of %(limit)s) Bad threads (ids): %(ids)s tfoundR1tidss tsubjects)Process restart (too many zombie threads)i s Shutting downi(RRRRR R!RRRRRtfatalR:RRtmapRzR R$t currentThreadt ServerExit(RRERRR"R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR<'s8  "    c Csttj}tj}|_|jj||jj|d}t}|j j d||zZxSt r|j r|j |kr|j j d|||j ft }Pn|j j}|tjkr|j j d|Pny|jj|Wntk r nXtjdg|j|<|d7}zGy |Wn"tjd|IJtjnX||jkruPnWdy|j|=Wntk rnXtjX|jj|qgWWdy|j|=Wntk rnXy|jj|Wntk rnXy|jj|Wntk r/nXy|j|=Wntk rQnX|ro|jdd |nXdS( sd Worker thread should call this method to get and process queued callables. isStarted new worker %s: %ss;Thread %s processed %i requests (limit %s); stopping threadsWorker %s asked to SHUTDOWNis!Unexpected exception in worker %rNRDs#Voluntary replacement for thread %s(R$RJRRRRRRR;RRR6RRRsRRR(RtRRJRRwRxR7R8RR!t exc_clearR (RRDR)Rtrequests_processedtadd_replacement_workertrunnable((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR-Msr             cCsw|jjdx0tt|jD]}|jjtjq&Wg}x:|jD]/}|j d|j rS|j |qSqSWg}x0|j D]%}|j |r|j |qqW|s|rc|jjdt|t||r'x|D]}|j|jqW|jjdn|rsg}t}t|} xX|jD]M} | r~|j r~t}|j |n|j rOd|GHt} qOqOW| rMddl} xyt| jD]h} t| dd d} | sqnt| d i}|jd }|d kr| jj| qqW| jd GHtjdq`|jjdqsn|jjddS(sL Shutdown the queue (after finishing any pending requests). sShutting down threadpoolg?s/%s workers didn't stop properly, and %s zombiessWorkers killed forcefullysWorker %s won't dieiNitim_funct func_globalsR&R$sForcefully exiting processisAll workers eventually killedsAll workers stopped(RRR RRRRRRRtisAliveRRR R*RR;tboolR6Rtlistt _exithandlersRRJRsR(t_run_exitfuncstost_exit(Rtforce_quit_timeoutR t hung_workersRtzombiesRRt timed_outtneed_force_quitRRtcallbacktfunctglobstmod((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR sZ            c Cs|js dS|rEtjd|jd||tf}|jdSd}|s~|jjd}|d }d|}nd|jd |d |g}yd jt j }Wn d }nXd t d|dt j ddt jd|dt jjt}dj|d|} ddl} | jd} g|jjdD]} | jrP| j^qP} | j|| | | jdG| G| GHdS(s Called when there's a substantial problem. msg contains the body of the notification, subject the summary. If spawn_thread is true, then the email will be send in another thread (so this doesn't block). NR+R)serrors@localhostii2s[http threadpool] %ssTo: %ssFrom: %ss Subject: %sR-s (unknown)sAn error has occurred in the paste.httpserver.ThreadPool Error: %(msg)s Occurred at: %(time)s PID: %(pid)s System: %(system)s Server .py file: %(file)s tmsgRs%ctpidtsystemRs s it localhostRes email sent to(RR$R,R:R;R/tstript splitlinesRRWtunameRRtstrftimetgetpidRktabspatht__file__tsmtplibtSMTPR7tsendmailtquit(RRbRGt spawn_threadttt from_addressRBRdtbodyRDRmRqtet error_emails((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR:sD             N(R&R'R(tobjectRR;RJRRR#R*R R RR<R-R R6R:(((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRs,,  4 1 %    ? & G 7tThreadPoolMixIncBsPeZdZedZdZdZdZdZdZ dZ RS(s= Mix-in class to process requests from a thread pool cKs5t|_t|d|j|jf|||_dS(Ns$ThreadPoolMixIn HTTP server on %s:%d(R6trunningRRRR_(RRRtthreadpool_options((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRs cs0jdjjfddS(sT Queue the request to be processed by on of the thread pool threads icsjS(N(tprocess_request_in_thread((RvtrequestR(s4/usr/lib/python2.7/site-packages/paste/httpserver.pytsN(t setblockingR_R(RR|Rv((RvR|Rs4/usr/lib/python2.7/site-packages/paste/httpserver.pytprocess_requests  cCs@tj\}}}|tkr'ntt|j||S(N(RwRLRKtsuperRxt handle_error(RR|Rvt exc_classtexcttb((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRs cCswy!|j|||j|WnO|j|||j|tjd}t|ttfrsqsnXdS(s The worker thread should call back here to do the rest of the request processing. Error handling normaller done in 'handle_request' must be done here. iN(tfinish_requestt close_requestRRwRLRt MemoryErrortKeyboardInterrupt(RR|RvR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR{$s cCsNz9x2|jr7y|jWqtjk r3qXqWWd|jjXdS(sP Overrides `serve_forever` to shut the threadpool down cleanly. N(Rythandle_requestRttimeoutR_R (R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt serve_forever4s  cCs|jjddS(sR Overrides server_activate to set timeout on our listener socket. iN(RR(R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRCscCs*t|_|jj|jjddS(sB Finish pending requests and shutdown the server. i<N(R;RyRR R_R (R((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyt server_closeJs  ( R&R'R(R;RRRR{RRR(((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRxs    tWSGIServerBasecBs#eZddddZdZRS(cCs2tj||||d|||_d|_dS(NR(RRRRJtwsgi_socket_timeout(RRRrRRR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRSs    cCs;tj|\}}|jr1|j|jn||fS(N(RRRR(RRR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR\s N(R&R'RJRR(((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRRs cBseZeZRS((R&R'R;tdaemon_threads(((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRcstWSGIThreadPoolServercBs#eZdddedddZRS(i c CsNtj|||||d||dkr4i}ntj||||dS(NR(RRRJRx( RRRrRRRRRzR((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRgs   N(R&R'RJR;R(((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRfsRKcBseZdZRS(sV Raised to tell the server to really exit (SystemExit is normally caught) (R&R'R((((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyRKssi icCs9t}|s|rzt}t|p$d}|sz|dkrHt}qwtjtj}|j||j|qzn|pd}|dkrd|kr|j dd\}}qd}n|t|f}|st }n|r||_ d|_ n|r||_n| dkr%t} ntj| rdt||||t| | d| d|}n-t||||d|}| r| |_n| rt| |_ntj|r5|rd pd }|jd \}}|d krd |||fGHnd|||fGHy|jWq5tk r1q5Xn|S(sc Serves your ``application`` over HTTP(S) via WSGI interface ``host`` This is the ipaddress to bind to (or a hostname if your nameserver is properly configured). This defaults to 127.0.0.1, which is not a public interface. ``port`` The port to run on, defaults to 8080 for HTTP, or 4443 for HTTPS. This can be a string or an integer value. ``handler`` This is the HTTP request handler to use, it defaults to ``WSGIHandler`` in this module. ``ssl_pem`` This an optional SSL certificate file (via OpenSSL). You can supply ``*`` and a development-only certificate will be created for you, or you can generate a self-signed test PEM certificate file as follows:: $ openssl genrsa 1024 > host.key $ chmod 400 host.key $ openssl req -new -x509 -nodes -sha1 -days 365 \ -key host.key > host.cert $ cat host.cert host.key > host.pem $ chmod 400 host.pem ``ssl_context`` This an optional SSL context object for the server. A SSL context will be automatically constructed for you if you supply ``ssl_pem``. Supply this to use a context of your own construction. ``server_version`` The version of the server as reported in HTTP response line. This defaults to something like "PasteWSGIServer/0.5". Many servers hide their code-base identity with a name like 'Amnesiac/1.0' ``protocol_version`` This sets the protocol used by the server, by default ``HTTP/1.0``. There is some support for ``HTTP/1.1``, which defaults to nicer keep-alive connections. This server supports ``100 Continue``, but does not yet support HTTP/1.1 Chunked Encoding. Hence, if you use HTTP/1.1, you're somewhat in error since chunked coding is a mandatory requirement of a HTTP/1.1 server. If you specify HTTP/1.1, every response *must* have a ``Content-Length`` and you must be careful not to read past the end of the socket. ``start_loop`` This specifies if the server loop (aka ``server.serve_forever()``) should be called; it defaults to ``True``. ``daemon_threads`` This flag specifies if when your webserver terminates all in-progress client connections should be droppped. It defaults to ``False``. You might want to set this to ``True`` if you are using ``HTTP/1.1`` and don't set a ``socket_timeout``. ``socket_timeout`` This specifies the maximum amount of time that a connection to a given client will be kept open. At this time, it is a rude disconnect, but at a later time it might follow the RFC a bit more closely. ``use_threadpool`` Server requests from a pool of worker threads (``threadpool_workers``) rather than creating a new thread for each request. This can substantially reduce latency since there is a high cost associated with thread creation. ``threadpool_workers`` Number of worker threads to create when ``use_threadpool`` is true. This can be a string or an integer value. ``threadpool_options`` A dictionary of options to be used when instantiating the threadpool. See paste.httpserver.ThreadPool for specific options (``threadpool_workers`` is a specific option that can also go here). ``request_queue_size`` The 'backlog' argument to socket.listen(); specifies the maximum number of queued connections. i[Rs 127.0.0.1t:iiRzRRfRSis0.0.0.0s/serving on 0.0.0.0:%s view at %s://127.0.0.1:%ssserving on %s://%s:%sN(R;R6R9RRRRtuse_privatekey_filetuse_certificate_chain_fileRJR7RR/R.tprotocol_versionRtasboolRRRRRrRR(t applicationthosttportthandlertssl_pemRR/Rt start_loopRtsocket_timeouttuse_threadpooltthreadpool_workersRzRtis_sslRrRqtprotocol((s4/usr/lib/python2.7/site-packages/paste/httpserver.pyR ysbk                     c Ks?ddlm}xRddddddd d d d d g D])}||kr8t|||| sh  H       ,    3 %;Q      <