HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/lib/python3/dist-packages/sphinx/builders/__pycache__/linkcheck.cpython-310.pyc
o

�$�amp�	@sdZddlZddlZddlZddlZddlZddlmZmZddlm	Z	ddl
mZddlm
Z
ddlmZmZddlmZdd	lmZmZmZmZmZmZmZmZmZmZmZdd
lm Z m!Z!m"Z"ddl#m$Z$ddl%m&Z&dd
l'm(Z(ddl)m*Z*m+Z+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddl3m4Z4ddl5m6Z6ddl7m8Z8ddl9m:Z:ddl;m<Z<m=Z=m'Z'ddl>m?Z?m@Z@mAZAmBZBmCZCddlDmEZEe=�FeG�ZHe�Id�ZJeddeKfdeKfdeeLff�ZMeddeNfd eeMff�ZOed!deKfdeKfdeLfd"eKfd#eKfd$eLff�ZPed%d&eNfdeNff�ZQeeOeeNeKeKeLffZRd'd(iZSdZTd)ZUd*ZVd+e&d,eLfd-d.�ZWGd/d0�d0e�ZXd1e'j'j(d2eKd,eYfd3d4�ZZGd5d6�d6e0�Z[Gd7d8�d8�Z\Gd9d:�d:e�Z]Gd;d<�d<e:�Z^d=e.deKd,eeKfd>d?�Z_d=e.d@e2d,dfdAdB�Z`d=e.d,eeKeffdCdD�ZadS)Ez�
    sphinx.builders.linkcheck
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    The CheckExternalLinksBuilder class.

    :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
�N)�datetime�timezone)�parsedate_to_datetime)�
HTMLParser)�path)�
PriorityQueue�Queue)�Thread)�Any�Dict�	Generator�List�
NamedTuple�Optional�Pattern�Set�Tuple�Union�cast)�unquote�urlparse�
urlunparse)�nodes)�Element)�Response)�ConnectionError�	HTTPError�TooManyRedirects)�Sphinx)�DummyBuilder)�Config)�RemovedInSphinx50Warning)�BuildEnvironment)�__)�SphinxPostTransform)�
encode_uri�logging�requests)�darkgray�	darkgreen�purple�red�	turquoise)�
get_node_linez([a-z]+:)?//�	Hyperlink�uri�docname�lineno�CheckRequest�
next_check�	hyperlink�CheckResult�status�message�code�	RateLimit�delay�Acceptz/text/html,application/xhtml+xml;q=0.9,*/*;q=0.8�gN@�node�returncCstjdtdd�t|�p
dS)z�
    PriorityQueue items must be comparable. The line number is part of the
    tuple used by the PriorityQueue, keep an homogeneous type for comparison.
    znode_line_or_0() is deprecated.���
stacklevelr)�warnings�warnr!r-)r=�rD�;/usr/lib/python3/dist-packages/sphinx/builders/linkcheck.py�node_line_or_0Fs�rFcs@eZdZdZdeddf�fdd�Zdededdfd	d
�Z�ZS)�AnchorCheckParserz9Specialized HTML parser that looks for a specific anchor.�
search_anchorr>Ncst���||_d|_dS�NF)�super�__init__rH�found)�selfrH��	__class__rDrErKSs

zAnchorCheckParser.__init__�tag�attrscCs0|D]\}}|dvr||jkrd|_dSqdS)N)�id�nameT)rHrL)rMrPrQ�key�valuerDrDrE�handle_starttagYs��z!AnchorCheckParser.handle_starttag)	�__name__�
__module__�__qualname__�__doc__�strrKr
rV�
__classcell__rDrDrNrErGPsrG�response�anchorcCsPt|�}|jddd�D]}t|t�r|��}|�|�|jr nq|��|jS)z�Reads HTML data from a response object `response` searching for `anchor`.
    Returns True if anchor was found, False otherwise.
    iT)�
chunk_size�decode_unicode)rG�iter_content�
isinstance�bytes�decode�feedrL�close)r]r^�parser�chunkrDrDrE�check_anchor`s

�ric@sleZdZdZdZed�Zd.dd�Zede	e
fdd	��Zede	ee
e
ffd
d��Zede	e
fdd
��Zedeefdd��Zedeeeffdd��Zedeeeeefffdd��Zd.dd�Zdedeefdd�Zdedefdd�Zdede	efdd�Zdedefdd�Z de!ddfd d!�Z"d"ed#ed$ed%ed&eddfd'd(�Z#d)e$ddfd*d+�Z%d.d,d-�Z&dS)/�CheckExternalLinksBuilderz+
    Checks for broken external links.
    �	linkcheckzCLook for any errors in the above output or in %(outdir)s/output.txtr>NcCs8i|_t�|_i|_i|_t�d�t�|_t	�|_
dS)Ng@)�
hyperlinks�set�_good�_broken�_redirected�socket�setdefaulttimeoutr�_wqueuer�_rqueue�rMrDrDrE�initzs
zCheckExternalLinksBuilder.initcC�.tjd|jjdftdd�dd�|jjD�S)N�%s.%s is deprecated.�anchors_ignorer?r@cS�g|]}t�|��qSrD��re�compile��.0�xrDrDrE�
<listcomp>��z<CheckExternalLinksBuilder.anchors_ignore.<locals>.<listcomp>)rBrCrOrWr!�config�linkcheck_anchors_ignorerurDrDrEry���z(CheckExternalLinksBuilder.anchors_ignorecCrw)Nrx�authr?r@cS�g|]\}}t�|�|f�qSrDr{�r�pattern�	auth_inforDrDrEr���z2CheckExternalLinksBuilder.auth.<locals>.<listcomp>)rBrCrOrWr!r��linkcheck_authrurDrDrEr��s��zCheckExternalLinksBuilder.authcCrw)Nrx�	to_ignorer?r@cSrzrDr{r~rDrDrEr��r�z7CheckExternalLinksBuilder.to_ignore.<locals>.<listcomp>)rBrCrOrWr!r��linkcheck_ignorerurDrDrEr��r�z#CheckExternalLinksBuilder.to_ignorecC�"tjd|jjdftdd�|jS)Nrx�goodr?r@)rBrCrOrWr!rnrurDrDrEr����zCheckExternalLinksBuilder.goodcCr�)Nrx�brokenr?r@)rBrCrOrWr!rorurDrDrEr��r�z CheckExternalLinksBuilder.brokencCr�)Nrx�
redirectedr?r@)rBrCrOrWr!rprurDrDrEr��r�z$CheckExternalLinksBuilder.redirectedcCs tjd|jjdftdd�dS)Nrx�check_threadr?r@�rBrCrOrWr!rurDrDrEr��s

