B ¿öY-ã@s*ddlmZddlZddlZddlZddlmZddlmZm Z m Z m Z ddl m Z gZiZe d¡Zdd„ZGd d „d eƒZGd d „d eƒZd,dd„Zdd„Zd-dd„Zdd„Zd.dd„Zdd„Ze dd„ƒZd/dd„Zdd„Zd d!„ZiZ d"d#„Z!e!d$ƒd%d&„ƒZ"e!d'ƒd(d)„ƒZ#d*d+„Z$ddl%Z&dS)0é)Úabsolute_importN)Ú FunctionType)Ú iteritemsÚget_codeÚ text_typeÚ string_types)ÚonceÚravencCsP|d|dkoN|d|dkoN|d|dkoN|d|dkoN|d|dkS)NÚtypeÚlevelÚmessageÚcategoryÚdata©)ÚaÚbrrúB/opt/alt/python37/lib/python3.7/site-packages/raven/breadcrumbs.pyÚevent_payload_considered_equals rc@s0eZdZd dd„Zd dd„Zdd„Zd d „ZdS) ÚBreadcrumbBufferédcCsg|_||_dS)N)ÚbufferÚlimit)ÚselfrrrrÚ__init__szBreadcrumbBuffer.__init__Nc CsZ|s|s|stdƒ‚|dkr$t ¡}|j |p0d|||||dœ|f¡|jd|j …=dS)Nz6You must pass either `message`, `data`, or `processor`Údefault)r Ú timestampr r r r)Ú ValueErrorÚtimerÚappendr)rrr r r rr Ú processorrrrÚrecord#s zBreadcrumbBuffer.recordcCs|jdd…=dS)N)r)rrrrÚclear4szBreadcrumbBuffer.clearc CsŽg}x„t|jƒD]v\}\}}|dk rby ||ƒWn"tk rRt d¡d}YnX|df|j|<|dk r|r|t|d|ƒs| |¡qW|S)Nz&Failed to process breadcrumbs. Ignoredéÿÿÿÿ)Ú enumeraterÚ ExceptionÚloggerÚ exceptionrr)rÚrvÚidxÚpayloadrrrrÚ get_buffer7s   zBreadcrumbBuffer.get_buffer)r)NNNNNNN)Ú__name__Ú __module__Ú __qualname__rr r!r*rrrrrs   rc@seZdZdd„ZdS)ÚBlackholeBreadcrumbBuffercOsdS)Nr)rÚargsÚkwargsrrrr Hsz BlackholeBreadcrumbBuffer.recordN)r+r,r-r rrrrr.Gsr.TcCs|r tƒStƒS)N)rr.)ÚenabledrrrÚ make_bufferLsr2cOs||d<t||ŽS)Nr )r )r r/r0rrrÚrecord_breadcrumbRsr3c Cs@|dkrt ¡}x*tj ¡D]}|j |||||||¡qWdS)z­Records a breadcrumb for all active clients. This is what integration code should use rather than invoking the `captureBreadcrumb` method on a specific client. N)rr ÚcontextZget_active_contextsZ breadcrumbsr )r rr r rr rÚctxrrrr Xs r cstx$tD]}|ˆˆˆˆˆƒ}|rdSqWt ˆj¡}|dk rR|ˆˆˆˆˆƒ}|rRdS‡‡‡‡‡fdd„}t|d�dS)Ncsbˆ}ytˆƒ}ˆrˆˆ}Wntk r0YnXˆ dd¡| |ˆjt ˆ¡ ¡ˆdœ¡dS)NÚexc_info)r r r r)rr$ÚpopÚupdateÚnameÚloggingÚ getLevelNameÚlower)rZ formatted_msg)r/r0r r%Úmsgrrrqs   z)_record_log_breadcrumb..processor)r)Úspecial_logging_handlersÚspecial_logger_handlersÚgetr9r )r%r r=r/r0Úhandlerr'rr)r/r0r r%r=rÚ_record_log_breadcrumbes  rBc Csôt|tƒs|j}n|}t|ddƒr&dS|dkr8d}d}n d}d|}t|ƒ}tj}|dkrltj  tj j j ¡}i}t tdd|jd |jd  |¡||d œ|d ƒtj|ƒ|d |tƒ}|j|_|jt|ƒjksÒt‚|j|jk|j|jkd|_|S)NÚ__patched_for_raven__F)r r=z level, msg)r=z%d, msga%(offset)sif 1: def factory(original, record_crumb): def %(name)s(self, %(args)s, *args, **kwargs): record_crumb(self, %(fwd)s, *args, **kwargs) return original(self, %(args)s, *args, **kwargs) return %(name)s Ú éz, )Úoffsetr9r/Úfwdr ÚexecÚfactoryT)Ú isinstancerZim_funcÚgetattrrr:Ú_srcfileÚosÚpathÚnormpathÚ currentframeÚ__code__Ú co_filenameÚevalÚcompileÚco_firstlinenor+ÚjoinÚ__dict__rBÚ__doc__ÚAssertionErrorr,rC) Úmethr Úfuncr/rGÚcodeZlogging_srcfileÚnsÚnew_funcrrrÚ_wrap_logging_method‹s>      r_c Csttj}tjtjtjtjtjtjtjtjdœ}x2t |ƒD]&\}}t t ||ƒ|ƒ}t tj||ƒq6Wt tjj ƒtj_ dS)N)ÚdebugÚinfoÚwarningÚwarnÚerrorr&ÚcriticalÚfatal)r:ÚLoggerÚDEBUGÚINFOÚWARNINGÚWARNÚERRORÚCRITICALÚFATALrr_rKÚsetattrÚlog)ÚclsÚmethodsÚ method_namer r^rrrÚ _patch_loggerÑs rtcCs tƒdS)zXInstalls the logging hook if it was not installed yet. Otherwise does nothing. N)rtrrrrÚinstall_logging_hookèsrucs‡fdd„}t||ƒdS)z¢Ignores a logger for the regular breadcrumb code. This is useful for framework integration code where some log messages should be specially handled. csˆdk r|ˆkrdSdS)NFTr)r%r r=r/r0)Ú allow_levelrrrAõszignore_logger..handlerN)Úregister_special_log_handler)Úname_or_loggerrvrAr)rvrÚ ignore_loggerðs rycCs"t|tƒr|}n|j}|t|<dS)aRegisters a callback for log handling. The callback is invoked with give arguments: `logger`, `level`, `msg`, `args` and `kwargs` which are the values passed to the logging system. If the callback returns `True` the default handling is disabled. N)rJrr9r?)rxÚcallbackr9rrrrwýs rwcCst |¡dS)aRegisters a callback for log handling. The callback is invoked with give arguments: `logger`, `level`, `msg`, `args` and `kwargs` which are the values passed to the logging system. If the callback returns `True` the default handling is disabled. N)r>r)rzrrrÚregister_logging_handler sr{cs‡fdd„}|S)Ncst|ƒ}|tˆ<|S)N)rÚhooked_libraries)Úf)r9rrÚ decoratorszlibraryhook..decoratorr)r9r~r)r9rÚ libraryhooks rÚrequestscsPyddlm}Wntk r$dSX|j‰‡fdd„}||_tdtjd�dS)Nr)ÚSessioncsN‡fdd„}yˆ|ˆf|ž|Ž}Wntk r@|dƒ‚Yn X||ƒ|S)Ncs4tddˆjˆj|r|jpd|r$|jp&ddœd�dS)NÚhttpr€)ÚurlÚmethodÚ status_codeÚreason)r r r)r rƒr„r…r†)Úresponse)ÚrequestrrÚ_record_request(s  z5_hook_requests..send.._record_request)r$)rrˆr/r0r‰Zresp)Ú real_send)rˆrÚsend's z_hook_requests..sendz(requests.packages.urllib3.connectionpool)rv)Zrequests.sessionsr�Ú ImportErrorr‹ryr:rj)r�r‹r)rŠrÚ_hook_requestss r�Úhttplibcsfyddlm}Wn tk r0ddlm}YnX|j‰|j‰‡fdd„}‡fdd„}||_||_dS)Nr)ÚHTTPConnectioncsTi|_‰|j‰|j‰|j‰‡‡‡‡‡‡fdd„}tdd|d�ˆ|ˆˆf|ž|ŽS)NcsZˆ}| d¡s:dˆdkrdpdˆˆˆkr0dˆp2dˆf}|ˆdœ|d <|d  ˆ¡|S) N)zhttp://zhttps://z %s://%s%s%si»Úhttpsr‚z:%sÚ)rƒr„r)Ú startswithr8)rZreal_url)Ú default_portÚhostr„ÚportÚstatusrƒrrrNs  z7_install_httplib..putrequest..processorr‚r€)r r r)Ú_raven_status_dictr”r•r“r )rr„rƒr/r0r)Úreal_putrequest)r“r”r„r•r–rƒrÚ putrequestHs z$_install_httplib..putrequestcsDˆ|f|ž|Ž}t|ddƒ}|dk r@d|kr@|j|d<|j|d<|S)Nr—r…r†)rKr–r†)rr/r0r'r–)Úreal_getresponserrÚ getresponse`s    z%_install_httplib..getresponse)rŽr�rŒZ http.clientr™r›)r�r™r›r)ršr˜rÚ_install_httplib>s  rœcCsF|dkrt ¡}x0|D](}t |¡}|dkr8td|ƒ‚|ƒqWdS)NzUnknown library %r for hooking)r|Úkeysr@Ú RuntimeError)Ú librariesÚlibr[rrrÚhook_librariesls   r¡)T)NNNNNNN)N)N)'Ú __future__rrMrr:ÚtypesrZraven.utils.compatrrrrZ raven.utilsrr>r?Ú getLoggerr%rÚobjectrr.r2r3r rBr_rtruryrwr{r|rr�rœr¡Z raven.contextr rrrrÚs:     *  & F     .