)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"91e02334ab9717e910779e46ab65eaa73285b5f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2c7fb99e_6ca9b13f","updated":"2023-05-24 20:41:30.000000000","message":"This looks plausible but needs tests adjusted.","commit_id":"52af7ea6857649742c1292d8bc9767043d183cab"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43d87942d4e31d95e85ea4b07345305b5638ec83","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1fe828a0_ef03262a","updated":"2023-05-31 23:07:35.000000000","message":"I\u0027m still getting some metadata inconsistencies when the *header name* includes non-ascii characters -- I think we might need some changes in the receiver, too, around https://github.com/openstack/swift/blob/2.31.1/swift/obj/ssync_receiver.py#L469-L471\n\n...and the object-server, around https://github.com/openstack/swift/blob/2.31.1/swift/obj/server.py#L681 and https://github.com/openstack/swift/blob/2.31.1/swift/obj/server.py#L930 ...","commit_id":"cd6e71e62b7b56ff1a2770adfb3f9f4441d874e4"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"5a10be8c06fae93244e11e3867ce7c7d54354dc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"57bd4fe5_b2dc1ab7","updated":"2023-05-31 21:07:10.000000000","message":"Looks good. But our expert on py3 and wsgi latin-1 is Tim.","commit_id":"cd6e71e62b7b56ff1a2770adfb3f9f4441d874e4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0219a57802ebde5115c5dbc20c3b28f18b9b5f7f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"08cd5d53_1d1a0eae","updated":"2023-06-22 14:45:23.000000000","message":"I\u0027m not sure I fully understand the reason for all of the changes, and some are not covered by unit tests (hence -1).","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a315cd38f3935e56440222a4b60f6f8db1e3297a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"cf2251ac_f954f2d1","updated":"2023-06-21 21:17:26.000000000","message":"Well, if doing lower() on bytes works, then sure.","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a32de626fd0d613ae506d02336cfa96c2049259a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"03fbe378_c6096ccc","updated":"2023-07-10 14:29:00.000000000","message":"OK makes sense. I added a little more test coverage for the POST case.","commit_id":"365c0ef005ca14691f8ba21f1e81d37ae7c0bfc0"}],"swift/obj/server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0219a57802ebde5115c5dbc20c3b28f18b9b5f7f","unresolved":true,"context_lines":[{"line_number":679,"context_line":"            for header_key in headers_to_copy:"},{"line_number":680,"context_line":"                if header_key in request.headers:"},{"line_number":681,"context_line":"                    header_caps \u003d bytes_to_wsgi("},{"line_number":682,"context_line":"                        wsgi_to_bytes(header_key).title())"},{"line_number":683,"context_line":"                    metadata[header_caps] \u003d request.headers[header_key]"},{"line_number":684,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":685,"context_line":"            if orig_delete_at !\u003d new_delete_at:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7c859d81_0f934c8c","line":682,"updated":"2023-06-22 14:45:23.000000000","message":"do title() on bytes - how does this relate to the linked bug in which the header *value* was corrupted?","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4d9f22175514dc31132e3b56b0c95c07e1515800","unresolved":false,"context_lines":[{"line_number":679,"context_line":"            for header_key in headers_to_copy:"},{"line_number":680,"context_line":"                if header_key in request.headers:"},{"line_number":681,"context_line":"                    header_caps \u003d bytes_to_wsgi("},{"line_number":682,"context_line":"                        wsgi_to_bytes(header_key).title())"},{"line_number":683,"context_line":"                    metadata[header_caps] \u003d request.headers[header_key]"},{"line_number":684,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":685,"context_line":"            if orig_delete_at !\u003d new_delete_at:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ee5e1ff_e086e7d3","line":682,"in_reply_to":"0f0964ea_b206f6ac","updated":"2023-07-10 14:21:39.000000000","message":"Ack","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"11af23b7daecebae9da0511d527633bc29339736","unresolved":true,"context_lines":[{"line_number":679,"context_line":"            for header_key in headers_to_copy:"},{"line_number":680,"context_line":"                if header_key in request.headers:"},{"line_number":681,"context_line":"                    header_caps \u003d bytes_to_wsgi("},{"line_number":682,"context_line":"                        wsgi_to_bytes(header_key).title())"},{"line_number":683,"context_line":"                    metadata[header_caps] \u003d request.headers[header_key]"},{"line_number":684,"context_line":"            orig_delete_at \u003d int(orig_metadata.get(\u0027X-Delete-At\u0027) or 0)"},{"line_number":685,"context_line":"            if orig_delete_at !\u003d new_delete_at:"}],"source_content_type":"text/x-python","patch_set":4,"id":"0f0964ea_b206f6ac","line":682,"in_reply_to":"7c859d81_0f934c8c","updated":"2023-07-06 17:56:04.000000000","message":"The bug was *discovered* because of header values, but (my view, anyway, is that) the bug is in how we handle headers *in general* during replication/reconstruction. Since user meta may include non-ascii data in header names as well as values, this seemed in-scope (to me).","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a32de626fd0d613ae506d02336cfa96c2049259a","unresolved":true,"context_lines":[{"line_number":907,"context_line":"                upload_size)"},{"line_number":908,"context_line":"        return upload_size, etag"},{"line_number":909,"context_line":""},{"line_number":910,"context_line":"    def _get_request_metadata(self, request, upload_size, etag):"},{"line_number":911,"context_line":"        \"\"\""},{"line_number":912,"context_line":"        Pull object metadata off the request."},{"line_number":913,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ea5947ef_28e81797","line":910,"updated":"2023-07-10 14:29:00.000000000","message":"this method can\u0027t be neatly re-used by POST because of the subtle difference in handling sysmeta (POST does NOT copy sysmeta, PUT does)","commit_id":"365c0ef005ca14691f8ba21f1e81d37ae7c0bfc0"}],"swift/obj/ssync_receiver.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"0cff6245b006a0cfbf0919d79d794423ac13582d","unresolved":true,"context_lines":[{"line_number":476,"context_line":"                line \u003d line.strip()"},{"line_number":477,"context_line":"                if not line:"},{"line_number":478,"context_line":"                    break"},{"line_number":479,"context_line":"                header, value \u003d swob.bytes_to_wsgi(line).split(\u0027:\u0027, 1)"},{"line_number":480,"context_line":"                header \u003d header.strip().lower()"},{"line_number":481,"context_line":"                value \u003d value.strip()"},{"line_number":482,"context_line":"                subreq.headers[header] \u003d value"}],"source_content_type":"text/x-python","patch_set":4,"id":"ef6c8528_4723e1f9","side":"PARENT","line":479,"updated":"2023-06-02 05:06:39.000000000","message":"I don\u0027t understand this part. What is the data string that makes this break?\nNo problem with the replacement code, but I\u0027m amazed that a change was needed.","commit_id":"eb3fe260d51d021674b2bccc4b9d1b4cc0757450"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"a315cd38f3935e56440222a4b60f6f8db1e3297a","unresolved":false,"context_lines":[{"line_number":476,"context_line":"                line \u003d line.strip()"},{"line_number":477,"context_line":"                if not line:"},{"line_number":478,"context_line":"                    break"},{"line_number":479,"context_line":"                header, value \u003d swob.bytes_to_wsgi(line).split(\u0027:\u0027, 1)"},{"line_number":480,"context_line":"                header \u003d header.strip().lower()"},{"line_number":481,"context_line":"                value \u003d value.strip()"},{"line_number":482,"context_line":"                subreq.headers[header] \u003d value"}],"source_content_type":"text/x-python","patch_set":4,"id":"f15fd97d_dfbf5f08","side":"PARENT","line":479,"in_reply_to":"afb16146_43aaa44d","updated":"2023-06-21 21:17:26.000000000","message":"Ack","commit_id":"eb3fe260d51d021674b2bccc4b9d1b4cc0757450"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3ecc59b6419f9f35b52d56199cd0f59935d5cbb2","unresolved":true,"context_lines":[{"line_number":476,"context_line":"                line \u003d line.strip()"},{"line_number":477,"context_line":"                if not line:"},{"line_number":478,"context_line":"                    break"},{"line_number":479,"context_line":"                header, value \u003d swob.bytes_to_wsgi(line).split(\u0027:\u0027, 1)"},{"line_number":480,"context_line":"                header \u003d header.strip().lower()"},{"line_number":481,"context_line":"                value \u003d value.strip()"},{"line_number":482,"context_line":"                subreq.headers[header] \u003d value"}],"source_content_type":"text/x-python","patch_set":4,"id":"afb16146_43aaa44d","side":"PARENT","line":479,"in_reply_to":"ef6c8528_4723e1f9","updated":"2023-06-02 16:26:28.000000000","message":"It was the\n```\nu\u0027x-object-meta-non-ascii-b\\xe4r\u0027\n```\nheader name in the follow-up probe test -- when it\u0027s WSGIfied, it becomes\n```\n\u0027x-object-meta-non-ascii-bÃ¤r\u0027\n```\non py3, which `.lower()`s to\n```\n\u0027x-object-meta-non-ascii-bã¤r\u0027\n```\nWhen we\u0027re just working in bytes, though, `upper`, `lower`, and `title` only consider changing case for ASCII chars.","commit_id":"eb3fe260d51d021674b2bccc4b9d1b4cc0757450"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0219a57802ebde5115c5dbc20c3b28f18b9b5f7f","unresolved":true,"context_lines":[{"line_number":477,"context_line":"                if not line:"},{"line_number":478,"context_line":"                    break"},{"line_number":479,"context_line":"                header, value \u003d line.split(b\u0027:\u0027, 1)"},{"line_number":480,"context_line":"                header \u003d swob.bytes_to_wsgi(header.strip().lower())"},{"line_number":481,"context_line":"                value \u003d swob.bytes_to_wsgi(value.strip())"},{"line_number":482,"context_line":"                subreq.headers[header] \u003d value"},{"line_number":483,"context_line":"                if header not in (\u0027etag\u0027, \u0027x-backend-no-commit\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"009ac4ab_696b778d","line":480,"updated":"2023-06-22 14:45:23.000000000","message":"there seems to be something else going on here that I don\u0027t understand in the context of the bug report: header keys are lower-cased as bytes, whereas before they were decoded and then lower-cased.\n\nNo test fails in test_ssync_sender.py if I revert this change\n\nIs this a different bug?","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"11af23b7daecebae9da0511d527633bc29339736","unresolved":true,"context_lines":[{"line_number":477,"context_line":"                if not line:"},{"line_number":478,"context_line":"                    break"},{"line_number":479,"context_line":"                header, value \u003d line.split(b\u0027:\u0027, 1)"},{"line_number":480,"context_line":"                header \u003d swob.bytes_to_wsgi(header.strip().lower())"},{"line_number":481,"context_line":"                value \u003d swob.bytes_to_wsgi(value.strip())"},{"line_number":482,"context_line":"                subreq.headers[header] \u003d value"},{"line_number":483,"context_line":"                if header not in (\u0027etag\u0027, \u0027x-backend-no-commit\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"38bb983d_39720665","line":480,"in_reply_to":"009ac4ab_696b778d","updated":"2023-07-06 17:56:04.000000000","message":"\u003e Is this a different bug?\n\nDepends on where we want to draw the fence around \"this\" bug. My view is that it\u0027s a different symptom of the same bug.\n\nAdded tests to demonstrate.","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4d9f22175514dc31132e3b56b0c95c07e1515800","unresolved":false,"context_lines":[{"line_number":477,"context_line":"                if not line:"},{"line_number":478,"context_line":"                    break"},{"line_number":479,"context_line":"                header, value \u003d line.split(b\u0027:\u0027, 1)"},{"line_number":480,"context_line":"                header \u003d swob.bytes_to_wsgi(header.strip().lower())"},{"line_number":481,"context_line":"                value \u003d swob.bytes_to_wsgi(value.strip())"},{"line_number":482,"context_line":"                subreq.headers[header] \u003d value"},{"line_number":483,"context_line":"                if header not in (\u0027etag\u0027, \u0027x-backend-no-commit\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"a55f8660_758f715e","line":480,"in_reply_to":"38bb983d_39720665","updated":"2023-07-10 14:21:39.000000000","message":"Ack","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"}],"swift/obj/ssync_sender.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0219a57802ebde5115c5dbc20c3b28f18b9b5f7f","unresolved":true,"context_lines":[{"line_number":470,"context_line":"    def send_subrequest(self, connection, method, url_path, headers, df):"},{"line_number":471,"context_line":"        msg \u003d [b\u0027%s %s\u0027 % (method.encode(\u0027ascii\u0027), url_path.encode(\u0027utf8\u0027))]"},{"line_number":472,"context_line":"        for key, value in sorted(headers.items()):"},{"line_number":473,"context_line":"            msg.append(wsgi_to_bytes(\u0027%s: %s\u0027 % (key, value)))"},{"line_number":474,"context_line":"        msg \u003d b\u0027\\r\\n\u0027.join(msg) + b\u0027\\r\\n\\r\\n\u0027"},{"line_number":475,"context_line":"        with exceptions.MessageTimeout(self.daemon.node_timeout,"},{"line_number":476,"context_line":"                                       \u0027send_%s\u0027 % method.lower()):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ce411568_b750f805","line":473,"updated":"2023-06-22 14:45:23.000000000","message":"ok, this change seems to relate to the linked bug i.e. that header value is now encoded \u0027latin1\u0027 where before it was encoded \u0027utf8\u0027","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"11af23b7daecebae9da0511d527633bc29339736","unresolved":true,"context_lines":[{"line_number":470,"context_line":"    def send_subrequest(self, connection, method, url_path, headers, df):"},{"line_number":471,"context_line":"        msg \u003d [b\u0027%s %s\u0027 % (method.encode(\u0027ascii\u0027), url_path.encode(\u0027utf8\u0027))]"},{"line_number":472,"context_line":"        for key, value in sorted(headers.items()):"},{"line_number":473,"context_line":"            msg.append(wsgi_to_bytes(\u0027%s: %s\u0027 % (key, value)))"},{"line_number":474,"context_line":"        msg \u003d b\u0027\\r\\n\u0027.join(msg) + b\u0027\\r\\n\\r\\n\u0027"},{"line_number":475,"context_line":"        with exceptions.MessageTimeout(self.daemon.node_timeout,"},{"line_number":476,"context_line":"                                       \u0027send_%s\u0027 % method.lower()):"}],"source_content_type":"text/x-python","patch_set":4,"id":"edb56abc_ce984a02","line":473,"in_reply_to":"ce411568_b750f805","updated":"2023-07-06 17:56:04.000000000","message":"Note that this specific change also impacts header names, though.","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4d9f22175514dc31132e3b56b0c95c07e1515800","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    def send_subrequest(self, connection, method, url_path, headers, df):"},{"line_number":471,"context_line":"        msg \u003d [b\u0027%s %s\u0027 % (method.encode(\u0027ascii\u0027), url_path.encode(\u0027utf8\u0027))]"},{"line_number":472,"context_line":"        for key, value in sorted(headers.items()):"},{"line_number":473,"context_line":"            msg.append(wsgi_to_bytes(\u0027%s: %s\u0027 % (key, value)))"},{"line_number":474,"context_line":"        msg \u003d b\u0027\\r\\n\u0027.join(msg) + b\u0027\\r\\n\\r\\n\u0027"},{"line_number":475,"context_line":"        with exceptions.MessageTimeout(self.daemon.node_timeout,"},{"line_number":476,"context_line":"                                       \u0027send_%s\u0027 % method.lower()):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fadedb63_1fbbcdfd","line":473,"in_reply_to":"edb56abc_ce984a02","updated":"2023-07-10 14:21:39.000000000","message":"Ack","commit_id":"e6179e98211a9488a5581f50427df9bdd647c783"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4d9f22175514dc31132e3b56b0c95c07e1515800","unresolved":true,"context_lines":[{"line_number":1416,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":1417,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"    def test_PUT_common(self):"},{"line_number":1420,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":1421,"context_line":"        req \u003d Request.blank("},{"line_number":1422,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"c3819e31_47410726","line":1419,"range":{"start_line":1419,"start_character":8,"end_line":1419,"end_character":17},"updated":"2023-07-10 14:21:39.000000000","message":"POST case not covered","commit_id":"28172879f193afb96017ebd44a41d1f43cb6e2c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a32de626fd0d613ae506d02336cfa96c2049259a","unresolved":false,"context_lines":[{"line_number":1416,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":1417,"context_line":"        self.assertEqual(resp.status_int, 201)"},{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":"    def test_PUT_common(self):"},{"line_number":1420,"context_line":"        timestamp \u003d normalize_timestamp(time())"},{"line_number":1421,"context_line":"        req \u003d Request.blank("},{"line_number":1422,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"9cef1363_cc8d927f","line":1419,"range":{"start_line":1419,"start_character":8,"end_line":1419,"end_character":17},"in_reply_to":"c3819e31_47410726","updated":"2023-07-10 14:29:00.000000000","message":"Done","commit_id":"28172879f193afb96017ebd44a41d1f43cb6e2c2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"da2bb60a0d3caea39ea0cd30f4b659f8bcec4f95","unresolved":true,"context_lines":[{"line_number":1449,"context_line":"                          \u0027Content-Type\u0027: \u0027application/octet-stream\u0027,"},{"line_number":1450,"context_line":"                          \u0027name\u0027: \u0027/a/c/o\u0027,"},{"line_number":1451,"context_line":"                          \u0027X-Object-Meta-Test\u0027: \u0027one\u0027,"},{"line_number":1452,"context_line":"                          \u0027X-Object-Meta-T\\xc3\\xa8St\u0027: \u0027m\\xc3\\xa8ta\u0027,"},{"line_number":1453,"context_line":"                          \u0027Custom-Header\u0027: \u0027*\u0027})"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"    def test_PUT_overwrite(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"0c4992a9_c977b2f4","line":1452,"range":{"start_line":1452,"start_character":50,"end_line":1452,"end_character":51},"updated":"2023-06-23 21:55:42.000000000","message":"Note that the `s` got upper-cased -- shouldn\u0027t materially change anything, though...","commit_id":"28172879f193afb96017ebd44a41d1f43cb6e2c2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4d9f22175514dc31132e3b56b0c95c07e1515800","unresolved":false,"context_lines":[{"line_number":1449,"context_line":"                          \u0027Content-Type\u0027: \u0027application/octet-stream\u0027,"},{"line_number":1450,"context_line":"                          \u0027name\u0027: \u0027/a/c/o\u0027,"},{"line_number":1451,"context_line":"                          \u0027X-Object-Meta-Test\u0027: \u0027one\u0027,"},{"line_number":1452,"context_line":"                          \u0027X-Object-Meta-T\\xc3\\xa8St\u0027: \u0027m\\xc3\\xa8ta\u0027,"},{"line_number":1453,"context_line":"                          \u0027Custom-Header\u0027: \u0027*\u0027})"},{"line_number":1454,"context_line":""},{"line_number":1455,"context_line":"    def test_PUT_overwrite(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"d7618811_27055d2f","line":1452,"range":{"start_line":1452,"start_character":50,"end_line":1452,"end_character":51},"in_reply_to":"0c4992a9_c977b2f4","updated":"2023-07-10 14:21:39.000000000","message":"Ack","commit_id":"28172879f193afb96017ebd44a41d1f43cb6e2c2"}],"test/unit/obj/test_ssync_sender.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43d87942d4e31d95e85ea4b07345305b5638ec83","unresolved":true,"context_lines":[{"line_number":1745,"context_line":"    def test_send_put_unicode(self):"},{"line_number":1746,"context_line":"        if six.PY2:"},{"line_number":1747,"context_line":"            self._check_send_put("},{"line_number":1748,"context_line":"                \u0027o_with_caract\\xc3\\xa8res_like_in_french\u0027, \u0027m\\xc3\\xa8ta\u0027)"},{"line_number":1749,"context_line":"        else:"},{"line_number":1750,"context_line":"            self._check_send_put("},{"line_number":1751,"context_line":"                \u0027o_with_caract\\u00e8res_like_in_french\u0027, \u0027m\\u00e8ta\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"c470d144_86f6bc99","line":1748,"updated":"2023-05-31 23:07:35.000000000","message":"I think we want to use this invocation even for py3 now. Oh, except the object name *should* be a native string... But I think I\u0027d still prefer that we test the same meta on py2/py3.","commit_id":"cd6e71e62b7b56ff1a2770adfb3f9f4441d874e4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"43d87942d4e31d95e85ea4b07345305b5638ec83","unresolved":true,"context_lines":[{"line_number":1789,"context_line":"    def test_send_post_unicode(self):"},{"line_number":1790,"context_line":"        if six.PY2:"},{"line_number":1791,"context_line":"            self._check_send_post("},{"line_number":1792,"context_line":"                \u0027o_with_caract\\xc3\\xa8res_like_in_french\u0027, \u0027m\\xc3\\xa8ta\u0027)"},{"line_number":1793,"context_line":"        else:"},{"line_number":1794,"context_line":"            self._check_send_post("},{"line_number":1795,"context_line":"                \u0027o_with_caract\\u00e8res_like_in_french\u0027, \u0027m\\u00e8ta\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"f2ef5aea_6e24366f","line":1792,"updated":"2023-05-31 23:07:35.000000000","message":"ditto","commit_id":"cd6e71e62b7b56ff1a2770adfb3f9f4441d874e4"}]}