�z&CheckExternalLinksBuilder.check_threadr]cCs:tjd|jjdftdd�t|j|jddi�}|�|�S)Nrx�
limit_rater?r@)	rBrCrOrWr!� HyperlinkAvailabilityCheckWorker�envr�r�)rMr]�workerrDrDrEr��s�
�
z$CheckExternalLinksBuilder.limit_ratecCr�)Nrx�rqueuer?r@)rBrCrOrWr!rt�rMr]rDrDrEr����z CheckExternalLinksBuilder.rqueuecCs tjd|jjdftdd�gS)Nrx�workersr?r@r�r�rDrDrEr��s�z!CheckExternalLinksBuilder.workerscCr�)Nrx�wqueuer?r@)rBrCrOrWr!rsr�rDrDrEr��r�z CheckExternalLinksBuilder.wqueue�resultcCs�|j�|jd�}t||j|j|j|j|jd�}|�	|�|jdkr#dS|jdkr/|jdkr/dS|jr=t
jd|j|jdd�|jdkrb|jrVt
�td	�|jd
|j�dSt
�td	�|j�dS|jdkrt
�td�|j�|�
d|j||j|j�dS|jdkr�t
�td
�|j|j�dS|jdkr�|jjs�|jjr�t
jtd�|j|j|j|jfd�nt
�td�|jtd|j��|�
d|j||j|jd
|j�dS|jdk�rPzdtfdtfdtfdtfdtfd�|j\}}Wnt�ydt}}Ynw||d<|jj�r&t
jd|jd|d|j|j|jfd�nt
�|d�|j|d|d|j��|�
d||j||j|jd|j�dStd|j��)N)�filenamer1r6r8r/�info�	unchecked�working�oldz(%16s: line %4d) T)�nonl�ignoredz
-ignored- z: �localz
-local-   z
ok        r�zbroken link: %s (%s))�locationz
broken    z - r��permanentlyz
with Foundzwith See Other�temporarily)i-i.i/i3i4zwith unknown code�textz
redirect  z to zredirected zUnknown status %s.)r��doc2pathr0�dictr1r6r8r/r7�write_linkstat�loggerr�r(�write_entryr)�app�quiet�warningiserror�warningr#r+r*r,�KeyErrorr��linkcheck_allowed_redirects�
ValueError)rMr�r��linkstatr��colorrDrDrE�process_result�sr�


