
    Xh                     f    d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
 h dZdd	ed
efdZddZy)zLog utilities.    N)urlparse
urlunparse)
access_log   )User)prometheus_log_method>   keyauthcodexsrfstatetokenurireturnc                    t         j                  t        |xs g             }t        |       }|j                  r|j                  j                  d      }d}t        |      D ]2  \  }}|j                  d      \  }}	}
|D ]  }||v s| |	 d||<   d} 4 |r,|j                  dj                  |            }t        |      S | S )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               F/var/www/html/myenv/lib/python3.12/site-packages/jupyter_server/log.py
_scrub_urir(      s     166s;K;Qr7RSc]F|| ""3'e$ 	#DAqkk#.OCe- #	#"%se84E!H"G#	# __388E?_;Ff%%J    c                    | j                         }| j                  }	 | j                  }| j
                  j                  dg       }|dk  s|dk(  r|j                  }n0|dk  r|j                  }n|dk  r|j                  }n|j                  }d| j                  j                         z  }||j                  |j                  t        |j                  |      |d}	 | j                   }	|	rt%        |	t&              r|	j(                  nd	nd
}
|
|d<   d}|dk\  r.t        |j*                  j                  dd      |      |d<   |dz   }|dk\  rL|dk7  rGi }dD ]#  }||j*                  v s|j*                  |   ||<   %  |t-        j.                  |d              | |j0                  di |       |rt3        |        yy# t        $ r
 t        }Y w xY w# t"        $ r d}	Y w xY w)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YUWHBzN
JC}"7??#6#6y&#IK[\9((}3A 	:F(")//&"9	: 	4::ga01zszzB  g& !]  8  s#   F; G ;GGGG)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)   