)]}'
{"keystonemiddleware/s3_token.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"67b06a1206796e700b64bd158fa847a18c6c2a7f","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        req.headers[\u0027X-Auth-Token\u0027] \u003d token_id"},{"line_number":253,"context_line":"        tenant_to_connect \u003d force_tenant or tenant[\u0027id\u0027]"},{"line_number":254,"context_line":"        if six.PY2 and isinstance(tenant_to_connect, six.text_type):"},{"line_number":255,"context_line":"            tenant_to_connect \u003d tenant_to_connect.encode(\u0027utf-8\u0027)"},{"line_number":256,"context_line":"        self._logger.debug(\u0027Connecting with tenant: %s\u0027, tenant_to_connect)"},{"line_number":257,"context_line":"        new_tenant_name \u003d \u0027%s%s\u0027 % (self._reseller_prefix, tenant_to_connect)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_8afba146","line":254,"updated":"2015-08-07 00:16:33.000000000","message":"why wouldn\u0027t tenant_to_connect be six.text_type?","commit_id":"256f4c96cb618c8f9083c0b3ba0f5f0dfca662cd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6570cc793d51745276f231522de3d7c2654c9452","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        req.headers[\u0027X-Auth-Token\u0027] \u003d token_id"},{"line_number":253,"context_line":"        tenant_to_connect \u003d force_tenant or tenant[\u0027id\u0027]"},{"line_number":254,"context_line":"        if six.PY2 and isinstance(tenant_to_connect, six.text_type):"},{"line_number":255,"context_line":"            tenant_to_connect \u003d tenant_to_connect.encode(\u0027utf-8\u0027)"},{"line_number":256,"context_line":"        self._logger.debug(\u0027Connecting with tenant: %s\u0027, tenant_to_connect)"},{"line_number":257,"context_line":"        new_tenant_name \u003d \u0027%s%s\u0027 % (self._reseller_prefix, tenant_to_connect)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_beb6b5f7","line":254,"in_reply_to":"1a4dcd0f_8afba146","updated":"2015-08-13 16:27:50.000000000","message":"I think a comment should be added to answer this since it might not be apparent to other people working on the code.","commit_id":"256f4c96cb618c8f9083c0b3ba0f5f0dfca662cd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e4d1bf678bab427e1124cebf0017cfe93633698","unresolved":false,"context_lines":[{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        req.headers[\u0027X-Auth-Token\u0027] \u003d token_id"},{"line_number":253,"context_line":"        tenant_to_connect \u003d force_tenant or tenant[\u0027id\u0027]"},{"line_number":254,"context_line":"        if six.PY2 and isinstance(tenant_to_connect, six.text_type):"},{"line_number":255,"context_line":"            tenant_to_connect \u003d tenant_to_connect.encode(\u0027utf-8\u0027)"},{"line_number":256,"context_line":"        self._logger.debug(\u0027Connecting with tenant: %s\u0027, tenant_to_connect)"},{"line_number":257,"context_line":"        new_tenant_name \u003d \u0027%s%s\u0027 % (self._reseller_prefix, tenant_to_connect)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_6f407936","line":254,"in_reply_to":"1a4dcd0f_8afba146","updated":"2015-08-13 17:06:24.000000000","message":"tenant_to_connect doesn\u0027t necessarily come from resp.json(); it could have come from the Authorization header, which would be a (byte) string in Python2.\n\nWe could add a test like below, but it covers an uninteresting case (as it\u0027s all native strings):\n\n    def test_unicode_path_forced_tenant(self):\n        url \u003d u\u0027/v1/AUTH_cfa/c/euro\\u20ac\u0027.encode(\u0027utf8\u0027)\n        req \u003d webob.Request.blank(urllib.parse.quote(url))\n        req.headers[\u0027Authorization\u0027] \u003d \u0027access:FORCED_TENANT_ID:signature\u0027\n        req.headers[\u0027X-Storage-Token\u0027] \u003d \u0027token\u0027\n        req.get_response(self.middleware)","commit_id":"256f4c96cb618c8f9083c0b3ba0f5f0dfca662cd"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"537ba5c8b955759b887b90776c82650ca8fadd08","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        req.headers[\u0027X-Auth-Token\u0027] \u003d token_id"},{"line_number":253,"context_line":"        tenant_to_connect \u003d force_tenant or tenant[\u0027id\u0027]"},{"line_number":254,"context_line":"        if six.PY2 and isinstance(tenant_to_connect, six.text_type):"},{"line_number":255,"context_line":"            tenant_to_connect \u003d tenant_to_connect.encode(\u0027utf-8\u0027)"},{"line_number":256,"context_line":"        self._logger.debug(\u0027Connecting with tenant: %s\u0027, tenant_to_connect)"},{"line_number":257,"context_line":"        new_tenant_name \u003d \u0027%s%s\u0027 % (self._reseller_prefix, tenant_to_connect)"},{"line_number":258,"context_line":"        environ[\u0027PATH_INFO\u0027] \u003d environ[\u0027PATH_INFO\u0027].replace(account,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_1e1fa9b8","line":255,"updated":"2015-08-07 17:57:16.000000000","message":"Is this saying that in Python2 tenant_to_connect must be bytes and in Python3 it can be text?","commit_id":"256f4c96cb618c8f9083c0b3ba0f5f0dfca662cd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2e4d1bf678bab427e1124cebf0017cfe93633698","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        req.headers[\u0027X-Auth-Token\u0027] \u003d token_id"},{"line_number":253,"context_line":"        tenant_to_connect \u003d force_tenant or tenant[\u0027id\u0027]"},{"line_number":254,"context_line":"        if six.PY2 and isinstance(tenant_to_connect, six.text_type):"},{"line_number":255,"context_line":"            tenant_to_connect \u003d tenant_to_connect.encode(\u0027utf-8\u0027)"},{"line_number":256,"context_line":"        self._logger.debug(\u0027Connecting with tenant: %s\u0027, tenant_to_connect)"},{"line_number":257,"context_line":"        new_tenant_name \u003d \u0027%s%s\u0027 % (self._reseller_prefix, tenant_to_connect)"},{"line_number":258,"context_line":"        environ[\u0027PATH_INFO\u0027] \u003d environ[\u0027PATH_INFO\u0027].replace(account,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_6453c06d","line":255,"in_reply_to":"1a4dcd0f_1e1fa9b8","updated":"2015-08-13 17:06:24.000000000","message":"Yes, it must be a native (byte) sting in Python2 and a native (unicode) string in Python3, because environ[\u0027PATH_INFO\u0027] is a native string.","commit_id":"256f4c96cb618c8f9083c0b3ba0f5f0dfca662cd"}],"keystonemiddleware/tests/unit/test_s3_token_middleware.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"b8434bcc2fef2588026f0b2c14b7d394d856a947","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        middleware \u003d s3_token.filter_factory(config)(FakeApp())"},{"line_number":167,"context_line":"        self.assertIs(\u0027false_ind\u0027, middleware._verify)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    if six.PY2:"},{"line_number":170,"context_line":"        def test_unicode_path(self):"},{"line_number":171,"context_line":"            req \u003d webob.Request.blank(\u0027/v1/AUTH_cfa/c/\\xc3\\xa9\u0027)"},{"line_number":172,"context_line":"            req.headers[\u0027Authorization\u0027] \u003d \u0027access:signature\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3acd31a7_3b222d53","line":169,"updated":"2015-05-04 13:51:13.000000000","message":"Doesn\u0027t it pass with python 3? We don\u0027t use to have conditional tests based on python versions.\n\nDefine the test and make sure they pass with both versions, doesn\u0027t matter if for one we had to create a workaround (py2) or if it works by default (py3).","commit_id":"7fb7dab2f246d6aee642f02aa8d1d69bf768a921"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"89480286347eccfac8d535f8d6742169c7092a16","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        middleware \u003d s3_token.filter_factory(config)(FakeApp())"},{"line_number":167,"context_line":"        self.assertIs(\u0027false_ind\u0027, middleware._verify)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    if six.PY2:"},{"line_number":170,"context_line":"        def test_unicode_path(self):"},{"line_number":171,"context_line":"            req \u003d webob.Request.blank(\u0027/v1/AUTH_cfa/c/\\xc3\\xa9\u0027)"},{"line_number":172,"context_line":"            req.headers[\u0027Authorization\u0027] \u003d \u0027access:signature\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3acd31a7_47ebcab0","line":169,"in_reply_to":"3acd31a7_3b222d53","updated":"2015-05-04 15:53:05.000000000","message":"Yeah, with Python 3, the test fails because webob.Request.blank(\u0027é\u0027) throws an exception (and webob.Request.blank(\u0027\\xc3\\xa9\u0027) as well), as can be seen at http://paste.openstack.org/show/214862/ . \n\nSo I think we might have a bug with webob. Is there a nice way for me to work around this in keystonemiddleware?","commit_id":"7fb7dab2f246d6aee642f02aa8d1d69bf768a921"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"b8434bcc2fef2588026f0b2c14b7d394d856a947","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    if six.PY2:"},{"line_number":170,"context_line":"        def test_unicode_path(self):"},{"line_number":171,"context_line":"            req \u003d webob.Request.blank(\u0027/v1/AUTH_cfa/c/\\xc3\\xa9\u0027)"},{"line_number":172,"context_line":"            req.headers[\u0027Authorization\u0027] \u003d \u0027access:signature\u0027"},{"line_number":173,"context_line":"            req.headers[\u0027X-Storage-Token\u0027] \u003d \u0027token\u0027"},{"line_number":174,"context_line":"            req.get_response(self.middleware)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3acd31a7_fb6dd598","line":171,"updated":"2015-05-04 13:51:13.000000000","message":"So your commit message says:\n\nThe bug occurs if the URL contains a non-ASCII character in the tenant id:\n\"hého\" in \"/v1/AUTH_cfa/c/hého\"\n\nShouldn\u0027t we have a test that includes a non-ascii character in the tenant id and then ensure it doesn\u0027t break anymore ?","commit_id":"7fb7dab2f246d6aee642f02aa8d1d69bf768a921"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"89480286347eccfac8d535f8d6742169c7092a16","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    if six.PY2:"},{"line_number":170,"context_line":"        def test_unicode_path(self):"},{"line_number":171,"context_line":"            req \u003d webob.Request.blank(\u0027/v1/AUTH_cfa/c/\\xc3\\xa9\u0027)"},{"line_number":172,"context_line":"            req.headers[\u0027Authorization\u0027] \u003d \u0027access:signature\u0027"},{"line_number":173,"context_line":"            req.headers[\u0027X-Storage-Token\u0027] \u003d \u0027token\u0027"},{"line_number":174,"context_line":"            req.get_response(self.middleware)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3acd31a7_e66d3c99","line":171,"in_reply_to":"3acd31a7_fb6dd598","updated":"2015-05-04 15:53:05.000000000","message":"Oh, my bad. No, really the problem occurs when we have non-ascii characters in the path, because we end up mixing str and Unicode (which is always the type of the tenant id). Will fix this in the next commit.","commit_id":"7fb7dab2f246d6aee642f02aa8d1d69bf768a921"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"67b06a1206796e700b64bd158fa847a18c6c2a7f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.assertIs(\u0027false_ind\u0027, middleware._verify)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def test_unicode_path(self):"},{"line_number":170,"context_line":"        url \u003d u\u0027/v1/AUTH_cfa/c/euro\\u20ac\u0027.encode(\u0027utf8\u0027)"},{"line_number":171,"context_line":"        req \u003d webob.Request.blank(urllib.parse.quote(url))"},{"line_number":172,"context_line":"        req.headers[\u0027Authorization\u0027] \u003d \u0027access:signature\u0027"},{"line_number":173,"context_line":"        req.headers[\u0027X-Storage-Token\u0027] \u003d \u0027token\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_2ab84d74","line":170,"updated":"2015-08-07 00:16:33.000000000","message":"this should be path not url.","commit_id":"256f4c96cb618c8f9083c0b3ba0f5f0dfca662cd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6570cc793d51745276f231522de3d7c2654c9452","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        self.assertIs(\u0027false_ind\u0027, middleware._verify)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def test_unicode_path(self):"},{"line_number":170,"context_line":"        url \u003d u\u0027/v1/AUTH_cfa/c/euro\\u20ac\u0027.encode(\u0027utf8\u0027)"},{"line_number":171,"context_line":"        req \u003d webob.Request.blank(urllib.parse.quote(url))"},{"line_number":172,"context_line":"        req.headers[\u0027Authorization\u0027] \u003d \u0027access:signature\u0027"},{"line_number":173,"context_line":"        req.headers[\u0027X-Storage-Token\u0027] \u003d \u0027token\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_7ec90d79","line":170,"in_reply_to":"1a4dcd0f_2ab84d74","updated":"2015-08-13 16:27:50.000000000","message":"++","commit_id":"256f4c96cb618c8f9083c0b3ba0f5f0dfca662cd"}]}