"



�"����
�
���z(CheckExternalLinksBuilder.process_result�whatr0r��liner/cCs|j�d||||f�dS)Nz%s:%s: [%s] %s
)�txt_outfile�write)rMr�r0r�r�r/rDrDrEr�sz%CheckExternalLinksBuilder.write_entry�datacCs"|j�t�|��|j�d�dS)N�
)�json_outfiler��json�dumps)rMr�rDrDrEr�"sz(CheckExternalLinksBuilder.write_linkstatc	Cs�t|j|j|�}t�d�tt�|jd�d��2|_	tt�|jd�d��|_
|�|j�D]}|�
|�q+Wd�n1s=wYWd�n1sLwY|jrZd|j_dSdS)N�z
output.txt�wzoutput.jsonr<)�HyperlinkAvailabilityCheckerr�r�r�r��openr�join�outdirr�r��checkrlr�ror��
statuscode)rM�checkerr�rDrDrE�finish&s
�����z CheckExternalLinksBuilder.finish�r>N)'rWrXrYrZrSr#�epilogrv�propertyr
rryrr
r�r�rr[r�rr��intr�r�rr�floatr�rr�r	r�r�r5r�r�r�r�r�rDrDrDrErjrs<
	 

7�
�rjc	@steZdZ	ddedededdfdd�Zddd	�Zdd
d�Zde	e
efdee
ddffd
d�Zde
defdd�ZdS)r�Nr�r��builderr>cCs^||_||_||_i|_g|_dd�|jjD�|_|r%|j|_|j	|_
dSt�|_t�|_
dS)NcSrzrDr{r~rDrDrEr�?r�z9HyperlinkAvailabilityChecker.__init__.<locals>.<listcomp>)
r�r�r��rate_limitsr�r�r�rtr�rsr�rr)rMr�r�r�rDrDrErK4sz%HyperlinkAvailabilityChecker.__init__cCsHt|jj�D]}t|j|j|j|j|j|j�}|�	�|j
�|�qdS�N)�ranger��linkcheck_workersr�r�r�r�r�r��startr��append)rM�i�threadrDrDrE�invoke_threadsHs
��z+HyperlinkAvailabilityChecker.invoke_threadscCs.|j��|jD]}|j�ttd�d�qdSrI)r�r�r��putr2�CHECK_IMMEDIATELY)rMr�rDrDrE�shutdown_threadsPs

�z-HyperlinkAvailabilityChecker.shutdown_threadsrlccs��|��d}|��D]$}|�|j�r!t|j|j|jddd�Vq|j�t	t
|�d�|d7}qd}||krD|j��V|d7}||ks6|�
�dS)Nrr�r�Fr<)r��values�is_ignored_urir/r5r0r1r�r�r2r�r��getr�)rMrl�total_linksr4�donerDrDrEr�Us ��
�z"HyperlinkAvailabilityChecker.checkr/cst�fdd�|jD��S)Nc3s�|]}|���VqdSr�)�match)r�pat�r/rDrE�	<genexpr>is�z>HyperlinkAvailabilityChecker.is_ignored_uri.<locals>.<genexpr>)�anyr��rMr/rDr�rEr�hsz+HyperlinkAvailabilityChecker.is_ignored_urir�r�)rWrXrYr"r rjrKr�r�rr[r.rr5r��boolr�rDrDrDrEr�3s��
�

$r�csjeZdZdZ	ddededededeee	fde
d	df�fd
d�
Zddd
�Zde
d	eefdd�Z�ZS)r�z;A worker class for checking the availability of hyperlinks.Nr�r�r�r�r�r�r>cs�||_||_||_||_||_dd�|jjD�|_dd�|jjD�|_|r2|j	|_	|j
|_
|j|_n
t�|_	i|_
i|_t
�jdd�dS)NcSrzrDr{r~rDrDrEr�{s�z=HyperlinkAvailabilityCheckWorker.__init__.<locals>.<listcomp>cSr�rDr{r�rDrDrEr�}r�T)�daemon)r�r�r�r�r�r�ryr�r�rnrorprmrJrK)rMr�r�r�r�r�r�rNrDrErKos&��
z)HyperlinkAvailabilityCheckWorker.__init__c
	s�i��jjr�jj�d<dtf��fdd��dttttff������fdd��dtdtdtf�fd	d
