)]}'
{"swift/common/middleware/listing_formats.py":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"fddad4ae9615b8cf07ac990f8aec3d3e3f24afc0","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        body \u003d b\u0027\u0027.join(resp_iter)"},{"line_number":177,"context_line":"        try:"},{"line_number":178,"context_line":"            listing \u003d json.loads(body)"},{"line_number":179,"context_line":"            # Do a couple sanity checks"},{"line_number":180,"context_line":"            if not isinstance(listing, list):"},{"line_number":181,"context_line":"                raise ValueError"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_709a5762","line":178,"updated":"2018-08-24 11:59:21.000000000","message":"Container listings will work if you add a .decode to this body as well","commit_id":"407d3770cb7717412934cc31bfd790788fe1e486"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a2d80fdc2ccd555af250799253dcd5e3aa61d67","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            start_response(status, headers)"},{"line_number":178,"context_line":"            return resp_iter"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        body \u003d b\u0027\u0027.join(resp_iter).decode(\u0027ascii\u0027)"},{"line_number":181,"context_line":"        try:"},{"line_number":182,"context_line":"            listing \u003d json.loads(body)"},{"line_number":183,"context_line":"            # Do a couple sanity checks"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_5a694ef5","line":180,"updated":"2018-09-07 22:51:55.000000000","message":"This can trip a UnicodeDecodeError, see http://logs.openstack.org/58/578958/3/check/legacy-tempest-dsvm-neutron-full/4f092ca/logs/screen-s-proxy.txt.gz#_Sep_06_06_42_19_753592","commit_id":"27973c277ccb1d0da18b4ccaf61cd3499a7d2bec"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"1a4bc81d3aa04b5e01136e4cf99405101fa4cdd5","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        body \u003d b\u0027\u0027.join(resp_iter)"},{"line_number":181,"context_line":"        try:"},{"line_number":182,"context_line":"            listing \u003d json.loads(body.decode(\u0027ascii\u0027))"},{"line_number":183,"context_line":"            # Do a couple sanity checks"},{"line_number":184,"context_line":"            if not isinstance(listing, list):"},{"line_number":185,"context_line":"                raise ValueError"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_7f4b8db0","line":182,"updated":"2018-09-25 19:29:58.000000000","message":"I\u0027m okay with this. Better actually catch a problem in back-end\u0027s response here.","commit_id":"78344bfe2559a2d88e2f4bf724d9f963529c1155"}],"swift/common/middleware/symlink.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"855688285470883925f252837b771567ec9afb33","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        \"\"\""},{"line_number":296,"context_line":"        with closing_if_possible(resp_iter):"},{"line_number":297,"context_line":"            resp_body \u003d b\u0027\u0027.join(resp_iter)"},{"line_number":298,"context_line":"        body_json \u003d json.loads(resp_body.decode(\u0027ascii\u0027))"},{"line_number":299,"context_line":"        swift_version, account, _junk \u003d split_path(req.path, 2, 3, True)"},{"line_number":300,"context_line":"        new_body \u003d json.dumps("},{"line_number":301,"context_line":"            [self._extract_symlink_path_json(obj_dict, swift_version, account)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_eecbb16f","line":298,"updated":"2018-08-02 04:19:23.000000000","message":"Umm, actually you don\u0027t need this. loads() decodes a JSON from b\u0027\u0027 just fine. I guess it\u0027s better for consistency.","commit_id":"407d3770cb7717412934cc31bfd790788fe1e486"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6135904561a8630c873fd26aacc4948c1bf78e74","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        \"\"\""},{"line_number":296,"context_line":"        with closing_if_possible(resp_iter):"},{"line_number":297,"context_line":"            resp_body \u003d b\u0027\u0027.join(resp_iter)"},{"line_number":298,"context_line":"        body_json \u003d json.loads(resp_body.decode(\u0027ascii\u0027))"},{"line_number":299,"context_line":"        swift_version, account, _junk \u003d split_path(req.path, 2, 3, True)"},{"line_number":300,"context_line":"        new_body \u003d json.dumps("},{"line_number":301,"context_line":"            [self._extract_symlink_path_json(obj_dict, swift_version, account)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_ae4059a4","line":298,"in_reply_to":"5f7c97a3_eecbb16f","updated":"2018-08-02 04:24:33.000000000","message":"Not all versions of py3 :-(\n\n$ python3.5\nPython 3.5.5 (default, Apr 27 2018, 03:26:54)\n[GCC 7.3.0] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e json.loads(b\u0027[]\u0027)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/usr/lib/python3.5/json/__init__.py\", line 312, in loads\n    s.__class__.__name__))\nTypeError: the JSON object must be str, not \u0027bytes\u0027","commit_id":"407d3770cb7717412934cc31bfd790788fe1e486"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"1a4bc81d3aa04b5e01136e4cf99405101fa4cdd5","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        \"\"\""},{"line_number":296,"context_line":"        with closing_if_possible(resp_iter):"},{"line_number":297,"context_line":"            resp_body \u003d b\u0027\u0027.join(resp_iter)"},{"line_number":298,"context_line":"        body_json \u003d json.loads(resp_body.decode(\u0027ascii\u0027))"},{"line_number":299,"context_line":"        swift_version, account, _junk \u003d split_path(req.path, 2, 3, True)"},{"line_number":300,"context_line":"        new_body \u003d json.dumps("},{"line_number":301,"context_line":"            [self._extract_symlink_path_json(obj_dict, swift_version, account)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_d1f175e0","line":298,"updated":"2018-09-25 19:29:58.000000000","message":"okay, this .decode(\u0027ascii\u0027) is needed for py35","commit_id":"78344bfe2559a2d88e2f4bf724d9f963529c1155"}],"swift/proxy/server.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"855688285470883925f252837b771567ec9afb33","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        :param policy: an instance of :class:`BaseStoragePolicy` or ``None``"},{"line_number":344,"context_line":"        :return: an instance of :class:`ProxyOverrideOptions`"},{"line_number":345,"context_line":"        \"\"\""},{"line_number":346,"context_line":"        return self._override_options[policy and policy.idx]"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def check_config(self):"},{"line_number":349,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_eec73145","line":346,"updated":"2018-08-02 04:19:23.000000000","message":"This cannot possibly work if policy is None, can it? Returns \"TypeError: list indices must be integers or slices, not NoneType\" for me. Am I missing something here?","commit_id":"407d3770cb7717412934cc31bfd790788fe1e486"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6135904561a8630c873fd26aacc4948c1bf78e74","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        :param policy: an instance of :class:`BaseStoragePolicy` or ``None``"},{"line_number":344,"context_line":"        :return: an instance of :class:`ProxyOverrideOptions`"},{"line_number":345,"context_line":"        \"\"\""},{"line_number":346,"context_line":"        return self._override_options[policy and policy.idx]"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"    def check_config(self):"},{"line_number":349,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_ee3ad132","line":346,"in_reply_to":"5f7c97a3_eec73145","updated":"2018-08-02 04:24:33.000000000","message":"It\u0027s a defaultdict though -- we set [None] up on line 321.","commit_id":"407d3770cb7717412934cc31bfd790788fe1e486"}]}
