)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1a019f0e25e86c2a2ea0525cadf720b8bb8bd1cd","unresolved":false,"context_lines":[{"line_number":11,"context_line":"as soon as we see them. It helps to deal with HMAC."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Unfortunately, this conflicts with the way object controller"},{"line_number":14,"context_line":"handles the info (get_object_info). So, a fairly"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Aaand, we fix formpost along the way. It _clearly_ was"},{"line_number":17,"context_line":"doing a wrong thing, encoding the same body several times"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"bfb3d3c7_90b6d889","line":14,"range":{"start_line":14,"start_character":18,"end_line":14,"end_character":33},"updated":"2019-05-30 19:43:01.000000000","message":"Huh... does anyone actually *call* get_object_info?","commit_id":"cb7457ebfd60221111a32056c1e37683e8828154"}],"swift/common/middleware/formpost.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1a019f0e25e86c2a2ea0525cadf720b8bb8bd1cd","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        except ValueError:"},{"line_number":391,"context_line":"            raise FormInvalid(\u0027expired not an integer\u0027)"},{"line_number":392,"context_line":"        hmac_body \u003d \u0027%s\\n%s\\n%s\\n%s\\n%s\u0027 % ("},{"line_number":393,"context_line":"            orig_env[\u0027PATH_INFO\u0027],"},{"line_number":394,"context_line":"            attributes.get(\u0027redirect\u0027) or \u0027\u0027,"},{"line_number":395,"context_line":"            attributes.get(\u0027max_file_size\u0027) or \u00270\u0027,"},{"line_number":396,"context_line":"            attributes.get(\u0027max_file_count\u0027) or \u00270\u0027,"},{"line_number":397,"context_line":"            attributes.get(\u0027expires\u0027) or \u00270\u0027)"},{"line_number":398,"context_line":"        if six.PY3:"},{"line_number":399,"context_line":"            hmac_body \u003d hmac_body.encode(\u0027utf-8\u0027)"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        has_valid_sig \u003d False"},{"line_number":402,"context_line":"        for key in keys:"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_50b4e07f","side":"PARENT","line":399,"range":{"start_line":393,"start_character":12,"end_line":399,"end_character":49},"updated":"2019-05-30 19:43:01.000000000","message":"Eep! Yep, that\u0027s no good.","commit_id":"1adde2fba52b248440c0fb51ddacfefb3d7543ae"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8cb333acb4ebff8d9bca6657ce6c2ed076129480","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        except ValueError:"},{"line_number":391,"context_line":"            raise FormInvalid(\u0027expired not an integer\u0027)"},{"line_number":392,"context_line":"        hmac_body \u003d \u0027%s\\n%s\\n%s\\n%s\\n%s\u0027 % ("},{"line_number":393,"context_line":"            wsgi_to_str(orig_env[\u0027PATH_INFO\u0027]),"},{"line_number":394,"context_line":"            attributes.get(\u0027redirect\u0027) or \u0027\u0027,"},{"line_number":395,"context_line":"            attributes.get(\u0027max_file_size\u0027) or \u00270\u0027,"},{"line_number":396,"context_line":"            attributes.get(\u0027max_file_count\u0027) or \u00270\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_01703e72","line":393,"updated":"2019-05-31 21:58:52.000000000","message":":-( No test change?","commit_id":"cb7457ebfd60221111a32056c1e37683e8828154"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1a019f0e25e86c2a2ea0525cadf720b8bb8bd1cd","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        has_valid_sig \u003d False"},{"line_number":402,"context_line":"        for key in keys:"},{"line_number":403,"context_line":"            # Encode key like in swift.common.utls.get_hmac."},{"line_number":404,"context_line":"            if not isinstance(key, six.binary_type):"},{"line_number":405,"context_line":"                key \u003d key.encode(\u0027utf8\u0027)"},{"line_number":406,"context_line":"            sig \u003d hmac.new(key, hmac_body, sha1).hexdigest()"},{"line_number":407,"context_line":"            if streq_const_time(sig, (attributes.get(\u0027signature\u0027) or"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_703c842e","line":404,"updated":"2019-05-30 19:43:01.000000000","message":"Now it\u0027s *my* turn to ask if this is a py3 check masquerading as a type check ;-)","commit_id":"cb7457ebfd60221111a32056c1e37683e8828154"}],"swift/common/middleware/tempurl.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e117c0fa6584e83696e2c968cb433c4b6d8ba07c","unresolved":false,"context_lines":[{"line_number":651,"context_line":"        \"\"\""},{"line_number":652,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] in self.conf[\u0027methods\u0027]:"},{"line_number":653,"context_line":"            try:"},{"line_number":654,"context_line":"                ver, acc, cont, obj \u003d split_path(env[\u0027PATH_INFO\u0027], 4, 4, True)"},{"line_number":655,"context_line":"            except ValueError:"},{"line_number":656,"context_line":"                return (None, None, None)"},{"line_number":657,"context_line":"            if ver \u003d\u003d \u0027v1\u0027 and obj.strip(\u0027/\u0027):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_cfb2fae6","line":654,"updated":"2019-04-16 21:05:00.000000000","message":"OK, so these are wsgi strings...","commit_id":"df87b4bb91caa52e53386145c262dfcd2cfe5b9e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"8332bee73ecaead457f823ed783d1b93c173fddc","unresolved":false,"context_lines":[{"line_number":651,"context_line":"        \"\"\""},{"line_number":652,"context_line":"        if env[\u0027REQUEST_METHOD\u0027] in self.conf[\u0027methods\u0027]:"},{"line_number":653,"context_line":"            try:"},{"line_number":654,"context_line":"                ver, acc, cont, obj \u003d split_path(env[\u0027PATH_INFO\u0027], 4, 4, True)"},{"line_number":655,"context_line":"            except ValueError:"},{"line_number":656,"context_line":"                return (None, None, None)"},{"line_number":657,"context_line":"            if ver \u003d\u003d \u0027v1\u0027 and obj.strip(\u0027/\u0027):"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_36938f5d","line":654,"in_reply_to":"3fce034c_cfb2fae6","updated":"2019-05-14 23:32:55.000000000","message":"I\u0027m going to fix-up this while Matt is asleep in Australia.","commit_id":"df87b4bb91caa52e53386145c262dfcd2cfe5b9e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e117c0fa6584e83696e2c968cb433c4b6d8ba07c","unresolved":false,"context_lines":[{"line_number":722,"context_line":""},{"line_number":723,"context_line":"        container_info \u003d get_container_info(env, self.app, swift_source\u003d\u0027TU\u0027)"},{"line_number":724,"context_line":"        container_keys \u003d get_tempurl_keys_from_metadata("},{"line_number":725,"context_line":"            container_info.get(\u0027meta\u0027, []))"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"        return ([(ak, ACCOUNT_SCOPE) for ak in account_keys] +"},{"line_number":728,"context_line":"                [(ck, CONTAINER_SCOPE) for ck in container_keys])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_afc76e45","line":725,"updated":"2019-04-16 21:05:00.000000000","message":"...and I really don\u0027t remember what type these will be...","commit_id":"df87b4bb91caa52e53386145c262dfcd2cfe5b9e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e117c0fa6584e83696e2c968cb433c4b6d8ba07c","unresolved":false,"context_lines":[{"line_number":751,"context_line":"        digest \u003d functools.partial(hashlib.new, hash_algorithm)"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        return ["},{"line_number":754,"context_line":"            (get_hmac("},{"line_number":755,"context_line":"                request_method, path, expires, key,"},{"line_number":756,"context_line":"                digest\u003ddigest, ip_range\u003dip_range"},{"line_number":757,"context_line":"            ), scope)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_afcc4e61","line":754,"range":{"start_line":754,"start_character":13,"end_line":754,"end_character":21},"updated":"2019-04-16 21:05:00.000000000","message":"...but hopefully get_hmac wants wsgi? I\u0027m not so sure that it does... certainly *seems like* it wants native: https://github.com/openstack/swift/blob/2.21.0/swift/common/utils.py#L290-L296","commit_id":"df87b4bb91caa52e53386145c262dfcd2cfe5b9e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"8332bee73ecaead457f823ed783d1b93c173fddc","unresolved":false,"context_lines":[{"line_number":751,"context_line":"        digest \u003d functools.partial(hashlib.new, hash_algorithm)"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        return ["},{"line_number":754,"context_line":"            (get_hmac("},{"line_number":755,"context_line":"                request_method, path, expires, key,"},{"line_number":756,"context_line":"                digest\u003ddigest, ip_range\u003dip_range"},{"line_number":757,"context_line":"            ), scope)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_f6c3b755","line":754,"range":{"start_line":754,"start_character":13,"end_line":754,"end_character":21},"in_reply_to":"3fce034c_afcc4e61","updated":"2019-05-14 23:32:55.000000000","message":"Nope! get_hmac wants native! It has explicit .encode(\u0027utf-8\u0027).","commit_id":"df87b4bb91caa52e53386145c262dfcd2cfe5b9e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e117c0fa6584e83696e2c968cb433c4b6d8ba07c","unresolved":false,"context_lines":[{"line_number":795,"context_line":""},{"line_number":796,"context_line":"        :param env: The WSGI environment for the request."},{"line_number":797,"context_line":"        \"\"\""},{"line_number":798,"context_line":"        for h in list(env.keys()):"},{"line_number":799,"context_line":"            if h in self.incoming_allow_headers:"},{"line_number":800,"context_line":"                continue"},{"line_number":801,"context_line":"            for p in self.incoming_allow_headers_startswith:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fce034c_8fa3929e","line":798,"updated":"2019-04-16 21:05:00.000000000","message":"Right, since we\u0027re mutating env. Really, we probably should have done this for py2, too...","commit_id":"df87b4bb91caa52e53386145c262dfcd2cfe5b9e"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"8332bee73ecaead457f823ed783d1b93c173fddc","unresolved":false,"context_lines":[{"line_number":795,"context_line":""},{"line_number":796,"context_line":"        :param env: The WSGI environment for the request."},{"line_number":797,"context_line":"        \"\"\""},{"line_number":798,"context_line":"        for h in list(env.keys()):"},{"line_number":799,"context_line":"            if h in self.incoming_allow_headers:"},{"line_number":800,"context_line":"                continue"},{"line_number":801,"context_line":"            for p in self.incoming_allow_headers_startswith:"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_76ad8799","line":798,"in_reply_to":"3fce034c_8fa3929e","updated":"2019-05-14 23:32:55.000000000","message":"Yeah, but see, we\u0027re using h as key. I think it should work.","commit_id":"df87b4bb91caa52e53386145c262dfcd2cfe5b9e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58959a292f1e90ec67ff4751828f4139dab0bea0","unresolved":false,"context_lines":[{"line_number":362,"context_line":"      meta \u003d get_account_info(...)[\u0027meta\u0027]"},{"line_number":363,"context_line":"      keys \u003d get_tempurl_keys_from_metadata(meta)"},{"line_number":364,"context_line":"    \"\"\""},{"line_number":365,"context_line":"    return [get_valid_utf8_str(value) for key, value in meta.items()"},{"line_number":366,"context_line":"            if key.lower() in (\u0027temp-url-key\u0027, \u0027temp-url-key-2\u0027)]"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_49b72f88","line":365,"range":{"start_line":365,"start_character":12,"end_line":365,"end_character":30},"updated":"2019-05-17 20:34:44.000000000","message":"When we get info, what format do we use for metadata? WSGI or native?\n\nLooking at _prep_headers_to_info it seems like wsgi: https://github.com/openstack/swift/blob/2.21.0/swift/proxy/controllers/base.py#L115-L133\n\nNot sure whether that\u0027s what we *want* or not, though.","commit_id":"fdb2169c1c5044b5d402677e26838fc37d1f3472"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3d9e0d25a4d39f76c5e0297fdd22e9f1247b18e","unresolved":false,"context_lines":[{"line_number":362,"context_line":"      meta \u003d get_account_info(...)[\u0027meta\u0027]"},{"line_number":363,"context_line":"      keys \u003d get_tempurl_keys_from_metadata(meta)"},{"line_number":364,"context_line":"    \"\"\""},{"line_number":365,"context_line":"    return [get_valid_utf8_str(value) for key, value in meta.items()"},{"line_number":366,"context_line":"            if key.lower() in (\u0027temp-url-key\u0027, \u0027temp-url-key-2\u0027)]"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_bbd1fffd","line":365,"range":{"start_line":365,"start_character":12,"end_line":365,"end_character":30},"in_reply_to":"bfb3d3c7_49b72f88","updated":"2019-05-23 00:33:53.000000000","message":"I guess I\u0027ll swap for a wsgi_to_str, but we ought to look harder at what we\u0027re stuffing into memcache and whether we\u0027re caching the same container info from py2 vs py3.","commit_id":"fdb2169c1c5044b5d402677e26838fc37d1f3472"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"1b14604817daeafa29f72e25fc6884414add3cf2","unresolved":false,"context_lines":[{"line_number":362,"context_line":"      meta \u003d get_account_info(...)[\u0027meta\u0027]"},{"line_number":363,"context_line":"      keys \u003d get_tempurl_keys_from_metadata(meta)"},{"line_number":364,"context_line":"    \"\"\""},{"line_number":365,"context_line":"    return [get_valid_utf8_str(value) for key, value in meta.items()"},{"line_number":366,"context_line":"            if key.lower() in (\u0027temp-url-key\u0027, \u0027temp-url-key-2\u0027)]"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_ea43f96a","line":365,"range":{"start_line":365,"start_character":12,"end_line":365,"end_character":30},"in_reply_to":"bfb3d3c7_bbd1fffd","updated":"2019-05-24 22:44:30.000000000","message":"We\u0027re 100% not caching the same info, if headers are in WSGI. And I knew the WSGI cancer was going to bite us.","commit_id":"fdb2169c1c5044b5d402677e26838fc37d1f3472"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58959a292f1e90ec67ff4751828f4139dab0bea0","unresolved":false,"context_lines":[{"line_number":512,"context_line":"            try:"},{"line_number":513,"context_line":"                temp_url_sig \u003d binascii.hexlify(strict_b64decode("},{"line_number":514,"context_line":"                    temp_url_sig + \u0027\u003d\u003d\u0027))"},{"line_number":515,"context_line":"                if six.PY3 and isinstance(temp_url_sig, six.binary_type):"},{"line_number":516,"context_line":"                    temp_url_sig \u003d temp_url_sig.decode(\u0027utf-8\u0027)"},{"line_number":517,"context_line":"            except ValueError:"},{"line_number":518,"context_line":"                return self._invalid(env, start_response)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_343b2e39","line":515,"range":{"start_line":515,"start_character":31,"end_line":515,"end_character":72},"updated":"2019-05-17 20:34:44.000000000","message":"I don\u0027t think this is actually necessary -- hexlify will always produce bytes on py3, no?","commit_id":"fdb2169c1c5044b5d402677e26838fc37d1f3472"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58959a292f1e90ec67ff4751828f4139dab0bea0","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        if temp_url_prefix is None:"},{"line_number":547,"context_line":"            path \u003d \u0027/v1/%s/%s/%s\u0027 % (account, container, obj)"},{"line_number":548,"context_line":"        else:"},{"line_number":549,"context_line":"            if not obj.startswith(temp_url_prefix):"},{"line_number":550,"context_line":"                return self._invalid(env, start_response)"},{"line_number":551,"context_line":"            path \u003d \u0027prefix:/v1/%s/%s/%s\u0027 % (account, container,"},{"line_number":552,"context_line":"                                            temp_url_prefix)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_d476523f","line":549,"updated":"2019-05-17 20:34:44.000000000","message":"So obj came from _get_path_parts() which passes it through wsgi_to_str()...\n\n... and temp_url_prefix came from _get_temp_url_info() which pulls it out of the environment by way of parse_qs()... which\u0027ll leave it wsgi... hmm...","commit_id":"fdb2169c1c5044b5d402677e26838fc37d1f3472"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f3d9e0d25a4d39f76c5e0297fdd22e9f1247b18e","unresolved":false,"context_lines":[{"line_number":546,"context_line":"        if temp_url_prefix is None:"},{"line_number":547,"context_line":"            path \u003d \u0027/v1/%s/%s/%s\u0027 % (account, container, obj)"},{"line_number":548,"context_line":"        else:"},{"line_number":549,"context_line":"            if not obj.startswith(temp_url_prefix):"},{"line_number":550,"context_line":"                return self._invalid(env, start_response)"},{"line_number":551,"context_line":"            path \u003d \u0027prefix:/v1/%s/%s/%s\u0027 % (account, container,"},{"line_number":552,"context_line":"                                            temp_url_prefix)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_db79532f","line":549,"in_reply_to":"bfb3d3c7_d476523f","updated":"2019-05-23 00:33:53.000000000","message":"I stand corrected: parse_qs (for better or worse) has an implied call to quote, with it\u0027s default encoding\u003d\u0027utf8\u0027, errors\u003d\u0027replace\u0027 args.\n\nWhich may mean weird things with replacement chars :-/","commit_id":"fdb2169c1c5044b5d402677e26838fc37d1f3472"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"58959a292f1e90ec67ff4751828f4139dab0bea0","unresolved":false,"context_lines":[{"line_number":623,"context_line":"                elif existing_disposition:"},{"line_number":624,"context_line":"                    disposition_value \u003d existing_disposition"},{"line_number":625,"context_line":"                else:"},{"line_number":626,"context_line":"                    name \u003d basename(wsgi_to_str(env[\u0027PATH_INFO\u0027]).rstrip(\u0027/\u0027))"},{"line_number":627,"context_line":"                    disposition_value \u003d disposition_format(\u0027attachment\u0027,"},{"line_number":628,"context_line":"                                                           name)"},{"line_number":629,"context_line":"                # this is probably just paranoia, I couldn\u0027t actually get a"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_9478daf8","line":626,"range":{"start_line":626,"start_character":36,"end_line":626,"end_character":47},"updated":"2019-05-17 20:34:44.000000000","message":"I was nervous at first, since we\u0027re going to plumb this back into a header (which _should_ be wsgi), but I see that we\u0027re using urllib\u0027s quote up in disposition_format(), so we should be good.","commit_id":"fdb2169c1c5044b5d402677e26838fc37d1f3472"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8cb333acb4ebff8d9bca6657ce6c2ed076129480","unresolved":false,"context_lines":[{"line_number":514,"context_line":"                temp_url_sig \u003d binascii.hexlify(strict_b64decode("},{"line_number":515,"context_line":"                    temp_url_sig + \u0027\u003d\u003d\u0027))"},{"line_number":516,"context_line":"                if not six.PY2:"},{"line_number":517,"context_line":"                    temp_url_sig \u003d temp_url_sig.decode(\u0027utf-8\u0027)"},{"line_number":518,"context_line":"            except ValueError:"},{"line_number":519,"context_line":"                return self._invalid(env, start_response)"},{"line_number":520,"context_line":"        elif len(temp_url_sig) \u003d\u003d 40:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_c11786ed","line":517,"range":{"start_line":517,"start_character":56,"end_line":517,"end_character":61},"updated":"2019-05-31 21:58:52.000000000","message":"Given the output range of hexlify, we should be safe restricting this to ASCII.\n\n*shrug*","commit_id":"cb7457ebfd60221111a32056c1e37683e8828154"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1a019f0e25e86c2a2ea0525cadf720b8bb8bd1cd","unresolved":false,"context_lines":[{"line_number":112,"context_line":"    return func"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"def _prep_headers_to_info(headers, server_type, cancel_wsgi\u003dFalse):"},{"line_number":116,"context_line":"    \"\"\""},{"line_number":117,"context_line":"    Helper method that iterates once over a dict of headers,"},{"line_number":118,"context_line":"    converting all keys to lower case and separating"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_10e3c8a5","line":115,"range":{"start_line":115,"start_character":48,"end_line":115,"end_character":65},"updated":"2019-05-30 19:43:01.000000000","message":"Why shouldn\u0027t this always be true? On py2, wsgi_to_str is a no-op, yeah?","commit_id":"cb7457ebfd60221111a32056c1e37683e8828154"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1a019f0e25e86c2a2ea0525cadf720b8bb8bd1cd","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            key \u003d wsgi_to_str(key)"},{"line_number":128,"context_line":"            # Our tests feed us integers for lenghts, not sure if this is"},{"line_number":129,"context_line":"            # legitimate at all, but it is what it is."},{"line_number":130,"context_line":"            if isinstance(val, str):"},{"line_number":131,"context_line":"                val \u003d wsgi_to_str(val)"},{"line_number":132,"context_line":"        lkey \u003d key.lower()"},{"line_number":133,"context_line":"        if is_user_meta(server_type, lkey):"},{"line_number":134,"context_line":"            meta[strip_user_meta_prefix(server_type, lkey)] \u003d val"}],"source_content_type":"text/x-python","patch_set":4,"id":"bfb3d3c7_9081f8c5","line":131,"range":{"start_line":130,"start_character":12,"end_line":131,"end_character":38},"updated":"2019-05-30 19:43:01.000000000","message":"Yeah, I need this in my patch :-/","commit_id":"cb7457ebfd60221111a32056c1e37683e8828154"}],"test/unit/common/middleware/test_tempurl.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f22f4933d0d601c2429f3dd1c999bdcc6cf1643b","unresolved":false,"context_lines":[{"line_number":1393,"context_line":"        meta \u003d {\"temp-url-key\": \"test\", \"temp-url-key-2\": u\"test2\"}"},{"line_number":1394,"context_line":"        results \u003d tempurl.get_tempurl_keys_from_metadata(meta)"},{"line_number":1395,"context_line":"        for str_value in results:"},{"line_number":1396,"context_line":"            self.assertIsInstance(str_value, six.binary_type)"},{"line_number":1397,"context_line":""},{"line_number":1398,"context_line":"    @mock.patch(\u0027swift.common.middleware.tempurl.time\u0027, return_value\u003d0)"},{"line_number":1399,"context_line":"    def test_get_valid_with_ip_range(self, mock_time):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_ea32195e","line":1396,"updated":"2019-05-24 22:23:21.000000000","message":"The original \u0027str\u0027 should be here, I suspect. The code under test does this:\n\n+    return [wsgi_to_str(value) for key, value in meta.items()\n             if key.lower() in (\u0027temp-url-key\u0027, \u0027temp-url-key-2\u0027)]\n\nstr, right?\n\nThe keys that get_tempurl_instance_from_metadata() produces end in get_hmac, which wants str (although it also decodes utf-8 if we feed it bytes).","commit_id":"f77d002280cfb0c0cee81177fad31fbf56a43a4f"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"bfa17b3a312864b1a4e8172bb610cee7e78bc967","unresolved":false,"context_lines":[{"line_number":1393,"context_line":"        meta \u003d {\"temp-url-key\": \"test\", \"temp-url-key-2\": u\"test2\"}"},{"line_number":1394,"context_line":"        results \u003d tempurl.get_tempurl_keys_from_metadata(meta)"},{"line_number":1395,"context_line":"        for str_value in results:"},{"line_number":1396,"context_line":"            self.assertIsInstance(str_value, six.binary_type)"},{"line_number":1397,"context_line":""},{"line_number":1398,"context_line":"    @mock.patch(\u0027swift.common.middleware.tempurl.time\u0027, return_value\u003d0)"},{"line_number":1399,"context_line":"    def test_get_valid_with_ip_range(self, mock_time):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_8a54bd22","line":1396,"in_reply_to":"bfb3d3c7_cad955f3","updated":"2019-05-24 22:46:38.000000000","message":"The functests may be storing 2 versions of the same thing with b\u0027X-foo\u0027 and u\u0027X-foo\u0027 keys.","commit_id":"f77d002280cfb0c0cee81177fad31fbf56a43a4f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"493d96ae0530482f8fa3313b94843836d2e2732d","unresolved":false,"context_lines":[{"line_number":1393,"context_line":"        meta \u003d {\"temp-url-key\": \"test\", \"temp-url-key-2\": u\"test2\"}"},{"line_number":1394,"context_line":"        results \u003d tempurl.get_tempurl_keys_from_metadata(meta)"},{"line_number":1395,"context_line":"        for str_value in results:"},{"line_number":1396,"context_line":"            self.assertIsInstance(str_value, six.binary_type)"},{"line_number":1397,"context_line":""},{"line_number":1398,"context_line":"    @mock.patch(\u0027swift.common.middleware.tempurl.time\u0027, return_value\u003d0)"},{"line_number":1399,"context_line":"    def test_get_valid_with_ip_range(self, mock_time):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_cad955f3","line":1396,"in_reply_to":"bfb3d3c7_ea32195e","updated":"2019-05-24 22:33:54.000000000","message":"IDK -- I\u0027m increasingly nervous that memcached will essentially store this as unicode for us as a result of json.dumps()\n\nIf I\u0027m right there, when we get a value out of memcached, we shouldn\u0027t be sending it through wsgi_to_str()...\n\nI\u0027m doubting myself. :-( At least functests pass, though.","commit_id":"f77d002280cfb0c0cee81177fad31fbf56a43a4f"}],"tox.ini":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"da89355aab7eed7ca66eb06a5a8e179eaa817ae9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"      test/unit/common/middleware/test_staticweb.py \\"},{"line_number":71,"context_line":"      test/unit/common/middleware/test_symlink.py \\"},{"line_number":72,"context_line":"      test/unit/common/middleware/test_tempauth.py \\"},{"line_number":73,"context_line":"      test/unit/common/middleware/test_tempurl.py \\"},{"line_number":74,"context_line":"      test/unit/common/middleware/test_versioned_writes.py \\"},{"line_number":75,"context_line":"      test/unit/common/middleware/test_xprofile.py \\"},{"line_number":76,"context_line":"      test/unit/common/ring \\"}],"source_content_type":"text/x-properties","patch_set":5,"id":"9fb8cfa7_9aa8b577","line":73,"updated":"2019-06-06 19:11:25.000000000","message":"Should be able to do all of common now \\o/","commit_id":"f3c30f7a0a9f1bd7e1b9a4e9e86aa3f9d063e81d"}]}
