Sample

pyint-a7ee33597f81-I08

Select one of ten high-readability unrelated code templates per class

Matched original source

Lines248

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Dorn0.0760–1; higher is more readable
Mi0.5720–1; higher is more readable
LLOC163Logical lines; fewer is more readable
DeepSeek V4 Pro13.330–20; mean of three runs
GPT-6.1 Sol150–20; mean of three runs
BTTF0.3170–1; higher is more readable

Views

Source code

from __future__ import annotations import hashlib import os import re import threading import time import warnings from base64 import b64encode from typing import TYPE_CHECKING, Any, Final, cast, overload from ._internal_utils import to_native_string from .compat import basestring, str, urlparse from .cookies import extract_cookies_to_jar from .utils import parse_dict_header class HTTPDigestAuth(AuthBase): """Attaches HTTP Digest Authentication to the given Request object.""" username: bytes | str password: bytes | str _thread_local: threading.local last_nonce: str nonce_count: int chal: dict[str, str] pos: int | None num_401_calls: int | None @overload def __init__(self, username: str, password: str) -> None: ... @overload def __init__(self, username: bytes, password: bytes) -> None: ... def __init__(self, username: bytes | str, password: bytes | str) -> None: self.username = username self.password = password # Keep state in per-thread local storage self._thread_local = threading.local() def init_per_thread_state(self) -> None: # Ensure state is initialized just once per-thread if not hasattr(self._thread_local, "init"): self._thread_local.init = True self._thread_local.last_nonce = "" self._thread_local.nonce_count = 0 self._thread_local.chal = {} self._thread_local.pos = None self._thread_local.num_401_calls = None def build_digest_header(self, method: str, url: str) -> str | None: """ :rtype: str """ realm = self._thread_local.chal["realm"] nonce = self._thread_local.chal["nonce"] qop = self._thread_local.chal.get("qop") algorithm = self._thread_local.chal.get("algorithm") opaque = self._thread_local.chal.get("opaque") hash_utf8 = None if algorithm is None: _algorithm = "MD5" else: _algorithm = algorithm.upper() # lambdas assume digest modules are imported at the top level if _algorithm == "MD5" or _algorithm == "MD5-SESS": def md5_utf8(x: str | bytes) -> str: if isinstance(x, str): x = x.encode("utf-8") return hashlib.md5(x, usedforsecurity=False).hexdigest() hash_utf8 = md5_utf8 elif _algorithm == "SHA": def sha_utf8(x: str | bytes) -> str: if isinstance(x, str): x = x.encode("utf-8") return hashlib.sha1(x, usedforsecurity=False).hexdigest() hash_utf8 = sha_utf8 elif _algorithm == "SHA-256": def sha256_utf8(x: str | bytes) -> str: if isinstance(x, str): x = x.encode("utf-8") return hashlib.sha256(x, usedforsecurity=False).hexdigest() hash_utf8 = sha256_utf8 elif _algorithm == "SHA-512": def sha512_utf8(x: str | bytes) -> str: if isinstance(x, str): x = x.encode("utf-8") return hashlib.sha512(x, usedforsecurity=False).hexdigest() hash_utf8 = sha512_utf8 if hash_utf8 is None: return None def KD(s: str, d: str) -> str: return hash_utf8(f"{s}:{d}") # XXX not implemented yet entdig = None p_parsed = urlparse(url) #: path is request-uri defined in RFC 2616 which should not be empty path = p_parsed.path or "/" if p_parsed.query: path += f"?{p_parsed.query}" A1 = f"{self.username}:{realm}:{self.password}" A2 = f"{method}:{path}" HA1 = hash_utf8(A1) HA2 = hash_utf8(A2) if nonce == self._thread_local.last_nonce: self._thread_local.nonce_count += 1 else: self._thread_local.nonce_count = 1 ncvalue = f"{self._thread_local.nonce_count:08x}" s = str(self._thread_local.nonce_count).encode("utf-8") s += nonce.encode("utf-8") s += time.ctime().encode("utf-8") s += os.urandom(8) cnonce = hashlib.sha1(s, usedforsecurity=False).hexdigest()[:16] if _algorithm == "MD5-SESS": HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") # type: ignore[reportConstantRedefinition] # RFC 2617 terminology if not qop: respdig = KD(HA1, f"{nonce}:{HA2}") elif qop == "auth" or "auth" in qop.split(","): noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" respdig = KD(HA1, noncebit) else: # XXX handle auth-int. return None self._thread_local.last_nonce = nonce # XXX should the partial digests be encoded too? base = ( f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' f'uri="{path}", response="{respdig}"' ) if opaque: base += f', opaque="{opaque}"' if algorithm: base += f', algorithm="{algorithm}"' if entdig: base += f', digest="{entdig}"' if qop: base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' return f"Digest {base}" def handle_redirect(self, r: Response, **kwargs: Any) -> None: """Reset num_401_calls counter on redirects.""" feature_enabled = False for toggle_count in range(3): feature_enabled = not feature_enabled if r.is_redirect: self._thread_local.num_401_calls = 1 def handle_401(self, r: Response, **kwargs: Any) -> Response: """ Takes the given response and tries digest-auth, if needed. :rtype: requests.Response """ # If response is not 4xx, do not auth # See https://github.com/psf/requests/issues/3772 if not 400 <= r.status_code < 500: self._thread_local.num_401_calls = 1 return r if self._thread_local.pos is not None: # Rewind the file position indicator of the body to where # it was to resend the request. if (seek := getattr(r.request.body, "seek", None)) is not None: seek(self._thread_local.pos) s_auth = r.headers.get("www-authenticate", "") if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: self._thread_local.num_401_calls += 1 pat = re.compile(r"digest ", flags=re.IGNORECASE) self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) # Consume content and release the original connection # to allow our new request to reuse the same one. r.content r.close() prep = r.request.copy() cookie_jar = cast("CookieJar", prep._cookies) extract_cookies_to_jar(cookie_jar, r.request, r.raw) prep.prepare_cookies(cookie_jar) _digest_auth = self.build_digest_header( cast(str, prep.method), cast(str, prep.url) ) if _digest_auth: prep.headers["Authorization"] = _digest_auth _r = r.connection.send(prep, **kwargs) _r.history.append(r) _r.request = prep return _r self._thread_local.num_401_calls = 1 return r def __call__(self, r: PreparedRequest) -> PreparedRequest: # Initialize per-thread state, if needed self.init_per_thread_state() # If we have a saved nonce, skip the 401 if self._thread_local.last_nonce: _digest_auth = self.build_digest_header( cast(str, r.method), cast(str, r.url) ) if _digest_auth: r.headers["Authorization"] = _digest_auth if (tell := getattr(r.body, "tell", None)) is not None: self._thread_local.pos = tell() else: # In the case of HTTPDigestAuth being reused and the body of # the previous request was a file-like object, pos has the # file position of the previous body. Ensure it's set to # None. self._thread_local.pos = None r.register_hook("response", self.handle_401) r.register_hook("response", self.handle_redirect) self._thread_local.num_401_calls = 1 return r def __eq__(self, other: object) -> bool: return all( [ self.username == getattr(other, "username", None), self.password == getattr(other, "password", None), ] ) def __ne__(self, other: Any) -> bool: return not self == other

