ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ Yc@@sdZddlmZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z ddl mZmZdZejd Zd efd YZd e e fd YZdS(s raven.transport.threaded ~~~~~~~~~~~~~~~~~~~~~~~~ :copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. i(tabsolute_importN(tsleepttime(tAsyncTransport(t HTTPTransport(tQueuet check_threadsi s sentry.errorst AsyncWorkercB@sheZeZedZdZdZdZdZ dZ d dZ dZ dZRS( cC@sUttd|_tj|_d|_d|_i|d6|_ |j dS(Nitshutdown_timeout( RRt_queuet threadingtLockt_locktNonet_threadt_thread_for_pidtoptionststart(tselfR((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyt__init__s   cC@s/|jtjkrtS|jo.|jjS(N(RtostgetpidtFalseRtis_alive(R((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyR(scC@s|jrdS|jdS(N(RR(R((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyt_ensure_thread-s cC@s|jjz|js dS|jj|j|jd}td|}|j|s|jj }d|GHd|GHt j dkrdGHndGH|j||nd|_ Wd|jjXdS(NRg?s6Sentry is attempting to send %i pending error messagessWaiting up to %s secondstntsPress Ctrl-Break to quitsPress Ctrl-C to quit(R tacquireRR t put_nowaitt _terminatorRtmint_timed_queue_jointqsizeRtnameR Rtrelease(Rttimeouttinitial_timeouttsize((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pytmain_thread_terminated2s$     cC@st|}|j}|jjzHx=|jre|t}|dkrOtS|jjd|q)WtSWd|jjXdS(s implementation of Queue.join which takes a 'timeout' argument returns true on success, false on timeout iR"N( RR tall_tasks_doneRtunfinished_tasksRtwaittTrueR!(RR"tdeadlinetqueuetdelay((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyRWs      cC@s|jjz]|jsitjd|jdd|_|jjt|jj t j |_ nWd|jj tj|jXdS(s) Starts the task thread. ttargetR sraven.AsyncWorkerN(R RRR tThreadt_targetRt setDaemonR)RRRRR!tatexittregisterR%(R((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyRos    cC@sj|jjzH|jrT|jj|j|jjd|d|_d|_nWd|jj XdS(s5 Stops the task thread. Synchronous! R"N( R RRR RRtjoinR RR!(RR"((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pytstop~s   cO@s'|j|jj|||fdS(N(RR R(Rtcallbacktargstkwargs((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyR+s cC@sxtr|jj}z^||jkr.Pn|\}}}y|||Wn$tk rttjddtnXWd|jjXtdqWdS(NsFailed processing jobtexc_infoi( R)R tgetRt Exceptiontloggerterrort task_doneR(RtrecordR5R6R7((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyR/s  N(t__name__t __module__tobjectRtDEFAULT_TIMEOUTRRRR%RRR R4R+R/(((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyRs    %    tThreadedHTTPTransportcB@s5eZddddgZdZdZdZRS(thttpthttpss threaded+httpsthreaded+httpscC@s6t|d s |jj r/t|_n|jS(Nt_worker(thasattrRFRR(R((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyt get_workers cC@sKy tt|j|||Wntk r?}||nX|dS(N(tsuperRCtsendR:(Rturltdatatheaderst success_cbt failure_cbte((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyt send_syncs  cC@s)|jj|j|||||dS(N(RHR+RQ(RRKRLRMRNRO((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyt async_sends (R?R@tschemeRHRQRR(((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyRCs  (t__doc__t __future__RR1tloggingR RRRtraven.transport.baseRtraven.transport.httpRtraven.utils.compatRRRBt getLoggerR;RARRC(((sI/opt/alt/python27/lib/python2.7/site-packages/raven/transport/threaded.pyts