)]}'
{
  "commit": "9917bea3cebad5af589e1ec7b8e28bab5c95414d",
  "tree": "15f86d966c6fff160cec539fd022e7586208234e",
  "parents": [
    "26de78d42bc29bd6de7511c6244b17d4a7f36724"
  ],
  "author": {
    "name": "apaseltiner",
    "email": "apaseltiner@google.com",
    "time": "Wed Nov 11 11:56:01 2026 -0800"
  },
  "committer": {
    "name": "Copybara-Service",
    "email": "copybara-worker@google.com",
    "time": "Wed Nov 11 11:57:29 2026 -0800"
  },
  "message": "Add `Dictionary(Dictionary::unique_keys, std::vector\u003cDictionaryMember\u003e)` constructor and deprecate the untagged vector constructor.\n\nPreviously, `Dictionary(std::vector\u003cDictionaryMember\u003e)` accepted a vector without checking or deduplicating keys, allowing callers to accidentally violate `Dictionary`\u0027s unique-keys invariant (where key-based accessors return the first entry for a duplicate key while `SerializeDictionary()` emits all entries, resolving to the last entry upon re-parsing per RFC 8941 Section 4.2.2).\n\nIntroduce a tagged `Dictionary(Dictionary::unique_keys, std::vector\u003cDictionaryMember\u003e)` constructor (modeled after `Item`\u0027s tag constructors and `base::sorted_unique`) that makes the unique-keys precondition explicit at call sites and enforces it with a `QUICHE_DCHECK`. Mark the existing untagged `Dictionary(std::vector\u003cDictionaryMember\u003e)` constructor as deprecated in favor of `Dictionary::unique_keys` (when keys are guaranteed unique) or `operator[](absl::string_view)` (otherwise), and migrate `StructuredHeaderParser::ReadDictionary()` and `webtransport::SerializeInitHeader()` to the tagged constructor.\n\nPiperOrigin-RevId: 1019378991\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "fe95910283720152708bad84fdb55bc0c635ea16",
      "old_mode": 33188,
      "old_path": "quiche/common/structured_headers.cc",
      "new_id": "23f99c39643713fa9ac609b271c56cecb85654ab",
      "new_mode": 33188,
      "new_path": "quiche/common/structured_headers.cc"
    },
    {
      "type": "modify",
      "old_id": "42af3a05db6948145baa68cf585de44f4cd7eb7d",
      "old_mode": 33188,
      "old_path": "quiche/common/structured_headers.h",
      "new_id": "33464e0e5f8c5895b0dc2ba77816b210443b4857",
      "new_mode": 33188,
      "new_path": "quiche/common/structured_headers.h"
    },
    {
      "type": "modify",
      "old_id": "37ed6579f91163761851a5bd4edf9ca303112d37",
      "old_mode": 33188,
      "old_path": "quiche/common/structured_headers_test.cc",
      "new_id": "9dc4cf8b97d179f17be34f47f9f8020f99fe42bf",
      "new_mode": 33188,
      "new_path": "quiche/common/structured_headers_test.cc"
    },
    {
      "type": "modify",
      "old_id": "4fa6b2aeddae47ee51a78b344d8716d2f34b6246",
      "old_mode": 33188,
      "old_path": "quiche/web_transport/web_transport_headers.cc",
      "new_id": "a647481bfd092e8d4aa5012f57c74b8438b97548",
      "new_mode": 33188,
      "new_path": "quiche/web_transport/web_transport_headers.cc"
    }
  ]
}