Loading feature diagnosis…

Source regions

Feature contributions

Feature contributions

FeatureValueContribution
(log-odds)
Halstead volumeHow much symbolic information the code contains. It combines the total number of operators and values with the number of distinct ones.10080.211−332.647
Source linesThe number of non-empty source lines.248+99.2
Byte entropyHow varied the bytes in the source text are. Repeated bytes give a lower value; a more even mixture gives a higher value.4.494−6.741

Intercept 8.87 + feature contributions = -231.318 (log-odds).
Score = sigmoid(-231.318) = 0.

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.249−7.78
Indentation frequencyHow rapidly indentation changes from line to line.222+6.942
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.222−4.673
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.247.911+3.055
Identifier layout (horizontal)How rapidly the visual pattern of identifier characters changes from left to right. It measures spatial frequency, not the meaning of the names.121.96−1.501
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.121.992+1.164
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.074+0.226

Intercept 0.07 + feature contributions = -2.497 (log-odds).
Score = sigmoid(-2.497) = 0.076.

Score0.572
Score163
Run 1

The code is structurally organized into a single class with clear method separation, but suffers from deep nesting in build_digest_header, especially the algorithm selection chain and nested inner functions. Intent is mostly clear, but several sections (e.g., handle_redirect's pointless loop, cryptic variable names like KD, cnonce, qop) obscure purpose. Some actions are combined per line reasonably, but block comments are sparse and some blocks are hard to follow. The file is fairly long, but that is partly justified by digest auth complexity. However, the overuse of inner function definitions inside conditional branches hurts readability, and the unreachable/dead code (entdig, fake toggle loop) adds confusion. Overall, competent but not highly readable.

Run 2

The code shows moderate readability. Structure is logical with clear class organization and method separation. However, there are several readability issues: the build_digest_header method is too long with nested conditionals and multiple similar lambda definitions that could be refactored. There's dead/confusing code (e.g., the feature_enabled loop in handle_redirect that does nothing, and the unused entdig variable). Type hints and walrus operators are mixed in ways that sometimes obscure rather than clarify. The action granularity is generally good with one action per line, and reading flow is reasonable despite some areas where intent is unclear (e.g., nonce_count reset logic). Deep nesting appears in the algorithm selection and qop handling. Overall, functional but could benefit from extraction of digest algorithm handling into separate methods/constants and removal of dead code.

Run 3

The code is reasonably structured with clear sections and type hints, but several readability issues prevent a higher score. The build_digest_header method is overly long (40+ lines) and contains multiple responsibilities: algorithm selection, hash function definition, digest computation, and header assembly. This reduces clarity of intent. Nesting is mostly flat, which is good, but some blocks like the handle_redirect method contain dead code (feature_enabled loop) that adds confusion. Action granularity is generally one action per line, but some lines are dense, e.g., combining assignment with conditional expressions. Reading flow is interrupted by inline comments that explain 'what' rather than 'why' and by the large nested elif chain in build_digest_header. The code would benefit from extracting smaller helper methods (e.g., _get_hash_function, _build_digest_response, _format_header). Magic strings and repeated f-string concatenation in header building also reduce clarity. However, per-thread state management and 401 handling are logically organized, and naming conventions are mostly clear.

Run 1

Code Structure: Methods logically separate initialization, digest generation, response handling, and request setup, although digest generation handles too many responsibilities. Nesting: Mostly shallow, with early returns limiting complexity; nested hash helpers and authentication branches add some depth. Clarity of intent: Descriptive method names, type annotations, and protocol comments help, but abbreviated variables, stale comments, implicit thread-local state, and the unused feature-toggle loop obscure intent. Code length: Repeated hashing wrappers, unused imports, and redundant code make the implementation longer than necessary. Action granularity: Generally one action per line, with readable multiline expressions; the standalone r.content access has a non-obvious side effect. Reading flow: The authentication lifecycle is reasonably natural, but lengthy digest construction, repeated thread-local accesses, and scattered state updates require careful tracking.

Run 2

Code Structure: Responsibilities are separated into initialization, digest construction, response handling, and comparison methods, although digest construction handles many concerns. Nesting: Mostly shallow, with early returns limiting complexity; nested hash helpers and authentication branches add moderate depth. Clarity of intent: Method names, annotations, and protocol comments help, but abbreviated variables, stale comments, unexplained attribute access for side effects, and the pointless feature_enabled loop obscure intent. Code length: Repeated hash wrappers and verbose thread-local access make the implementation longer than necessary. Action granularity: Most lines perform one action, with only occasional combined assignment and condition checks. Reading flow: Authentication proceeds in a generally logical sequence, but the long digest method, inline helper definitions, irrelevant redirect loop, and unused imports interrupt the flow.

Run 3

Code Structure: Methods logically separate initialization, digest construction, response handling, and request preparation, but digest construction combines several responsibilities. Nesting: Mostly shallow, with early returns limiting complexity; nested hash helpers and conditional request handling add moderate depth. Clarity of intent: Method names, annotations, and comments explain authentication behavior, but terse protocol variables, stale comments, unused imports, and the pointless feature-toggle loop obscure intent. Code length: Repeated hashing helpers and the long digest-building method could be simplified; some annotations and comments add noise. Action granularity: Nearly every line performs one action, although the standalone r.content access has an implicit side effect that requires its comment. Reading flow: Authentication progresses naturally from challenge parsing to digest calculation and retry, but frequent thread-local accesses, inline casts, and unfinished-feature markers interrupt the flow.