)]}'
{
  "commit": "1844aacc837bf81cb1959fa65f2e52dcc70a0cae",
  "tree": "8ad8156c38473e608269251518c125a8cb0bda5d",
  "parents": [
    "85eb961bf9afd61385430f8837485ba69cc0cc11"
  ],
  "author": {
    "name": "Michael Brown",
    "email": "mcb30@ipxe.org",
    "time": "Thu Nov 11 23:31:23 2021 +0000"
  },
  "committer": {
    "name": "Michael Brown",
    "email": "mcb30@ipxe.org",
    "time": "Fri Nov 12 09:58:29 2021 +0000"
  },
  "message": "[uri] Retain original encodings for path, query, and fragment fields\n\niPXE decodes any percent-encoded characters during the URI parsing\nstage, thereby allowing protocol implementations to consume the raw\nfield values directly without further decoding.\n\nWhen reconstructing a URI string for use in an HTTP request line, the\npercent-encoding is currently reapplied in a reversible way: we\nguarantee that our reconstructed URI string could be decoded to give\nthe same raw field values.\n\nThis technically violates RFC3986, which states that \"URIs that differ\nin the replacement of a reserved character with its corresponding\npercent-encoded octet are not equivalent\".  Experiments show that\nseveral HTTP server applications will attach meaning to the choice of\nwhether or not a particular character was percent-encoded, even when\nthe percent-encoding is unnecessary from the perspective of parsing\nthe URI into its component fields.\n\nFix by storing the originally encoded substrings for the path, query,\nand fragment fields and using these original encoded versions when\nreconstructing a URI string.  The path field is also stored as a\ndecoded string, for use by protocols such as TFTP that communicate\nusing raw strings rather than URI-encoded strings.  All other fields\n(such as the username and password) continue to be stored only in\ntheir decoded versions since nothing ever needs to know the originally\nencoded versions of these fields.\n\nSigned-off-by: Michael Brown \u003cmcb30@ipxe.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "e9e512ab4a671ead19f9ff14aa1b4d4b9b23472d",
      "old_mode": 33188,
      "old_path": "src/core/uri.c",
      "new_id": "a0f79e9ec11e1fda13774df3f45e3990901389e6",
      "new_mode": 33188,
      "new_path": "src/core/uri.c"
    },
    {
      "type": "modify",
      "old_id": "3879a0e730e5050b5f43a4fa22dcc141de68bae6",
      "old_mode": 33188,
      "old_path": "src/include/ipxe/uri.h",
      "new_id": "e5b7c8616b44ca51bc6bfd23693fb95f1e22c5d3",
      "new_mode": 33188,
      "new_path": "src/include/ipxe/uri.h"
    },
    {
      "type": "modify",
      "old_id": "01bb496b214dc450602475bd85205d19e2b81083",
      "old_mode": 33188,
      "old_path": "src/net/tcp/httpcore.c",
      "new_id": "fd94b5f083e2ba19158e2f665138c4e99292ba19",
      "new_mode": 33188,
      "new_path": "src/net/tcp/httpcore.c"
    },
    {
      "type": "modify",
      "old_id": "92c2f903719766e45a4d04364822233d6cb8104b",
      "old_mode": 33188,
      "old_path": "src/tests/uri_test.c",
      "new_id": "929ab3632502e0f722dc496b0049c835af492f3e",
      "new_mode": 33188,
      "new_path": "src/tests/uri_test.c"
    },
    {
      "type": "modify",
      "old_id": "f8d149153adee531c9b6206e32114212c2cce9b0",
      "old_mode": 33188,
      "old_path": "src/usr/imgmgmt.c",
      "new_id": "b7fc8293d41466419cf95700faee099a6e00e0fb",
      "new_mode": 33188,
      "new_path": "src/usr/imgmgmt.c"
    }
  ]
}
