
    ^h                     l    S r SSKrSSKJrJr  SSKJr  SSKJr  SSK	J
r
  1 SkrSS	\S
\4S jjrSS jrg)zLog utilities.    N)urlparse
urlunparse)
access_log   )User)prometheus_log_method>   keyauthcodexsrfstatetokenurireturnc                    [         R                  [        U=(       d    / 5      5      n[        U 5      nUR                  (       a  UR                  R                  S5      nSn[        U5       H4  u  pgUR                  S5      u  pn
U H  nX;   d  M
  U U	 S3XF'   SnM     M6     U(       a)  UR                  SR                  U5      S9n[        U5      $ U $ )zscrub auth info from uri&F=z[secret]T)query)_DEFAULT_SCRUB_PARAM_KEYSunionsetr   r   split	enumerate	partition_replacejoinr   )r   extra_param_keysscrub_param_keysparsedpartschangedisr	   sepvalue	substrings               L/home/james-whalen/.local/lib/python3.13/site-packages/jupyter_server/log.py
_scrub_urir(      s     166s;K;Qr7RSc]F|| ""3'e$DAkk#.OCe-	#"%se84EH"G . % __388E?_;Ff%%J    c                    U R                  5       nU R                  n U R                  nU R
                  R                  S/ 5      nUS:  d  US:X  a  UR                  nO2US:  a  UR                  nOUS:  a  UR                  nOUR                  nSU R                  R                  5       -  nUUR                  UR                  [        UR                  U5      US.n U R                   n	U	(       a#  [%        U	[&        5      (       a  U	R(                  OS	OS
n
XS'   SnUS:  a.  [        UR*                  R                  SS5      U5      US'   US-   nUS:  aN  US:w  aH  0 nS H%  nXR*                  ;   d  M  UR*                  U   X'   M'     U" [,        R.                  " USS95        U" UR0                  " S0 UD65        U(       a  [3        U 5        gg! [         a
    [        n GNf = f! ["         a    Sn	 GNf = f)a  log a bit more information about each request than tornado's default

- move static file get success to debug-level (reduces noise)
- get proxied IP instead of proxy IP
- log referer for redirect and failed requests
- log user-agent for failed requests

if record_prometheus_metrics is true, will record a histogram prometheus
metric (http_request_duration_seconds) for each request handler
extra_log_scrub_param_keysi,  i0  i  i  g     @@)statusmethodipr   request_timeNunknown usernamez>{status} {method} {uri} ({username}@{ip}) {request_time:.2f}msRefererNonerefererz referer={referer}i  )HostAcceptr3   z
User-Agent   )indent )
get_statusrequestlogAttributeErrorr   settingsgetdebuginfowarningerrorr/   r-   	remote_ipr(   r   current_user	Exception
isinstancer   r2   headersjsondumpsformatr   )handlerrecord_prometheus_metricsr,   r<   loggerr   
log_methodr/   nsuserr2   msgrI   headers                 r'   log_requestrU   /   s    !FooG ''++,H"M|v}\\
	#[[
	#^^
\\
GOO88::L..'++'78$
B## LPD$!7!7YUWHzN
JC}"7??#6#6y&#IK[\9((}3AF(")//&"9 B 	4::ga01szzB  g& !]  8  s#   G G( G%$G%(G87G8)N)T)__doc__rJ   urllib.parser   r   tornado.logr   r
   r   prometheus.log_functionsr   r   strr(   rU   r:   r)   r'   <module>r[      s:      - "  ;
 N C 3 0>'r)   