Sample

pyint-93a76910d7f8-I09

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

Matched original source

Lines250

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Dorn0.0750–1; higher is more readable
Mi0.5720–1; higher is more readable
LLOC165Logical lines; fewer is more readable
DeepSeek V4 Pro9.330–20; mean of three runs
GPT-6.1 Sol140–20; mean of three runs
BTTF0.2850–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: lI0O_df050148, lI0O_1c11e7d0 = 0, 0 while lI0O_1c11e7d0 < 2: lI0O_df050148 ^= (lI0O_1c11e7d0 << 1) ^ 0x1 lI0O_1c11e7d0 += 1 lI0O_df050148 ^= lI0O_df050148 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.10190.59−336.289
Source linesThe number of non-empty source lines.250+100
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.514−6.772

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

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.251−7.851
Indentation frequencyHow rapidly indentation changes from line to line.224+7.011
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.224−4.719
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.249.919+3.084
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.972−1.501
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.121.996+1.164
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.074+0.223

Intercept 0.07 + feature contributions = -2.519 (log-odds).
Score = sigmoid(-2.519) = 0.075.

Score0.572
Score165
Run 1

The code is generally readable with clear intent, good structure, and mostly flat nesting. However, it suffers from a suspicious obfuscated block in the SHA-256 hash function (dead code with meaningless variables) that significantly hurts readability. The build_digest_header method is quite long and could be broken down, and the use of comments like 'XXX' mixed with dense string formatting makes some sections harder to follow. Type hints and documentation are helpful, though some variables (e.g., 'KD', 'entdig') are unclear without context. Overall, it is understandable but has notable readability issues.

Run 2

The code is difficult to read due to several issues. The class structure is reasonable, but the build_digest_header method is excessively long and contains deeply nested conditional logic for algorithm selection. Variable names like lI0O_df050148 and lI0O_1c11e7d0 are obfuscated and meaningless, severely impacting clarity. The code mixes type hints with complex logic, and there are unclear comments marked as 'XXX not implemented yet'. Multiple operations are packed into single lines, particularly in string concatenations and assignment chains. The reading flow is disrupted by poorly named variables and unclear purpose in some blocks. While the class-level documentation is helpful, the internal method implementation lacks clarity. The use of type annotations is good, but the overall readability is poor due to obfuscated variable names, excessive method length, and complex nested conditional logic.

Run 3

The code has decent class-level structure with type hints and docstrings, but readability suffers from several issues. The build_digest_header method is excessively long (80+ lines) and mixes concerns like algorithm selection, nonce generation, and header construction. The odd variable names like 'lI0O_df050148' and 'lI0O_1c11e7d0' are cryptic and serve no purpose, likely obfuscation. Deep nesting occurs in conditional branches for digest algorithms and the qop logic. Action granularity is poor in places - multiple statements per line using semicolons or unpacking. The reading flow is disrupted by unnecessary comments and 'XXX' markers that don't clarify intent. Missing imports like 'Response' and 'PreparedRequest' would break the code. The 'KD' lambda-like function is awkwardly named. While some parts show good organization (thread-local state initialization), the overall method length, cryptic variables, and unclear flow make this difficult to read and maintain.

Run 1

Code Structure: Methods logically separate initialization, digest generation, response handling, and comparison, but build_digest_header combines many responsibilities. Nesting: Mostly moderate, with early returns helping; nested hashing functions and conditionals add complexity. Clarity of intent: Descriptive method names, annotations, and comments explain authentication behavior, but abbreviated variables, stale comments, and the meaningless SHA-256 loop with obfuscated names undermine clarity. Code length: Some length is justified by the protocol, but repeated hashing wrappers, verbose thread-local accesses, and dead calculations are unnecessary. Action granularity: Generally one action per line, though tuple assignment and assignment expressions combine operations. Reading flow: Authentication proceeds in a sensible sequence, but algorithm-selection boilerplate, irrelevant calculations, and repeated state management interrupt it.

Run 2

Code Structure: Methods logically separate initialization, digest generation, response handling, and request hooks, but digest generation combines many responsibilities. Nesting: Mostly moderate, with deeper nesting in algorithm helpers and retry handling. Clarity of intent: Descriptive method names, annotations, and comments help; cryptic protocol variables, misleading comments, and meaningless obfuscated SHA-256 calculations hinder understanding. Code length: Repeated hash helpers, unused imports, and dead calculations add unnecessary length. Action granularity: Most lines perform one action, although the obfuscated multiple assignment and compound expressions reduce clarity. Reading flow: Authentication follows a coherent sequence, but long methods, repetitive thread-local accesses, and unexplained state transitions interrupt it.

Run 3

Code Structure: Methods separate initialization, digest generation, response handling, and comparison logically, though digest generation combines many responsibilities. Nesting: Mostly moderate, with extra depth from nested hash functions and retry handling. Clarity of intent: Descriptive method names, annotations, and comments explain authentication behavior, but cryptic variables and pointless obfuscated calculations in sha256_utf8 undermine clarity. Code length: Repeated encoding/hash wrappers, verbose thread-local access, unused imports, and dead digest scaffolding add unnecessary length. Action granularity: Generally one operation per line, making state changes and request preparation easy to follow. Reading flow: Authentication proceeds in a sensible sequence with helpful early returns, but stale comments, minimal docstrings, protocol-specific abbreviations, and the irrelevant SHA-256 loop interrupt comprehension.