)]}'
{"swift/common/middleware/cname_lookup.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a3bcae082f027352443deba19ba07ffaae325bf6","unresolved":false,"context_lines":[{"line_number":150,"context_line":"                        \u0027\u0027.join([\u0027cname-\u0027, a_domain]).encode(\u0027utf-8\u0027)"},{"line_number":151,"context_line":"                    found_domain \u003d self.memcache.get(memcache_key)"},{"line_number":152,"context_line":"                if found_domain is None:"},{"line_number":153,"context_line":"                    ttl, found_domain \u003d lookup_cname(a_domain, self.resolver)"},{"line_number":154,"context_line":"                    if self.memcache and ttl \u003e 0:"},{"line_number":155,"context_line":"                        memcache_key \u003d \u0027\u0027.join([\u0027cname-\u0027, given_domain])"},{"line_number":156,"context_line":"                        self.memcache.set(memcache_key,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_e2e6dcaf","line":153,"range":{"start_line":153,"start_character":25,"end_line":153,"end_character":37},"updated":"2020-02-06 17:20:13.000000000","message":"lookup_cname returns this as one of\n\n* str (for successful lookups that find a domain),\n* False (for successful lookups that find no domain), or\n* None (for unsuccessful lookups).\n\nThe real trouble from the bug is when we get the value back *out* of memcached, it\u0027s been deserialized from JSON -- that\u0027s fine for False (and we won\u0027t cache the None), but the str becomes unicode.","commit_id":"c897cbae191433f11647662b3a8eacfb8892bf36"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"aabd140902457e8a4bebdb38c9e0e9be439f60b6","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                    if six.PY2 and found_domain:"},{"line_number":153,"context_line":"                        found_domain \u003d found_domain.encode(\u0027utf-8\u0027)"},{"line_number":154,"context_line":"                if found_domain is None:"},{"line_number":155,"context_line":"                    ttl, found_domain \u003d lookup_cname(a_domain, self.resolver)"},{"line_number":156,"context_line":"                    if self.memcache and ttl \u003e 0:"},{"line_number":157,"context_line":"                        memcache_key \u003d \u0027cname-\u0027 + wsgi_to_str(given_domain)"},{"line_number":158,"context_line":"                        self.memcache.set(memcache_key, found_domain,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f5a5fb01","line":155,"range":{"start_line":155,"start_character":40,"end_line":155,"end_character":52},"updated":"2020-02-11 05:01:25.000000000","message":"Should this accept native strings or wsgi strings?","commit_id":"14ec2e996ac9c8bbf63f49ba4b29a2c1ec0890f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"90bdc0cff5ae3300d6479aac7ef98247a2de271e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                    if six.PY2 and found_domain:"},{"line_number":153,"context_line":"                        found_domain \u003d found_domain.encode(\u0027utf-8\u0027)"},{"line_number":154,"context_line":"                if found_domain is None:"},{"line_number":155,"context_line":"                    ttl, found_domain \u003d lookup_cname(a_domain, self.resolver)"},{"line_number":156,"context_line":"                    if self.memcache and ttl \u003e 0:"},{"line_number":157,"context_line":"                        memcache_key \u003d \u0027cname-\u0027 + wsgi_to_str(given_domain)"},{"line_number":158,"context_line":"                        self.memcache.set(memcache_key, found_domain,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_07573ff7","line":155,"range":{"start_line":155,"start_character":40,"end_line":155,"end_character":52},"in_reply_to":"3fa7e38b_f5a5fb01","updated":"2020-02-11 22:16:57.000000000","message":"Native, of course. It\u0027s bad enough that we have a WSGI string cancer in our code, let\u0027s not screw with library-looking functions.","commit_id":"14ec2e996ac9c8bbf63f49ba4b29a2c1ec0890f3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"aabd140902457e8a4bebdb38c9e0e9be439f60b6","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                        memcache_key \u003d \u0027cname-\u0027 + wsgi_to_str(given_domain)"},{"line_number":158,"context_line":"                        self.memcache.set(memcache_key, found_domain,"},{"line_number":159,"context_line":"                                          time\u003dttl)"},{"line_number":160,"context_line":"                if not found_domain or found_domain \u003d\u003d a_domain:"},{"line_number":161,"context_line":"                    # no CNAME records or we\u0027re at the last lookup"},{"line_number":162,"context_line":"                    error \u003d True"},{"line_number":163,"context_line":"                    found_domain \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_759a6bc4","line":160,"range":{"start_line":160,"start_character":39,"end_line":160,"end_character":63},"updated":"2020-02-11 05:01:25.000000000","message":"This seems off, still :-/","commit_id":"14ec2e996ac9c8bbf63f49ba4b29a2c1ec0890f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"90bdc0cff5ae3300d6479aac7ef98247a2de271e","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                        memcache_key \u003d \u0027cname-\u0027 + wsgi_to_str(given_domain)"},{"line_number":158,"context_line":"                        self.memcache.set(memcache_key, found_domain,"},{"line_number":159,"context_line":"                                          time\u003dttl)"},{"line_number":160,"context_line":"                if not found_domain or found_domain \u003d\u003d a_domain:"},{"line_number":161,"context_line":"                    # no CNAME records or we\u0027re at the last lookup"},{"line_number":162,"context_line":"                    error \u003d True"},{"line_number":163,"context_line":"                    found_domain \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_27d7db52","line":160,"range":{"start_line":160,"start_character":39,"end_line":160,"end_character":63},"in_reply_to":"3fa7e38b_759a6bc4","updated":"2020-02-11 22:16:57.000000000","message":"Agreed -- as long as a_domain is a native string. found_domain is a WSGI string for sure.","commit_id":"14ec2e996ac9c8bbf63f49ba4b29a2c1ec0890f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"90bdc0cff5ae3300d6479aac7ef98247a2de271e","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                elif self._domain_endswith_in_storage_domain(found_domain):"},{"line_number":166,"context_line":"                    # Found it!"},{"line_number":167,"context_line":"                    found_domain \u003d str_to_wsgi(found_domain)"},{"line_number":168,"context_line":"                    self.logger.info("},{"line_number":169,"context_line":"                        _(\u0027Mapped %(given_domain)s to %(found_domain)s\u0027) %"},{"line_number":170,"context_line":"                        {\u0027given_domain\u0027: given_domain,"},{"line_number":171,"context_line":"                         \u0027found_domain\u0027: found_domain})"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_4738d7c9","line":168,"updated":"2020-02-11 22:16:57.000000000","message":"I don\u0027t like throwing WSGI springs at the logs. Could we do str_to_wsgi() a little later, after the log?","commit_id":"14ec2e996ac9c8bbf63f49ba4b29a2c1ec0890f3"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"90bdc0cff5ae3300d6479aac7ef98247a2de271e","unresolved":false,"context_lines":[{"line_number":177,"context_line":"                    break"},{"line_number":178,"context_line":"                else:"},{"line_number":179,"context_line":"                    # try one more deep in the chain"},{"line_number":180,"context_line":"                    found_domain \u003d str_to_wsgi(found_domain)"},{"line_number":181,"context_line":"                    self.logger.debug("},{"line_number":182,"context_line":"                        _(\u0027Following CNAME chain for  \u0027"},{"line_number":183,"context_line":"                          \u0027%(given_domain)s to %(found_domain)s\u0027) %"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_e7aea3e3","line":180,"updated":"2020-02-11 22:16:57.000000000","message":"This can\u0027t be right if a_domain is a native string. Which it must be in order to compare with storage_domain.","commit_id":"14ec2e996ac9c8bbf63f49ba4b29a2c1ec0890f3"}]}
