PlainHeaders

Add, change or remove HTTP request & response headers. Open source, no tracking, access only to sites you choose.

Add PlainHeaders to Chrome — free Add PlainHeaders to Firefox — free

What it does

Price

Free, with no header limit and no nagging. A planned optional Pro upgrade ($7 one-time) will add several profiles at once, URL filters per profile and URL redirects.

Privacy

No analytics, no ads, no remote code. Headers are applied with Chrome's declarativeNetRequest, so the extension never sees request contents. Site privacy policy.

Screenshots

PlainHeaders screenshot 1PlainHeaders screenshot 2PlainHeaders screenshot 3

PlainHeaders is built with AI assistance and maintained by an independent developer. It is open source (MIT). Try the related free web tool: HTTP header parser & converter. Guide: Content-Security-Policy header examples (nginx, Apache, HTML). Guide: How to modify HTTP request and response headers in Chrome and Firefox. Guide: How to change the Referer, User-Agent or X-Forwarded-For header in Chrome. Guide: How to hide or remove the Server header in nginx and Apache. Guide: How to allow multiple origins in Access-Control-Allow-Origin (CORS). Guide: Bearer token Authorization header: format and examples. Guide: X-Forwarded-For in nginx: log the real client IP without trusting forged headers. Guide: HTTP header size limits: nginx 400 and Node 431 errors, measured. Guide: 400 Bad Request: Request Header Or Cookie Too Large (nginx), fixed and tested. Guide: Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest and Sec-Fetch-User explained (tested in Chromium). Guide: Reporting-Endpoints, Report-To and CSP report-to vs report-uri (tested in Chromium). Guide: X-Frame-Options DENY vs SAMEORIGIN vs CSP frame-ancestors (tested in Chrome). Guide: Content-Disposition header: attachment vs inline and file names (tested in Chrome). Guide: Strict-Transport-Security header 'not set' in nginx: the two traps. Guide: X-Content-Type-Options: nosniff, what it blocks (tested in Chrome). Guide: Referrer-Policy header values, compared (tested in Chrome). Guide: SameSite cookies: Lax vs Strict vs None, tested in Chrome. Guide: Retry-After header on 429 and 503: seconds vs date, and what curl and Python do. Guide: Permissions-Policy header: syntax, examples and mistakes (tested in Chrome). Guide: Content-Type: application/json, what curl, Python and fetch actually send. Guide: ETag header explained: format, 304 responses and the gzip W/ prefix (tested on nginx). Guide: Vary: Origin, why CORS breaks behind a cache without it (tested). Guide: Accept-Language header: format, q values, real examples and a parser. Guide: Cache-Control no-cache vs no-store, what Chrome actually does (tested). Guide: Set-Cookie HttpOnly: what it blocks in JavaScript (tested in Chrome). Guide: Access-Control-Max-Age: default, 600 vs 86400, measured in Chrome. Guide: Host header injection: tested in nginx, and the default_server fix. Guide: Access-Control-Allow-Credentials: true, and why * fails (tested in Chrome). Guide: Content-Security-Policy-Report-Only: test a CSP without breaking your site (tested). Guide: If-Modified-Since header: format, example and nginx's exact-match default (tested). Guide: X-Requested-With header: who sends it, and why it's missing (tested). Guide: Content-Encoding gzip vs br in nginx: what stock nginx sends (tested). Guide: Access-Control-Expose-Headers: why response.headers.get() returns null (tested). Guide: Cross-Origin-Resource-Policy values: same-origin vs same-site vs cross-origin (tested). Guide: Clear-Site-Data header: example values and what Chrome actually cleared (tested). Guide: Upgrade-Insecure-Requests: the request header vs the CSP directive (tested). Guide: WWW-Authenticate header: Basic auth in nginx, Bearer, and why the login prompt doesn't appear (tested). Guide: Cross-Origin-Opener-Policy: same-origin vs same-origin-allow-popups vs unsafe-none (tested). Guide: Cross-Origin-Embedder-Policy: require-corp vs credentialless (tested). Guide: X-Forwarded-Proto in nginx: $scheme vs passing it through (tested). Guide: When does the browser send the Origin header? (tested). Guide: Access-Control-Allow-Methods (tested). Guide: Range header and 206 Partial Content (tested with nginx and curl). Guide: Server-Timing header (tested in Chromium 153). Guide: Content-Length mismatch errors (tested). Guide: Expect: 100-continue in curl (tested). Guide: Accept-Encoding: gzip, deflate, br, zstd (tested). Guide: HSTS preload list requirements (tested). Guide: Sec-CH-UA and User-Agent Client Hints explained (tested in Chromium). Guide: Vary header: Accept-Encoding, User-Agent and * (tested). Guide: 431 Request Header Fields Too Large (tested). Guide: Access-Control-Allow-Headers (tested). Guide: Transfer-Encoding: chunked vs Content-Length: when servers use which (tested in Node and nginx). Guide: stale-while-revalidate and Cache-Control immutable: what Chrome actually does (tested). Guide: 413 Request Entity Too Large (tested). Guide: 406 Not Acceptable (tested). Guide: 415 Unsupported Media Type (tested). Guide: Forwarded vs X-Forwarded-For (tested). Guide: X-XSS-Protection header: deprecated, what to set (tested). Guide: Connection: keep-alive and the Keep-Alive header (tested). Guide: Cache-Control: private vs public (tested). Guide: Last-Modified header explained (tested). Guide: CSP nonce: script-src 'nonce-...' (tested). Guide: 408 Request Timeout (tested). Guide: 103 Early Hints (tested). Guide: Via header (tested). Guide: Pragma: no-cache header (tested). Guide: Proxy-Authorization header (tested). Guide: 502 Bad Gateway (tested). Guide: 504 Gateway Timeout (tested). Guide: 405 Method Not Allowed (tested). Guide: 503 Service Unavailable (tested). Guide: 401 vs 403: Unauthorized vs Forbidden (tested). Guide: 409 Conflict (tested). Guide: 304 Not Modified (tested). Guide: 422 Unprocessable Content (tested). Guide: 301 vs 302 vs 307 vs 308 redirects (tested). Guide: ERR_TOO_MANY_REDIRECTS (tested). Guide: 410 Gone vs 404 Not Found (tested). Guide: ERR_CONNECTION_RESET / ECONNRESET (tested). Guide: 500 Internal Server Error (tested). Guide: 400 Bad Request (tested). Guide: net::ERR_HTTP2_PROTOCOL_ERROR (tested). Guide: 499 Client Closed Request (tested). Guide: Age header (tested). Guide: Unexpected end of JSON input (tested). Guide: CORS error messages explained (tested). Guide: ERR_CONNECTION_REFUSED / ECONNREFUSED (tested). Guide: TypeError: Failed to fetch (tested). Guide: ERR_SSL_PROTOCOL_ERROR (tested). Guide: Error: socket hang up in Node.js (tested). Guide: NET::ERR_CERT_AUTHORITY_INVALID (tested). Guide: ERR_NAME_NOT_RESOLVED / ENOTFOUND (tested). Guide: CORS preflight request (OPTIONS), tested. Guide: Express "Cannot GET /" (tested). Guide: net::ERR_BLOCKED_BY_CLIENT and net::ERR_ABORTED (tested). Guide: ERR_CACHE_MISS / Confirm Form Resubmission (tested). Guide: Mixed Content blocked on HTTPS (tested). Guide: ERR_CONNECTION_TIMED_OUT / ETIMEDOUT (tested). Guide: ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent (tested). Guide: EADDRINUSE: address already in use (tested). Guide: ERR_EMPTY_RESPONSE / curl (52) Empty reply (tested). Guide: WebSocket connection to 'ws://...' failed (tested). Guide: NET::ERR_CERT_COMMON_NAME_INVALID and ERR_CERT_DATE_INVALID (tested). Guide: net::ERR_UNSAFE_PORT (tested). Guide: Self-signed certificate in certificate chain (tested). Guide: net::ERR_INVALID_RESPONSE (tested). Guide: axios Network Error (ERR_NETWORK) (tested). Guide: Python requests: Max retries exceeded (tested). Guide: Could not resolve host (tested). Guide: upstream prematurely closed connection (tested). Guide: git RPC failed; curl 56 Connection reset by peer (tested). Guide: npm ECONNRESET / ETIMEDOUT network errors (tested). Guide: nginx "no live upstreams" error (tested). Guide: jwt malformed, invalid signature, jwt expired (tested). Guide: JWT: TokenExpiredError vs invalid signature (tested). Guide: Postgres connection refused (tested). Guide: Redis Connection Refused (ECONNREFUSED) (tested). Guide: MongoDB connection refused (tested). Guide: Cannot Connect to the Docker Daemon (tested). Guide: SSH Permission denied (publickey) (tested). Guide: SSH Host Key Verification Failed (tested). Guide: npm ERESOLVE unable to resolve dependency tree (tested). Guide: npm error code ETARGET (tested). Guide: ModuleNotFoundError vs ImportError (tested). Guide: TS2307 Cannot find module (tested). Guide: React Hydration Error (tested). Guide: Vite "Failed to resolve import" (tested). Guide: Webpack Module Not Found (tested). Guide: TS2322 Type is not assignable to type (tested). Guide: Git Merge Conflict: How to Resolve (Tested). Guide: docker compose up error (tested). Guide: pip install Failed (tested). Guide: docker build failed (tested). Guide: Too Many Open Files / EMFILE (tested). Guide: Out of Memory: Killed Process (tested). Guide: Exit Code 137 (tested). Guide: JavaScript Heap Out of Memory (tested). Guide: Maximum Call Stack Size Exceeded (tested). Guide: Cannot Read Properties of Undefined (tested). Guide: UnhandledPromiseRejectionWarning / Uncaught (in promise) (tested). Guide: WebSocket Closed With Code 1006 (tested). Guide: Segmentation fault (core dumped) (tested). Guide: jwt malformed (tested). Guide: JWT expired vs invalid signature (tested). Guide: error: RPC failed; curl 56 / HTTP 400 on git push (tested). Guide: Cannot Connect to the Docker Daemon (tested). Guide: require is not defined in ES module scope (tested). Guide: Git detached HEAD (tested). Guide: Git cannot lock ref (tested). Guide: npm EACCES permission denied (tested). Guide: AttributeError: 'NoneType' object has no attribute (tested). Guide: Python KeyError (tested). Guide: KeyError when the key looks present (tested). Guide: IndentationError and TabError (tested). Guide: IndexError: list index out of range (tested). Guide: Python ZeroDivisionError (tested). Guide: RecursionError: maximum recursion depth exceeded (tested). Guide: TypeError: 'NoneType' object is not subscriptable (tested). Guide: Python ValueError (tested). Guide: Python UnicodeDecodeError (tested). Guide: SQL "column reference is ambiguous" (tested). Guide: SQL "duplicate key value violates unique constraint" (tested). Guide: SQL "column does not exist" (tested). Guide: SQL Foreign Key Constraint Fails (tested). Guide: MySQL Error 1045: Access Denied for User (tested). Guide: MySQL Error 1064: SQL Syntax Error (tested). Guide: SQL Deadlock Detected (tested). Guide: Docker: Port Is Already Allocated (tested). Guide: Docker: Container Name Already in Use (tested). Guide: Docker Exit Code 137 (tested). Guide: Docker Pull Access Denied (tested). Guide: Docker: No Space Left on Device (tested). Guide: npm Error Code E404 (tested). Guide: Node.js Cannot Find Module (tested). Guide: Bash: Unbound Variable (tested). Guide: chmod: Operation Not Permitted (tested). Guide: Bash: Command Not Found (tested). Guide: Bash: Syntax Error Near Unexpected Token (tested). Guide: Python SyntaxWarning: Invalid Escape Sequence (tested). Guide: Regex Catastrophic Backtracking (tested). Guide: CSS: z-index Not Working (tested). Guide: CSS Grid Overflow (tested). Guide: HTML Form Not Submitting (tested). Guide: HTML Form Not Submitting on Enter Key (tested). Guide: Git Stash Pop Conflict: How to Resolve It (Tested). Guide: Git Rebase Conflict: How to Resolve (Tested). Guide: TypeError: X Is Not a Function (tested). Guide: JavaScript 'Unexpected token' (tested). Guide: TS2339 Property does not exist on type (tested). Guide: TS18046 'e' is of type 'unknown' (tested). Guide: Minified React Error #130 (tested). Guide: React key prop warning (tested). Guide: react-hook-form errors not updating (tested). Guide: React error #310 (tested). Guide: Next.js error digest (tested). Guide: Next.js global-error vs error for layout (tested). Guide: npm error code ENOENT (tested). Guide: ESLint 'process'/'require'/'module' is not defined (tested). Guide: git: unable to unlink / path is unmerged / object file is empty (tested). Guide: postgres: must be owner of / permission denied for schema (tested). Guide: yaml.scanner.ScannerError: mapping values are not allowed here (tested). Guide: Hamilton: Required input missing / Cannot define function twice (tested). Guide: Terraform: Error acquiring the state lock (tested). Guide: Terraform: Saved plan is stale (tested). Guide: Terraform: Error: Cycle (tested). Guide: Terraform: Backend configuration changed (tested). Guide: Pytest: error: unrecognized arguments (tested). Guide: Unittest discovery ImportError / _FailedTest (tested). Guide: Pytest: no tests ran, exit code 5 (tested). Guide: SQLite: database is locked (tested). Guide: SQLite: attempt to write a readonly database (tested). Guide: SQLite: no such table (tested). Guide: SQLite: database disk image is malformed (tested). Guide: SQLite: unable to open database file (tested). Guide: SQLite: table has no column named (tested). Guide: SQLite: no such column (tested). Guide: SQLite: cannot start a transaction within a transaction (tested). Guide: SQLite: cannot commit - no transaction is active (tested). Guide: SQLite: NOT NULL constraint failed (tested). Guide: SQLite: datatype mismatch (tested). Guide: SQLite: too many SQL variables (tested). Guide: SQLite: CHECK constraint failed (tested). Guide: SQLite: UNIQUE constraint failed (tested). Guide: SQLite: FOREIGN KEY constraint failed (tested). Guide: SQLite: Incomplete Input / Unrecognized Token (tested). Guide: TypeError: Object of type X Is Not JSON Serializable (tested). Guide: json.decoder.JSONDecodeError: Extra Data (tested). Guide: json.decoder.JSONDecodeError: Invalid Control Character (tested). Guide: Expecting Property Name Enclosed in Double Quotes (tested). Guide: ValueError: Circular Reference Detected (tested). Guide: TypeError: the JSON Object Must Be str, bytes or bytearray (tested). Guide: json.dumps() sort_keys=True TypeError (tested). Guide: TypeError: Object of Type int64 Is Not JSON Serializable (tested). Guide: json.dumps() ensure_ascii Unicode Escapes (tested). Guide: json.dumps() separators= Silently Produces Broken JSON (tested). Guide: json.dumps() indent= TypeError: can't multiply sequence by non-int (tested). Guide: csv.Error: field larger than field limit (131072) (tested). Guide: csv.Error: new-line character seen in unquoted field (tested). Guide: csv DictReader/DictWriter Ragged Rows: the None Key (tested). Guide: csv.Error: need to escape, but no escapechar set (tested). Guide: csv.Sniffer() Silently Guesses a Wrong Delimiter (tested). Guide: csv.Sniffer().has_header() False Negative (tested). Guide: csv.reader Ignores lineterminator= (tested). Guide: csv.register_dialect() Overwrites 'excel' (tested). Guide: subprocess shell=True Drops List Args (tested). Guide: Popen.communicate(timeout=) Leaves Process Running (tested). Guide: subprocess env= Replaces, Doesn't Merge (tested). Guide: CalledProcessError.stderr Is None By Default (tested). Guide: zlib decompressobj max_length Silent Data Loss (tested). Guide: zlib compressobj flush() Ends the Stream (tested). Guide: zlib crc32 Per-Chunk Sums Are Wrong (tested). Guide: gzip Output Is Not Reproducible By Default (tested). Guide: subprocess text=True Decode Error Loses returncode (tested). Guide: subprocess shell=True kill() Leaves Child Running (tested). Guide: csv DictWriter Forgetting writeheader() (tested). Guide: zlib decompress() Drops Concatenated Streams (tested). Guide: subprocess stdin.write() Deadlock Without communicate() (tested). Guide: csv QUOTE_NONNUMERIC Booleans Round-Trip Failure (tested). Guide: configparser Percent Sign InterpolationSyntaxError (tested). Guide: configparser getboolean() Rejects enabled/disabled (tested). Guide: configparser ${} Syntax Silently Not Interpolated (tested). Guide: configparser read() Missing File No Error (tested). Guide: configparser remove_option() Silent No-op on DEFAULT Fallback (tested). Guide: argparse type=bool Always True Except Empty String (tested). Guide: argparse Subparsers Not Required by Default (tested). Guide: argparse Negative Number Positional Breaks With a -1-style Option (tested). Guide: urlencode() List Value Without doseq Encodes str(list) (tested). Guide: urljoin() //host Input Silently Switches Host (tested). Guide: argparse default Not Validated Against choices (tested). Guide: urllib.parse.quote() Double-Encoding Corrupts Already-Encoded Values (tested). Guide: parse_qsl() Drops Empty Values By Default (tested). Guide: urlparse() Without a Scheme Misreads the Host (tested). Guide: tarfile.extractall() Path Traversal Still Not Blocked By Default (tested). Guide: datetime.astimezone() on a Naive Value Silently Assumes Local Time (tested). Guide: Two Different DST Fall-Back Instants Compare Equal in datetime (tested). Guide: shutil.copytree() Leaves a Partial Copy Behind When It Raises (tested). Guide: shutil.make_archive() Stores Symlinks as Absolute Paths in tar Format (tested). Guide: isinstance(x, date) Silently Matches datetime Too (tested). Guide: tarfile.open() Write Mode Ignores the .tar.gz Extension (tested). Guide: timedelta.days Is -1 for Any Negative Sub-Day Duration (tested). Guide: pathlib Path.exists() Returns False for a Dangling Symlink (tested). Guide: pathlib glob() Matches Hidden Dotfiles, glob Module Does Not (tested). Guide: pathlib Path.resolve() Does Not Detect a Symlink Loop by Default (tested). Guide: pathlib Path.walk() Puts Symlinked Directories in files, Not dirs (tested). Guide: fnmatch Asterisk Matches Across Path Separators, Unlike glob (tested). Guide: difflib quick_ratio() Returns 1.0 for Completely Reordered Strings (tested). Guide: difflib unified_diff() Glues Lines Together Without Trailing Newlines (tested). Guide: glob.glob() Silently Fails to Find a Filename Containing Brackets (tested). Guide: glob.glob(recursive=True) Does Not Detect a Symlink Loop (tested). Guide: fnmatch Bracket Caret Is Literal, Not Negation (tested). Guide: glob.glob() Over-Matches Filenames Containing * or ? (tested). Guide: difflib Differ Hint-Line Caret Misaligns on Wide Unicode Chars (tested). Guide: textwrap.dedent() Does Nothing on Mixed Tabs/Spaces (tested). Guide: textwrap.shorten() Drops a Too-Long Word Entirely (tested). Guide: textwrap Splits Hyphenated CLI Flags Mid-Name by Default (tested). Guide: itertools.groupby Groups Go Empty If Not Read Right Away (tested). Guide: itertools.tee Silently Drops Items If You Reuse the Source (tested). Guide: itertools.islice Start/Stop Are Relative, Not Fixed Indices (tested). Guide: itertools.cycle Freezes the First Lap, Replays It Forever (tested). Guide: zip_longest Fillvalue None Looks Identical to Real None Data (tested). Guide: itertools.product() With No Arguments Returns One Result (tested). Guide: itertools.chain() Silently Skips Flattening a List of Lists (tested). Guide: itertools.starmap() vs map(): The Confusing Missing-Argument Error (tested). Guide: secrets.token_hex(n) Does Not Return a Length-n Token (tested). Guide: Python Unicode: Identical-Looking Strings That Are Not Equal (tested). Guide: string.Template: $name_backup Greedily Eats Trailing Text (tested). Guide: secrets.SystemRandom.seed() Silently Does Nothing (tested). Guide: Python str.ljust() Misaligns CJK Text in Monospace Output (tested). Guide: Python str.isdigit() Is True But int() Still Raises ValueError (tested). Guide: string.capwords()'s sep Argument Disables Whitespace Splitting (tested). Guide: base64.b64decode() Silently Strips Invalid Characters by Default (tested). Guide: base64.b32decode() and b16decode() Reject Lowercase by Default (tested). Guide: base64.b32decode() vs b32hexdecode(): Wrong Variant Decodes Silently (tested). Guide: Zero-Width Characters Survive str.strip() in Python (tested). Guide: secrets.compare_digest() Is Not Constant-Time for Different-Length Inputs (tested). Guide: ipaddress.ip_address() Rejects Leading Zeros, socket.inet_aton() Silently Treats Them as Octal (tested). Guide: IPv4-Mapped IPv6 Addresses Bypass a Set-Based ipaddress Blocklist (tested). Guide: A uuid.UUID Object Is Not Equal to Its Own String Form (tested). Guide: uuid.uuid1() Leaks the Host's MAC Address and Exact Timestamp (tested). Guide: hashlib.shake_128/256 Require a Length Argument and Have No Fixed Size (tested). Guide: Python Enum: A Duplicate Value Becomes a Silent Alias (tested). Guide: enum.IntFlag Silently Accepts Undefined Bits, enum.Flag Raises (tested). Guide: An IPv6 Zone ID Breaks Equality and Set Membership in ipaddress (tested). Guide: dataclasses: Default Instances Are Unhashable by Default (tested). Guide: ipaddress: is_private and is_global Are Not Always Opposites (tested). Guide: dataclasses: compare=False Fields Still Show Up in repr() (tested). Guide: enum: auto() Gives Sequential Ints in Enum, Powers of 2 in Flag (tested). Guide: dataclasses: Mutable-Default Guard Only Covers list/dict/set (tested). Guide: dataclasses: order=True Crashes Only When an Early Field Ties (tested). Guide: hashlib: new() Is Case-Insensitive, Except for blake2b/blake2s (tested). Guide: dataclasses: InitVar Defaults Leave a Stale Class Attribute (tested). Guide: hmac: shake_128/shake_256 digestmod Raises 'no reason supplied' (tested). Guide: decimal: Context.prec Counts Significant Digits, Not Decimal Places (tested). Guide: decimal: quantize() Defaults to Round-Half-to-Even, Not Round-Half-Up (tested). Guide: decimal: Decimal(float) Bakes In Binary Floating-Point Imprecision (tested). Guide: decimal: NaN List Membership Depends on Object Identity, Not Value (tested). Guide: decimal: Mixing With float Raises on Arithmetic, Not on Comparison (tested). Guide: decimal: compare_total() Sorts NaN, Regular sorted() Raises (tested). Guide: decimal: Subtracting Equal Values Can Yield -0 Under ROUND_FLOOR (tested). Guide: decimal: Disabling Traps Reintroduces Infinity and NaN Silently (tested). Guide: decimal: as_tuple()'s exponent Is a String for NaN/Infinity (tested). Guide: decimal: Context.copy() Is Independent but Never Equal (tested). Guide: fractions: Two-Arg Constructor Rejects float/Decimal (tested). Guide: fractions: Fraction ** Fraction Always Returns float (tested). Guide: fractions: limit_denominator() Breaks Ties Toward Floor (tested). Guide: fractions: NaN and Infinity Raise Different Exception Types (tested). Guide: fractions: round() Without ndigits Returns int, Not Fraction (tested). Guide: fractions: String Constructor Rejects a Negative Denominator (tested). Guide: fractions and decimal: Compare Equal, Can't Add (tested). Guide: fractions: limit_denominator() Default Silently Approximates (tested). Guide: decimal and fractions: Constructor Support Only Goes One Way (tested). Guide: fractions: Whole-Number Fraction Still Can't Be Used as an Index (tested). Guide: statistics: mean() Can't Mix Decimal With Other Types (tested). Guide: statistics: harmonic_mean() Returns 0 If Any Value Is 0 (tested). Guide: statistics: NormalDist Subtraction Has the Same Spread as Addition (tested). Guide: statistics: quantiles() Can Extrapolate Past the Data's Range (tested). Guide: statistics: covariance() Stays Silent on Constant Input (tested). Guide: statistics: quantiles(method="inclusive") Still Avoids Min/Max (tested). Guide: statistics: fmean() Reintroduces Float Error on Decimal (tested). Guide: statistics: A Wrong xbar Silently Corrupts variance() (tested). Guide: statistics: stdev() Crashes on NaN, variance() Doesn't (tested). Guide: statistics: covariance() Always Returns float, Unlike variance() (tested). Guide: statistics: correlation() Crashes on Pure Decimal Input (tested). Guide: statistics: kde() Returns a Closure That Can't Be Pickled (tested). Guide: heapq.merge() Silently Returns Wrong Results on Unsorted Input (tested). Guide: struct: Native Format Padding Silently Breaks unpack() (tested). Guide: array: frombytes() Skips the Overflow Validation Every Other Entry Point Enforces (tested). Guide: bisect: key= Only Transforms the List, Never the Search Value (tested). Guide: bisect: hi < lo Silently Corrupts insort's Sort Order (tested). Guide: struct: unpack_from() Silently Ignores Trailing Bytes unpack() Rejects (tested). Guide: contextlib: closing() Masks the Real Error If close() Is Missing (tested). Guide: contextlib: ExitStack Silently Drops All But One Callback Error (tested). Guide: contextlib: redirect_stdout() Redirects Every Thread, Not Just Yours (tested). Guide: contextlib: suppress(GeneratorExit) Breaks Generator close() (tested). Guide: heapq: A Single NaN Silently Corrupts the Whole Heap Invariant (tested). Guide: shelve: Without writeback=True, a Mutation Vanishes in the Same Session (tested). Guide: weakref: WeakValueDictionary Iteration Silently Skips GC'd Entries (tested). Guide: weakref.finalize(obj, obj.method) Silently Keeps obj Alive Forever (tested). Guide: calendar.itermonthdates() Crashes on December 9999 -- Sibling Methods Don't (tested). Guide: functools.lru_cache Confuses 1 and True in Some Calls, Not Others (tested). Guide: functools.partial Objects With Identical Args Are Never Equal (tested). Guide: functools.lru_cache Treats Keyword Argument Order as Part of the Cache Key (tested). Guide: functools.cached_property Writes to a Frozen Dataclass's __dict__ Anyway (tested). Guide: functools.partialmethod Binds One Shared Mutable Object to Every Instance (tested). Guide: functools.singledispatchmethod Register on a Subclass Leaks Into the Base Class (tested). Guide: functools.cached_property Lost Its Thread-Safety Lock in Python 3.12 (tested). Guide: functools.wraps on a functools.partial Copies the Wrong __doc__/__module__ (tested). Guide: copy.deepcopy Copies a functools.cached_property's Stale Cached Value (tested). Guide: inspect.getmembers Silently Skips AttributeError but Crashes on Any Other Exception (tested). Guide: collections.abc .register() Makes isinstance Pass But Grants No Methods (tested). Guide: collections.abc.Sequence __iter__/in Loop Forever Without IndexError (tested). Guide: collections.abc.Set operators raise TypeError without _from_iterable override (tested). Guide: collections.abc.Hashable isinstance() Cache Goes Stale (Tested). Guide: collections.abc.Mapping __eq__ Requires Hashable Keys, Nothing Else Does (tested). Guide: io.TextIOWrapper Crashes on a Non-Blocking Raw Stream's None (tested). Guide: io.TextIOWrapper.detach() Leaves the Raw Stream Past Your Last Read (tested). Guide: io.TextIOWrapper.reconfigure() Mid-Write Encoding Switch Is Silent (tested). Guide: io.TextIOWrapper.reconfigure(errors=...) Mid-Write Silently Drops Characters (tested). Guide: io.TextIOWrapper tell()/seek() Cookie Arithmetic Silently Skips Characters (tested). Guide: io.BufferedWriter Infinite-Loops on write() Returning 0 (tested). Guide: io.BufferedReader.peek() Leaves .raw Mid-Read-Ahead (tested). Guide: with-Block close() Exception Masks the Original Error (tested). Guide: io.BufferedReader.read1() Turns a Non-Blocking None Into b'' (tested). Guide: shutil.copyfileobj() Treats None Like EOF (Tested). Guide: gzip/bz2/lzma Crash on a Non-Blocking None (Tested). Guide: tarfile/zipfile Crash on a Non-Blocking None (Tested). Guide: io.TextIOWrapper.readline() Silently Treats None as EOF (tested). Guide: ElementTree.parse() Crashes on a Non-Blocking None (tested). Guide: tomllib.load() Misdiagnoses a Non-Blocking None (tested). Guide: email.message_from_binary_file() Silently Returns Empty on None (tested). Guide: plistlib.load() Crashes on a Non-Blocking None (tested). Guide: http.client.HTTPResponse Mistakes None for RemoteDisconnected (tested). Guide: wave.open() Crashes on a Non-Blocking None (tested). Guide: smtplib.getreply() Mistakes None for SMTPServerDisconnected (tested). Guide: poplib._getline() Mistakes None for EOF (tested). Guide: json.load() Crashes on a Non-Blocking None (tested). Guide: base64.encode()/decode() Silently Return Empty Output on None (tested). Guide: csv.reader() Crashes with a Wrong Text-Mode Error on None (tested). Guide: configparser.read_file() Stringifies a None Line as Text (tested). Guide: quopri.decode() Crashes with a Raw binascii TypeError on None (tested). Guide: http.cookiejar's MozillaCookieJar Blames None on File Format (tested). Guide: codecs.StreamReader Crashes Concatenating None to Its Byte Buffer (tested). Guide: http.server Silently Drops a Valid Request on a Transient None (tested). Guide: http.client.HTTPResponse.read() Permanently Closes the Connection on None (tested). Guide: xmlrpc.client ExpatError "no element found" on a Valid Response (tested). Guide: http.client resp.read() on a Transient None: 3 Different Failures (tested). Guide: IncompleteRead and "Connection broken: IncompleteRead" in Python (tested). Guide: python -m http.server with CORS (tested). Guide: Python configparser Case Sensitive Keys: optionxform (tested). Guide: ExpatError / ParseError: no element found: line 1, column 0 (tested). Guide: JSONDecodeError: Expecting value: line 1 column 1 (char 0) in Python (tested). Guide: Python urllib HTTP Error 403: Forbidden (User-Agent, tested). Guide: Python [SSL: WRONG_VERSION_NUMBER] wrong version number (tested). Guide: BadZipFile: File is not a zip file in Python (tested). Guide: _csv.Error: line contains NUL (tested on Python 3.13). Guide: ValueError: time data does not match format (strptime, tested). Guide: TypeError: unhashable type: 'list' (tested fixes). Guide: RuntimeError: Event loop is closed (asyncio, tested). Guide: ConnectionRefusedError: [Errno 111] Connection refused (tested). Guide: SSL: CERTIFICATE_VERIFY_FAILED in Python (tested). Guide: ValueError: math domain error (tested). Guide: ValueError: substring not found (tested). Guide: TypeError: 'int' / 'NoneType' object is not iterable (tested). Guide: ImportError: cannot import name (circular import, tested). Guide: PermissionError: [Errno 13] Permission denied (tested). Guide: FileNotFoundError: [Errno 2] No such file or directory (tested). Guide: AttributeError: can't set attribute / property has no setter (tested). Guide: binascii.Error: Incorrect padding (base64, tested). Guide: ImportError: attempted relative import with no known parent package (tested). Guide: struct.error: unpack requires a buffer of N bytes (tested). Guide: multiprocessing: Can't pickle local object (tested). Guide: OverflowError: math range error (tested). Guide: __getattr__ RecursionError: maximum recursion depth exceeded (tested). Guide: SyntaxError: 'await' outside function (tested). Guide: SyntaxError: 'return' outside function / 'break' outside loop (tested). Guide: SyntaxError: invalid decimal literal / unterminated string literal (tested). Guide: shutil.rmtree PermissionError: [Errno 13] (tested). Guide: UnboundLocalError: cannot access local variable (tested). Guide: NameError: name is not defined (tested). Guide: EOFError: Ran out of input / EOF when reading a line (tested). Guide: BrokenPipeError: [Errno 32] Broken pipe (tested). Guide: UnicodeEncodeError: 'charmap' codec can't encode character (tested). Guide: FileExistsError: [Errno 17] File exists (tested). Guide: IsADirectoryError: [Errno 21] Is a directory (tested). Guide: RuntimeError: generator raised StopIteration (tested). Guide: TypeError: 'module'/'int'/'str' object is not callable (tested). Guide: TypeError: got multiple values for argument (tested). Guide: IndexError: pop from empty list (tested). Guide: LookupError: unknown encoding (tested). Guide: IndexError: no such group (Python re, tested). Guide: ValueError: too many values to unpack (tested). Guide: ValueError: invalid literal for int() with base 10 (tested). Guide: TypeError: missing 1 required positional argument (tested). Guide: TypeError: can't compare offset-naive and offset-aware datetimes (tested). Guide: Python AssertionError and assert not working with -O (tested). Guide: NotImplementedError vs NotImplemented in Python (tested). Guide: KeyboardInterrupt / Ctrl+C not working in Python (tested). Guide: asyncio TimeoutError and CancelledError (tested). Guide: requests ReadTimeout: Read timed out (tested). Guide: sqlite3.OperationalError: near X: syntax error (tested). Guide: Python logging not printing to console or file (tested). Guide: logging TypeError: not all arguments converted (tested). Guide: python venv: ensurepip is not available (tested). Guide: argparse: unrecognized arguments / arguments are required (tested). Guide: ImportError: bad magic number (tested). Guide: ImportError: cannot import name (unknown location) (tested). Guide: OSError: [Errno 9] Bad file descriptor (tested). Guide: configparser.NoSectionError: No section (tested). Guide: Python import from another directory: No module named (tested). Guide: Python sqlite3 error handling: exceptions and error codes (tested). Guide: Python OSError errno codes list (tested). Guide: Python argparse custom error message (tested). Guide: Python requests: get the HTTP error response message (tested). Guide: shutil copy/move PermissionError: [Errno 13] (tested). Guide: Python pickle error: cannot pickle object (tested). Guide: TypeError: 'module' object is not callable (tested). Guide: AttributeError: module has no attribute (tested). Guide: decimal.InvalidOperation ConversionSyntax (tested). Guide: urllib.error.URLError: urlopen error (tested). Guide: NoneType object cannot be interpreted as an integer (tested). Guide: Python MemoryError reading a large file (tested). Guide: BlockingIOError [Errno 11] Resource temporarily unavailable (tested). Guide: OSError [Errno 22] Invalid argument (tested). Guide: Python print error message and traceback in except (tested). Guide: Python f-string errors: unmatched '[' and format errors (tested). Guide: Python queue.Empty exception (tested). Guide: ValueError: signal only works in main thread (tested). Guide: Python threading exception handling (tested). Guide: Python enum ValueError: is not a valid (tested). Guide: Python pathlib mkdir exceptions (tested). Guide: tarfile.ReadError: file could not be opened successfully (tested). Guide: zipfile BadZipFile: Bad CRC-32 for file (tested). Guide: Python smtplib exceptions: which error for which failure (tested). Guide: xml.etree ParseError in Python: every message explained (tested). Guide: zlib.error Error -3 incorrect header check (tested). Guide: ssl.SSLError: [SSL] PEM lib in Python (tested). Guide: os.remove errors and deleting a file without an error (tested). Guide: Send an email on error in Python with SMTPHandler (tested). Guide: http.client timeout in Python: defaults and per-read limits (tested). Guide: Python socket error handling: every exception and errno (tested). Guide: Python shutil error handling: copy, move, copytree, rmtree (tested). Guide: Python JSON error handling: every JSONDecodeError message (tested). Guide: AttributeError: module 'datetime' has no attribute 'now' (tested fix). Guide: AttributeError: 'str' object has no attribute 'decode' (tested fix). Guide: module 'collections' has no attribute 'Mapping' / 'Callable' (tested fix). Guide: AttributeError: module 'time' has no attribute 'clock' (tested fix). Guide: AttributeError: 'dict' object has no attribute 'iteritems' (tested fix). Guide: RuntimeError: dictionary changed size during iteration (tested fixes). Guide: AttributeError: 'str' object has no attribute 'read' (tested fix). Guide: AttributeError: 'list' object has no attribute 'split' (tested fix). Guide: TypeError: 'str' / 'tuple' object does not support item assignment (tested fix). Guide: AttributeError: 'dict' / 'str' object has no attribute 'append' (tested fix). Guide: TypeError: 'float' object cannot be interpreted as an integer (tested fix). Guide: TypeError: can only concatenate str (not "int") to str (tested fix). Guide: TypeError: unsupported operand type(s) (tested fix). Guide: TypeError: sequence item 0: expected str instance, int found (tested fix). Guide: TypeError: can't multiply sequence by non-int of type 'float' (tested fix). Guide: TypeError: slice indices must be integers or None (tested fix). Guide: TypeError: list indices must be integers or slices, not str (tested fix). Guide: TypeError: string indices must be integers (tested fix). Guide: TypeError: 'dict_keys' object is not subscriptable (tested fix). Guide: ValueError: list.remove(x): x not in list (tested fix). Guide: TypeError: takes 1 positional argument but 2 were given (tested fix). Guide: TypeError: got an unexpected keyword argument (tested fix). Guide: TypeError: '<' not supported between instances of 'str' and 'int' (tested fix). Guide: TypeError: object of type 'int' has no len() (tested fix). Guide: ValueError: could not convert string to float (tested fix). Guide: TypeError: a bytes-like object is required, not 'str' (tested fix). Guide: ValueError: I/O operation on closed file (tested fix). Guide: TypeError: 'str' object cannot be interpreted as an integer (tested fix). Guide: AttributeError: 'int' object has no attribute (tested fix). Guide: TypeError: 'type' object is not subscriptable (tested fix). Guide: TypeError: 'tuple' object is not callable (tested fix). Guide: TypeError: cannot unpack non-iterable object (tested fix). Guide: TypeError: 'list' object is not an iterator (tested fix). Guide: TypeError: 'str' object is not a mapping (tested fix). Guide: TypeError: 'method' object is not subscriptable (tested fix). Guide: TypeError: missing 1 required positional argument: 'self' (tested fix). Guide: NameError: name '__file__' is not defined (tested fix). Guide: OSError: [Errno 29] Illegal seek (tested fix). Guide: OSError: [Errno 5] Input/output error (tested fix). Guide: NameError: name 'np' is not defined (tested fix). Guide: ImportError: cannot import name 'UTC' from 'datetime' (tested fix). Guide: ImportError: cannot import name 'StrEnum' from 'enum' (tested fix). Guide: OSError: [Errno 101] Network is unreachable in Python (tested fix). Guide: OSError: [Errno 18] Invalid cross-device link in Python (tested fix). Guide: TypeError: can't compare datetime.datetime to datetime.date (tested fix). Guide: ModuleNotFoundError: No module named 'distutils' (tested fix). Guide: ModuleNotFoundError: No module named 'pkg_resources' (tested fix). Guide: ModuleNotFoundError: No module named 'dotenv' (tested fix). Guide: ModuleNotFoundError: No module named 'yaml' (tested fix). Guide: TypeError: unhashable type: 'dict' (tested fix). Guide: ModuleNotFoundError: No module named 'requests' (tested fix). Guide: UnicodeDecodeError: invalid start byte (tested fix). Guide: TypeError: expected string or bytes-like object (tested fix). Guide: ModuleNotFoundError: No module named 'Crypto' (tested fix). Guide: KeyError: 0 in Python and pandas (tested fix). Guide: TypeError: unhashable type: 'slice' (tested fix). Guide: TypeError: can only join an iterable (tested fix). Guide: TypeError: unhashable type: 'set' (tested fix). Guide: pandas SettingWithCopyWarning (tested on pandas 2 and 3). Guide: pandas KeyError but the column exists (tested). Guide: pandas Error tokenizing data: Expected N fields (tested). Guide: pandas KeyError: not in index / None of [Index] (tested). Guide: pandas FutureWarning: concatenation with empty or all-NA entries (tested). Guide: pandas to_datetime errors='ignore' deprecated (tested). Guide: pandas FutureWarning: Downcasting object dtype arrays on .fillna (tested). Guide: pandas groupby FutureWarning: apply on grouping columns, observed=False (tested). Guide: pandas merge KeyError, int64 vs object, and rows not matching (tested). Guide: pandas IndexError: single positional indexer is out-of-bounds (tested). Guide: pandas TypeError: unhashable type: 'Series' / 'numpy.ndarray' (tested). Guide: pandas PerformanceWarning: DataFrame is highly fragmented (tested). Guide: pandas read_excel: Missing optional dependency 'openpyxl' (tested). Guide: JSONDecodeError: Expecting ',' delimiter (tested). Guide: requests.exceptions.SSLError: HTTPSConnectionPool Max retries exceeded (tested). Guide: Python requests exceptions: full list and error handling (tested). Guide: OSError: [Errno 113] No route to host in Python (tested). Guide: OSError: [Errno 16] Device or resource busy in Python (tested). Guide: OSError: [Errno 98] Address already in use in Python (tested). Guide: ConnectionResetError: [Errno 104] Connection reset by peer (tested). Guide: TimeoutError: [Errno 110] Connection timed out in Python (tested). Guide: Flask jinja2.exceptions.TemplateNotFound (tested). Guide: SQLAlchemy StaleDataError: expected to update 1 row(s); 0 were matched (tested). Guide: FastAPI 422 Unprocessable Entity (tested). Guide: uvicorn Error loading ASGI app: Could not import module (tested). Guide: pydantic BaseSettings has been moved to pydantic-settings (tested). Guide: Flask: Could not locate a Flask application (tested). Guide: pydantic: Extra inputs are not permitted (tested). Guide: FastAPI CORS error on localhost (tested). Guide: FastAPI 405 Method Not Allowed (tested). Guide: Pydantic Field required [type=missing] (tested). Guide: FastAPI / uvicorn Exception in ASGI application (tested). Guide: Flask CORS error on localhost (tested). Guide: asyncio Task exception was never retrieved (tested). Guide: boto3 Unable to locate credentials / You must specify a region (tested). Guide: boto3 ClientError error codes and handling (tested). Guide: aiohttp Unclosed client session (tested). Guide: Django TemplateDoesNotExist (tested). Guide: Django NoReverseMatch (tested). Guide: Django settings are not configured (tested). Guide: Django matching query does not exist (tested). Guide: Django CSRF verification failed (tested). Guide: Django CORS error on localhost (tested). Guide: Django Error: That port is already in use (tested). Guide: Django 400 Bad Request with DEBUG=False (tested). Guide: Django admin 'Please correct the error below' (tested). Guide: Django form errors not showing in template (tested). Guide: Django RuntimeError: populate() isn't reentrant (tested). Guide: Django 500 error with DEBUG=False (tested). Guide: Celery Error 111 Connection refused (tested). Guide: Celery MaxRetriesExceededError (tested). Guide: Celery link_error errback example (tested). Guide: Selenium ElementNotInteractableException (tested). Guide: Selenium ElementClickInterceptedException (tested). Guide: Selenium StaleElementReferenceException (tested). Guide: Selenium Unable to obtain driver for chrome (tested). Guide: Selenium TimeoutException: Message: (tested). Guide: Selenium NoSuchElementException (tested). Guide: pip error: externally-managed-environment (tested). Guide: This version of ChromeDriver only supports Chrome version (tested). Guide: Selenium invalid session id (tested). Guide: pytest ERROR collecting: ModuleNotFoundError (tested). Guide: pytest error vs failure, ERROR at setup/teardown (tested). Guide: pytest Failed: DID NOT RAISE (tested). Guide: pytest: async def functions are not natively supported (tested). Guide: pytest exit codes 0-6 (tested). Guide: pytest fixture not found (tested). Guide: pytest parametrize: function uses no argument (tested). Guide: pytest filterwarnings error: fail on warnings (tested). Guide: pytest rerun only failed tests: --lf, --ff, -x, --sw (tested). Guide: pytest using the wrong Python / virtualenv (tested). Guide: pytest ImportError: Error importing plugin (tested). Guide: pytest.fail with message vs assert vs xfail (tested). Guide: pytest ScopeMismatch: function scoped fixture (tested). Guide: pytest caplog: assert a logger error was logged (tested). Guide: pytest mock.patch not working (tested fixes). Guide: Celery chord error handling (tested with a real worker). Guide: Celery WorkerLostError: Worker exited prematurely (tested). Guide: Celery task timeout: time_limit and soft_time_limit (tested). Guide: Celery: Received unregistered task of type (KeyError) (tested). Guide: celery beat vs celery worker (tested). Guide: Celery task stuck in PENDING: queue routing (tested). Guide: pytest error: argument -k: expected one argument (tested). Guide: Celery chain error handling (tested with a real worker). Guide: Celery logging configuration (tested with a real worker). Guide: Celery Error: No such command 'flower' (tested fix). Guide: pytest.raises: get and check the error message (tested). Guide: pytest fail fast: stop on first failure (-x, --maxfail, --ff, --sw). Guide: pytest parametrize: expect an error in some cases (tested). Guide: pytest: fail but continue checking (built-in subtests, tested). Guide: Celery Redis SSL: rediss:// URL must have parameter ssl_cert_reqs (tested). Guide: httpx follow redirects: why you get a 302 and how to fix it (tested). Guide: httpx timeout: the 5 s default, ReadTimeout, PoolTimeout and fixes (tested). Guide: httpx ConnectError: SSL CERTIFICATE_VERIFY_FAILED fix (tested). Guide: httpx vs requests: the default differences that break ported code (tested). Guide: httpx proxy: unexpected keyword argument 'proxies' fix (tested). Guide: httpx retry: what HTTPTransport(retries=) does and doesn't retry (tested). Guide: httpx RemoteProtocolError: Server disconnected without sending a response (tested). Guide: httpx streaming response: stream(), iter_bytes, ResponseNotRead (tested). Guide: httpx params: query parameters, lists, client params (tested). Guide: httpx post json vs data vs content (tested). Guide: httpx headers: request, client default and response headers (tested). Guide: httpx auth: Basic, Bearer token and refresh on 401 (tested). Guide: httpx AsyncClient connection pool and Limits (tested). Guide: httpx raise_for_status and HTTPStatusError status code (tested). Guide: httpx cookies: client cookies, set cookies, CookieConflict (tested). Guide: httpx upload file: post files as multipart/form-data (tested). Guide: httpx download file: stream to disk in chunks (tested). Guide: httpx mock: MockTransport for tests (tested). Guide: httpx logging: disable INFO lines, enable debug (tested). Guide: httpx HTTP/2: enable http2=True (tested). Guide: httpx base_url: how Client joins paths (tested). Guide: httpx verify=False not working: 4 causes (tested). Guide: httpx JSON decode error: response.json() fails (tested). Guide: httpx websocket client: httpx-ws (tested). Guide: httpx AsyncClient RuntimeError: Event loop is closed (tested). Guide: uv pip install vs uv add: what each does (tested). Guide: uv ignore SSL errors: invalid peer certificate UnknownIssuer (tested). Guide: Poetry ignore SSL errors: certificate verify failed (tested). Guide: Poetry Authorization error accessing private repository (tested). Guide: Python 3.13: CA cert does not include key usage extension (tested). Guide: uv pip compile: requirements.in to requirements.txt (tested). Guide: uv pip install -r requirements.txt: venv, errors, upgrade (tested). Guide: Poetry: All attempts to connect failed (3 causes, tested). Guide: pyinstaller: error: unrecognized arguments (tested causes). Guide: Poetry error: externally-managed-environment (tested fix). Guide: gunicorn CRITICAL WORKER TIMEOUT (tested). Guide: gunicorn logs: where they go, access log, error log (tested). Guide: Content-Type charset=utf-8 (tested). Guide: Location header: relative vs absolute URLs (tested). Guide: TypeError: object is not subscriptable (tested). Guide: re.error: nothing to repeat (tested). Guide: Vite dependency-optimization crash (tested).

Frequently asked questions

Is PlainHeaders a ModHeader alternative?

Yes. ModHeader was removed from the Chrome Web Store in July 2026. PlainHeaders covers the core job — setting, appending and removing request and response headers with switchable profiles — and can import a ModHeader JSON export, so you can bring your existing profiles over.

Can I import my ModHeader profiles?

Yes. Export your profiles from ModHeader as JSON, then use Import in PlainHeaders. PlainHeaders backups use the same import button.

Why does it ask for access per site?

Chrome only applies header changes on sites an extension can access. Instead of asking for every site at install time, PlainHeaders requests access only for the sites you enable.

Is there a limit on the number of headers?

No. The free version has no header limit.

Does it collect any data?

No. There are no analytics and no remote code. The only planned network call is the license check for the optional Pro upgrade (via ExtensionPay).