Sample

pyint-37bf4c35f06d-I13

Lower every eligible synchronous for loop to a while loop

Matched original source

Lines245

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Dorn0.0780–1; higher is more readable
Mi0.5720–1; higher is more readable
LLOC160Logical lines; fewer is more readable
DeepSeek V4 Pro14.330–20; mean of three runs
GPT-6.1 Sol150–20; mean of three runs
BTTF0.320–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.""" 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.9921.788−327.419
Source linesThe number of non-empty source lines.245+98
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.498−6.747

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

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.246−7.674
Indentation frequencyHow rapidly indentation changes from line to line.219+6.838
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.219−4.605
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.244.902+3.013
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.98−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.222

Intercept 0.07 + feature contributions = -2.473 (log-odds).
Score = sigmoid(-2.473) = 0.078.

Score0.572
Score160
Run 1

The code is generally readable with clear class structure, type hints, and docstrings. It follows a logical flow: state initialization, header building, and response handling. Nesting depth is mostly manageable, though handle_401 has some branching. The build_digest_header method is long but well-segmented, with inline comments explaining non-obvious parts. Action granularity is good—most lines perform one operation. However, some sections reduce clarity: repeated lambdas for hash algorithms could be consolidated; the 'XXX not implemented yet' entdig variable is dead code; and a few lines (e.g., string concatenations with time.ctime() and os.urandom) could be broken down. Overall, the code is above average but could be slightly more concise and consistent.

Run 2

The code is fairly readable overall with clear class structure, type hints, and docstrings. The build_digest_header method reads logically and keeps most actions on separate lines. However, readability is reduced by several factors: deeply nested conditional logic in the algorithm selection, repeated hash function definitions that could be factored out, and some cryptic variable names like 'KD', 'A1', 'A2', 'HA1', 'HA2', and 'ncvalue'. The handle_401 method is dense and contains multiple responsibilities. Walrus operators in conditional checks add concision but slightly hurt readability. The use of comments helps explain non-obvious sections. Structure would benefit from extracting hash algorithm setup and digest calculation into helper methods.

Run 3

The code shows reasonable structure with clear class organization and type hints, but has several readability issues. The build_digest_header method is overly long and complex, containing deeply nested conditionals and multiple similar lambda definitions that could be consolidated. Variable naming is cryptic (KD, A1, A2, HA1, HA2) without clear explanatory context. The handle_401 method mixes multiple concerns: authentication logic, file position management, and request reconstruction. While the code uses good practices like per-thread state isolation and type annotations, the heavy use of inline comments explaining 'XXX not implemented yet' suggests incomplete design. The digest header construction string is monolithic and hard to follow. However, the overall flow is logical, methods are named clearly for their purposes, and the code maintains consistent formatting. The readability is moderate - understandable for experienced developers familiar with HTTP authentication, but challenging for others due to domain-specific complexity and dense implementation details.

Run 1

Code Structure: Methods logically separate initialization, digest generation, response handling, and request setup, but digest generation combines several responsibilities. Nesting: Mostly shallow, with moderate nesting in algorithm selection and retry handling. Clarity of intent: Descriptive method names, type hints, and comments explain the authentication workflow; terse RFC variables, stale comments, and implicit thread-local state reduce clarity. Code length: Reasonable for the functionality, though repeated hash wrappers and verbose state access add avoidable length. Action granularity: Generally one action per line; assignment expressions introduce minor compression, and the standalone r.content access has a non-obvious side effect. Reading flow: Initialization and request processing follow a coherent sequence, but understanding the full lifecycle requires tracing callbacks and shared state across methods.

Run 2

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 add some visual overhead. Clarity of intent: Descriptive method names, annotations, and protocol comments help, but abbreviated variables, implicit thread-local state, outdated comments, and placeholder logic obscure details. Code length: Generally purposeful, though repeated hashing helpers and the long digest-building method could be simplified. Action granularity: Almost every line performs one action, making individual operations easy to follow. Reading flow: Authentication proceeds in a coherent sequence, but repeated thread-local accesses, inline casts, and terse intermediate names interrupt the flow. Overall, readable and reasonably organized, with some maintainability and explanatory weaknesses.

Run 3

Code Structure: Methods logically separate initialization, digest construction, response handling, and request preparation, though digest construction mixes several responsibilities. Nesting: Mostly shallow conditionals and early returns keep complexity manageable; nested hash helpers add some depth. Clarity of intent: Descriptive method names, type annotations, and protocol comments help, but terse variables such as s, r, KD, and respdig require interpretation. Stale comments mentioning lambdas and placeholder entdig logic reduce clarity. Code length: Repeated hash wrappers and the long digest-building method could be simplified or extracted. Action granularity: Nearly every line performs one action, making state changes and request handling easy to inspect. Reading flow: Authentication proceeds in a generally natural sequence, but repeated thread-local access, inline casts, long annotations, and implicit side effects such as accessing r.content interrupt the flow.