��dtdttttff���fdd
�}	�j��}z|\}��durZWdS�\�}}Wnt	yo|\}�}}Ynw�durvdSt
��j}z�j|j
}Wn	ty�Ynw|t��kr�t�t��j�t|��d��j��qH||�\}}}	|dkr�t�td��td��n
�j�t�|||||	���j��qI)N�timeoutr>csht��}d|j|jfd|j|jf�dg}|D]}|�jjvr1tt�}|��jj|�|SqiS)Nz%s://%sz%s://%s/�*)r�scheme�netlocr��linkcheck_request_headersr��DEFAULT_REQUEST_HEADERS�update)�url�
candidates�u�headersr�rDrE�get_request_headers�s��zAHyperlinkAvailabilityCheckWorker.run.<locals>.get_request_headersc
sd�vr��dd�\}}�jD]}|�|�rd}nqn�}d}z|�d�Wn
ty4t|�}Ynw�jD]\}}|���rCnq8d}���d<zt|rv�jjrvt	j
|fd�j|d����}|��t|t
|��}|suttd�|��nHzt	j|fd�j|d����}|��Wn3tttfy�}z$t|t�r�|jjd	kr��t	j
|fd�j|d����}|��WYd}~nd}~wwWn�t�y)}z]|jjd
kr�WYd}~dS|jjd	k�r��|j�}|dur��j�t|��d�WYd}~d
Sdt|�dfWYd}~S|jjdk�rdt|�dfWYd}~Sdt|�dfWYd}~Sd}~wt�yB}z
dt|�dfWYd}~Sd}~wwt|�j}	z�j|	=Wn
t�yXYnw|j �!d�|�!d�k�rgdS|j }
|�rs|
d|7}
�||
��r{dS|j"�r�|j"dj}d|
|fSd|
dfS)N�#r<�asciir�T)�streamr�r�zAnchor '%s' not found)�allow_redirectsr�r�i�i�)r�z - unauthorizedrF)�rate-limitedr�rr�ri�r��/�r�r�r���r�)#�splitryr��encode�UnicodeErrorr%r�r��linkcheck_anchorsr'r��raise_for_statusrir�	Exceptionr#�headrrrrbr]�status_coder�r�r�r2r[rr�r�r�r��rstrip�history)�req_urlr^�rexr�r�r]rL�errr3r��new_urlr8)�allowed_redirectr�r4�kwargsrMr/rDrE�	check_uri�s�

���
�
���
��
�����	���
�

z7HyperlinkAvailabilityCheckWorker.run.<locals>.check_urir�rcs4�jj��D]\}}|�|�r|�|�rdSqdS)NTF)r�r��itemsr�)r�r�from_url�to_urlrurDrErs
�z>HyperlinkAvailabilityCheckWorker.run.<locals>.allowed_redirectr0cs,t��dks��d�r
dS��d�s4t���rdSt��j�|��}t�t�	|���r-dSd�j
�<dS��jvr;dS��j
vrHd	�j
�dfS��jvr\d
�j�d�j�dfSt
�jj�D]}��\}}}|d	krpnqb|dkr|�j���n|d	kr�|�j
�<n|d
kr�||f�j�<|||fS)
Nr)r�zmailto:ztel:)r�r�r)zhttp:zhttps:r�r�)r�r�r)r�r�rr�r�r<r�)�len�
startswith�uri_rer�r�dirnamer�r��existsr�rornrpr�r��linkcheck_retries�add)r0�srcdir�_r6r�r8)rrMr/rDrEr�s8





