HTTP Headers - sgml/signature GitHub Wiki

ETag

etag_support_matrix:
  CouchDB:
    supports_etag: true
    notes: |
      CouchDB supports ETag and If-None-Match headers for documents and attachments.
      ETag support for views is more nuanced—while ETags are generated, conditional
      GETs may not always yield 304 responses due to clustering and view update mechanics.

  PouchDB:
    supports_etag: true
    notes: |
      PouchDB, as a CouchDB-compatible client-side database, supports ETag and
      If-None-Match headers when syncing with remote CouchDB instances.
      It uses these headers to optimize replication and avoid redundant data transfers.

  Laravel:
    supports_etag: true
    notes: |
      Native support via middleware is limited, but packages like `werk365/etagconditionals`
      provide full ETag and If-None-Match handling for APIs.

  Symfony:
    supports_etag: true
    notes: |
      Symfony HTTPFoundation includes support for ETag and conditional responses.
      Controllers can use `$response->setEtag()` and `$request->isNotModified()`.

  Werkzeug:
    supports_etag: true
    notes: |
      Werkzeug includes built-in support for ETag via `Response.set_etag()` and
      conditional handling with `Request.if_none_match`. Commonly used in Flask.

  Rack:
    supports_etag: true
    notes: |
      Rack::ETag middleware automatically sets ETag headers.
      Conditional GETs using If-None-Match are handled by default.

  HTTP::Tiny:
    supports_etag: partial
    notes: |
      HTTP::Tiny is a minimalist HTTP client in Perl’s core. It allows setting and reading
      ETag and If-None-Match headers manually. While it doesn’t manage caching automatically,
      it’s well-suited for scripting conditional requests.

  requests:
    supports_etag: partial
    notes: |
      Python’s requests library allows manual use of If-None-Match and reads ETag headers.
      It does not handle caching or conditional logic automatically—you must manage headers
      and 304 responses explicitly in your code.

  HTTPD (Apache):
    supports_etag: true
    notes: |
      Apache HTTP Server supports ETag headers via `FileETag` directive.
      Conditional requests are handled automatically.

  Nginx:
    supports_etag: true
    notes: |
      Nginx supports ETag headers for static files by default.
      For dynamic content, ETag must be manually set by upstream applications or via modules.

etag_security_notes:
  known_cves:
    - CVE-2003-1418: |
        Apache HTTPD ETag header may expose inode information, which can be used
        to infer file system structure or assist in fingerprinting attacks.
  guidance:
    - Avoid including inode or device metadata in ETag values.
    - Use `FileETag MTime Size` in Apache to mitigate exposure.
    - Be cautious of ETag-based tracking mechanisms in privacy-sensitive applications.

References