)]}'
{"swift/common/middleware/copy.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e3ac632a03b7a34a04e383a22190d26f5a6aa06","unresolved":false,"context_lines":[{"line_number":405,"context_line":"            # since we\u0027re not copying the source etag, make sure that any"},{"line_number":406,"context_line":"            # container update override values are not copied."},{"line_number":407,"context_line":"            remove_items(sink_req.headers, lambda k: k.startswith("},{"line_number":408,"context_line":"                \u0027X-Object-Sysmeta-Container-Update-Override-\u0027))"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"        # We no longer need these headers"},{"line_number":411,"context_line":"        sink_req.headers.pop(\u0027X-Copy-From\u0027, None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_3592254d","side":"PARENT","line":408,"range":{"start_line":408,"start_character":59,"end_line":408,"end_character":60},"updated":"2019-08-09 17:00:17.000000000","message":"Check! The constant includes the dash :-)","commit_id":"8d3d21e66846979d3bb4fbac136251da88f22310"}],"swift/common/request_helpers.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e3ac632a03b7a34a04e383a22190d26f5a6aa06","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    :returns: the full header key"},{"line_number":271,"context_line":"    \"\"\""},{"line_number":272,"context_line":"    header \u003d \u0027%s%s\u0027 % (OBJECT_SYSMETA_CONTAINER_UPDATE_OVERRIDE_PREFIX, key)"},{"line_number":273,"context_line":"    return header.title()"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_15884920","line":273,"updated":"2019-08-09 17:00:17.000000000","message":"It\u0027s interesting that this does title() while get_object_transient_sysmeta doesn\u0027t...\n\nFortunately all of the update headers should be ASCII, so I don\u0027t *think* https://review.opendev.org/#/c/664438/ should be a concern?","commit_id":"996aa4547f5248c49e47478f186f3104e1c6c5da"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6688cda79eef69f0ce334373272185a8aec91c3d","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    :returns: the full header key"},{"line_number":271,"context_line":"    \"\"\""},{"line_number":272,"context_line":"    header \u003d \u0027%s%s\u0027 % (OBJECT_SYSMETA_CONTAINER_UPDATE_OVERRIDE_PREFIX, key)"},{"line_number":273,"context_line":"    return header.title()"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_b81ccc13","line":273,"in_reply_to":"7faddb67_15884920","updated":"2019-08-09 17:38:45.000000000","message":"the test fall out was less doing the title than w/o - i don\u0027t really understand the concern with bytes/strings :\u0027(\n\nBut if you\u0027re happy I\u0027m happy!","commit_id":"996aa4547f5248c49e47478f186f3104e1c6c5da"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"5452a7718ed3988c1881a0e36d78c2c0fb7dabf3","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    :returns: the full header key"},{"line_number":271,"context_line":"    \"\"\""},{"line_number":272,"context_line":"    header \u003d \u0027%s%s\u0027 % (OBJECT_SYSMETA_CONTAINER_UPDATE_OVERRIDE_PREFIX, key)"},{"line_number":273,"context_line":"    return header.title()"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_32b457f2","line":273,"in_reply_to":"7faddb67_435a6b83","updated":"2019-08-13 01:14:12.000000000","message":"Welcome to the wonderful world of Py3 strings :P ..esp when it comes to wsgi.","commit_id":"996aa4547f5248c49e47478f186f3104e1c6c5da"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"fc89aeafec2b1e55b711750f322a1f858d0c8186","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    :returns: the full header key"},{"line_number":271,"context_line":"    \"\"\""},{"line_number":272,"context_line":"    header \u003d \u0027%s%s\u0027 % (OBJECT_SYSMETA_CONTAINER_UPDATE_OVERRIDE_PREFIX, key)"},{"line_number":273,"context_line":"    return header.title()"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_435a6b83","line":273,"in_reply_to":"7faddb67_8948a02e","updated":"2019-08-12 18:34:29.000000000","message":"ok, I understand why *this* code is fine then at least","commit_id":"996aa4547f5248c49e47478f186f3104e1c6c5da"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9cfa1a6aeaf9ce71c52c4e4b9d65502ff1e05a4","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    :returns: the full header key"},{"line_number":271,"context_line":"    \"\"\""},{"line_number":272,"context_line":"    header \u003d \u0027%s%s\u0027 % (OBJECT_SYSMETA_CONTAINER_UPDATE_OVERRIDE_PREFIX, key)"},{"line_number":273,"context_line":"    return header.title()"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_8948a02e","line":273,"in_reply_to":"7faddb67_b81ccc13","updated":"2019-08-09 21:44:08.000000000","message":"\u003e i don\u0027t really understand the concern with bytes/strings :\u0027(\n\n.upper(), .lower(), and .title() behave very differently for unicode vs bytes, and it all gets worse with bytes-masquerading-as-unicode on py3:\n\n Python 3.7.4 (default, Jul  9 2019, 16:32:37) \n [GCC 9.1.1 20190503 (Red Hat 9.1.1-1)] on linux\n Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n \u003e\u003e\u003e \u0027\\xdf\u0027.lower()\n \u0027ß\u0027\n \u003e\u003e\u003e \u0027\\xdf\u0027.lower() \u003d\u003d \u0027\\xdf\u0027\n True\n \u003e\u003e\u003e \u0027\\xdf\u0027.upper()\n \u0027SS\u0027\n \u003e\u003e\u003e \u0027\\xdf\u0027.encode(\u0027utf8\u0027).decode(\u0027latin1\u0027)\n \u0027Ã\\x9f\u0027\n \u003e\u003e\u003e \u0027\\xdf\u0027.encode(\u0027utf8\u0027).decode(\u0027latin1\u0027).lower()\n \u0027ã\\x9f\u0027\n \u003e\u003e\u003e \u0027\\xdf\u0027.encode(\u0027utf8\u0027).decode(\u0027latin1\u0027).lower().encode(\u0027latin1\u0027).decode(\u0027utf8\u0027)\n Traceback (most recent call last):\n   File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n UnicodeDecodeError: \u0027utf-8\u0027 codec can\u0027t decode bytes in position 0-1: unexpected end of data\n\nMeanwhile,\n\n Python 2.7.16 (default, Apr 30 2019, 15:54:43) \n [GCC 9.0.1 20190312 (Red Hat 9.0.1-0.10)] on linux2\n Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n \u003e\u003e\u003e \u0027\\xdf\u0027 \u003d\u003d \u0027\\xdf\u0027.upper() \u003d\u003d \u0027\\xdf\u0027.lower()\n True\n\nTL;DR: when thinking about case-insensitive headers, we assume the range a-z is equivalent to A-Z, and there are no other equivalencies. Our normal tricks for dealing with it on py2 (str.upper, str.lower, str.title) don\u0027t map real cleanly to py3; they only work the way we want when\n\n- we\u0027ve got bytes, or\n- we already *know* everything\u0027s ASCII.","commit_id":"996aa4547f5248c49e47478f186f3104e1c6c5da"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e70254f1084f06a8a9c0086fae9963c12b04b112","unresolved":false,"context_lines":[{"line_number":1967,"context_line":"        \u0027X-Object-Sysmeta-EC-Content-Length\u0027:"},{"line_number":1968,"context_line":"        str(bytes_transferred_from_client),"},{"line_number":1969,"context_line":"        # older style x-backend-container-update-override-* headers are used"},{"line_number":1970,"context_line":"        # here (in addition to x-object-sysmeta-container-update-override-*"},{"line_number":1971,"context_line":"        # headers) for backwards compatibility: the request may be to an object"},{"line_number":1972,"context_line":"        # server that has not yet been upgraded to accept the newer style"},{"line_number":1973,"context_line":"        # x-object-sysmeta-container-update-override- headers."}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_e4d392d4","line":1970,"updated":"2019-08-08 19:30:34.000000000","message":"Hmm... how\u0027s this interact with middleware wanting to set an override?\n\nI need to double check the precedence for\n\n- X-Object-Sysmeta-EC-Etag in headers\n- X-Backend-Container-Update-Override-Etag in headers\n- X-Object-Sysmeta-Container-Update-Override-Etag in headers\n- X-Object-Sysmeta-EC-Etag in footers\n- X-Backend-Container-Update-Override-Etag in footers\n- X-Object-Sysmeta-Container-Update-Override-Etag in footers\n\nbut I *think* setting this here in footers might mean that middlewares that set it in headers will get overridden?","commit_id":"71e145e1d6815683f328c1a136b6ca69080e9726"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"51275cf2ae01716b92d06167d337220944e64df4","unresolved":false,"context_lines":[{"line_number":1967,"context_line":"        \u0027X-Object-Sysmeta-EC-Content-Length\u0027:"},{"line_number":1968,"context_line":"        str(bytes_transferred_from_client),"},{"line_number":1969,"context_line":"        # older style x-backend-container-update-override-* headers are used"},{"line_number":1970,"context_line":"        # here (in addition to x-object-sysmeta-container-update-override-*"},{"line_number":1971,"context_line":"        # headers) for backwards compatibility: the request may be to an object"},{"line_number":1972,"context_line":"        # server that has not yet been upgraded to accept the newer style"},{"line_number":1973,"context_line":"        # x-object-sysmeta-container-update-override- headers."}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_671fa170","line":1970,"in_reply_to":"7faddb67_e4d392d4","updated":"2019-08-09 01:23:01.000000000","message":"when we are putting it in the footer I assume that\u0027s because there is no way of knowing what the etag and size is until the footer is ready to be sent.. So I suspect yes we \"do\" want to make sure these values would be overridden.\nAlthough middleware writers may not like that I guess.","commit_id":"71e145e1d6815683f328c1a136b6ca69080e9726"}]}