�
z3HyperlinkAvailabilityCheckWorker.run.<locals>.checkTFr�z-rate limited-   z | sleeping...)r��linkcheck_timeoutrrr[r�r�r�r�r�rr�r�r3r��time�sleep�QUEUE_POLL_SECSr�r2�	task_doner�r�r(r�r5)
rMr��
check_requestr3r0r1r�r6r�r8rD)rrr�r4rrMr/rE�run�sH&`$%
�
�


�z$HyperlinkAvailabilityCheckWorker.runr]c
Csd}|j�d�}|rAzt|�}Wn*ty:zt|�}Wnttfy(Ynwt�|�}|t�t	j
���}Ynwt��|}t
|j�j}|dur|jj}z|j|}Wntyat}Ynw|j}	d|	}||krs|	|krs|}||krydSt��|}t||�|j|<|S)NzRetry-Afterg@)r�r�r�r�r�	TypeErrorr�	timestamp�nowr�utc�
total_secondsrrr�r�r��linkcheck_rate_limit_timeoutr�r��
DEFAULT_DELAYr:r9)
rMr]r3�retry_afterr:�untilr��	max_delay�
rate_limit�last_wait_timerDrDrEr�RsB�
���z+HyperlinkAvailabilityCheckWorker.limit_rater�r�)rWrXrYrZr"r rrr[r9rjrKr$rrr�r�r\rDrDrNrEr�ls��
���
Fr�c@s&eZdZdZdZdeddfdd�ZdS)�HyperlinkCollector)rk� rr>Nc
Ks�tt|jj�}|j}|j�tj�D]*}d|vrq|d}|j�	d|�}|r'|}t
|�}t||jj
|�}||vr;|||<q|j�tj�D].}	|	d�d�}|rqd|vrq|j�	d|�}|r]|}t
|	�}t||jj
|�}||vrq|||<qCdS)N�refuri�linkcheck-process-urir��?z://)rrjr�r�rl�document�traverser�	reference�emit_firstresultr-r.r�r0�imager�)
rMrr�rl�refnoder/�newurir1�uri_info�imgnoderDrDrEr$}s4���zHyperlinkCollector.run)rWrXrY�builders�default_priorityr
r$rDrDrDrEr1ysr1r�cCsHt|�}|jdkr"|jr"|j�d�}|s"d|j��}t|j|d��SdS)z�Rewrite anchor name of the hyperlink to github.com

    The hyperlink anchors in github.com are dynamically generated.  This rewrites
    them before checking and makes them comparable.
    z
github.comz
user-content-)�fragmentN)r�hostnamerArr�_replace)r�r/�parsed�prefixedrArDrDrE�rewrite_github_anchor�srFr�cCs�t|jj���D]B\}}z6zt�|�|jjt�|�<Wntjy9}zt�t	d�|j
|j�WYd}~nd}~wwW|jj�|�q|jj�|�wdS)zFCompile patterns in linkcheck_allowed_redirects to the regexp objects.z=Failed to compile regex in linkcheck_allowed_redirects: %r %sN)
�listr�r�rr|r}�errorr�r�r#r��msg�pop)r�r�r�r��excrDrDrE�#compile_linkcheck_allowed_redirects�s
���� �rLcCs�|�t�|�t�|�dgd�|�did�|�dgd�|�did�|�ddd�|�dddtg�|�dd	d�|�d
dd�|�dd
gd�|�ddd�|�d�|jdtdd�dddd�S)Nr�r�r�r�rr<rr��rTr�z^!r*g�r@r4z
config-initedr2)�priority�builtin)�version�parallel_read_safe�parallel_write_safe)	�add_builderrj�add_post_transformr1�add_config_valuer��	add_event�connectrL)r�rDrDrE�setup�s$


�rX)brZr�r|rqrrBrr�email.utilsr�html.parserr�osr�queuerr�	threadingr	�typingr
rrr
rrrrrrr�urllib.parserrr�docutilsr�docutils.nodesrr'r�requests.exceptionsrrr�sphinx.applicationr�sphinx.builders.dummyr�
sphinx.configr �sphinx.deprecationr!�sphinx.environmentr"�
sphinx.localer#�!sphinx.transforms.post_transformsr$�sphinx.utilr%r&�sphinx.util.consoler(r)r*r+r,�sphinx.util.nodesr-�	getLoggerrWr�r}rr[r�r.r�r2r5r9�CheckRequestTyper�r�r!r+rFrGr�rirjr�r�r1rFrLrXrDrDrDrE�<module>s�
4



�

�
��
B9$