)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thiago da Silva \u003cthiagodasilva@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-13 15:35:52 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Allow internal clients to use reserved namespace"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If912f71d8b0d03369680374e8233da85d8d38f85"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"3fa7e38b_17a250ae","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":3},"updated":"2019-11-14 23:12:40.000000000","message":"This is starting to look like a completed feature; we ought to give it a proper commit message ;-)\n\nOn that note... what\u0027s the upgrade story look like? Our normal, recommended upgrade path (object, container, account, then finally proxy) would prevent it from being an issue for the most part -- the backend will be fully upgraded by the time the proxy starts trying to use the new namespace.\n\nWhat happens if a reserved object somehow gets created *before* the container layer\u0027s been upgraded? I guess... we write down the async pending and let it get resolved later once the containers are upgraded? Similar story for account/container interactions.\n\nWhat happens when an old proxy talks to an account/container DB that\u0027s got reserved names? Once the DBs are willing to eat the update, they need the backend header to expose reserved names, so it should all be safe, right?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thiago da Silva \u003cthiagodasilva@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-11-13 15:35:52 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Allow internal clients to use reserved namespace"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: If912f71d8b0d03369680374e8233da85d8d38f85"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"3fa7e38b_6ecf2357","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":3},"in_reply_to":"3fa7e38b_17a250ae","updated":"2019-11-18 18:27:49.000000000","message":"should all be safe!  :crossed_fingers:","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3eeb4db80e894ae5d4b87ee2ef265fa90bfedba6","unresolved":false,"context_lines":[{"line_number":24,"context_line":"When deploying internal proxys developers and operators may configure"},{"line_number":25,"context_line":"the gatekeeper middleware to translate the X-Allow-Reserved-Names header"},{"line_number":26,"context_line":"to the Backend header so they can manipulate the reserved namespace"},{"line_number":27,"context_line":"directly through the normal API."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: If912f71d8b0d03369680374e8233da85d8d38f85"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"3fa7e38b_7e9bd1c7","line":27,"updated":"2019-11-26 15:28:14.000000000","message":"We need an upgrade impact, you can\u0027t downgrade if you\u0027ve created null containers because they show up in account listings","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"f32fee145428122881b432afb0486a36d88dd120","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"# Set this to true if you want to allow clients to access and manipulate the"},{"line_number":1012,"context_line":"# (normally internal-to-swift) null namespace by including a header like"},{"line_number":1013,"context_line":"#    X-Allow-Reserved-Names: true"},{"line_number":1014,"context_line":"# allow_reserved_name_header \u003d false"},{"line_number":1015,"context_line":"#"},{"line_number":1016,"context_line":"# You can override the default log routing for this filter here:"},{"line_number":1017,"context_line":"# set log_name \u003d gatekeeper"}],"source_content_type":"application/octet-stream","patch_set":26,"id":"3fa7e38b_b546b820","line":1014,"range":{"start_line":1014,"start_character":2,"end_line":1014,"end_character":28},"updated":"2019-11-18 15:57:38.000000000","message":"allow_reserved_name*s*_header","commit_id":"eb8b6388adf337e7db5b15ffb337f230cb3f4005"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"# Set this to true if you want to allow clients to access and manipulate the"},{"line_number":1012,"context_line":"# (normally internal-to-swift) null namespace by including a header like"},{"line_number":1013,"context_line":"#    X-Allow-Reserved-Names: true"},{"line_number":1014,"context_line":"# allow_reserved_name_header \u003d false"},{"line_number":1015,"context_line":"#"},{"line_number":1016,"context_line":"# You can override the default log routing for this filter here:"},{"line_number":1017,"context_line":"# set log_name \u003d gatekeeper"}],"source_content_type":"application/octet-stream","patch_set":26,"id":"3fa7e38b_5ba69556","line":1014,"range":{"start_line":1014,"start_character":2,"end_line":1014,"end_character":28},"in_reply_to":"3fa7e38b_b546b820","updated":"2019-11-18 18:27:49.000000000","message":"oh, good, it\u0027s implemented correctly - it\u0027s a just a typo in the example config","commit_id":"eb8b6388adf337e7db5b15ffb337f230cb3f4005"}],"swift/account/backend.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00d99f947499f94f65dd2d677d2c706a87444053","unresolved":false,"context_lines":[{"line_number":425,"context_line":"                elif prefix:"},{"line_number":426,"context_line":"                    query +\u003d \u0027 name \u003e\u003d ? AND\u0027"},{"line_number":427,"context_line":"                    query_args.append(prefix)"},{"line_number":428,"context_line":"                # sqlite, you\u0027re drunk; why doesn\u0027t this work!?"},{"line_number":429,"context_line":"                \"\"\""},{"line_number":430,"context_line":"                if not allow_null:"},{"line_number":431,"context_line":"                    query +\u003d \u0027 name NOT LIKE ? AND\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_0199e077","line":428,"updated":"2019-10-04 22:49:03.000000000","message":"It\u0027s like it was written in C or something ;-)","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00d99f947499f94f65dd2d677d2c706a87444053","unresolved":false,"context_lines":[{"line_number":429,"context_line":"                \"\"\""},{"line_number":430,"context_line":"                if not allow_null:"},{"line_number":431,"context_line":"                    query +\u003d \u0027 name NOT LIKE ? AND\u0027"},{"line_number":432,"context_line":"                    query_args.append(\u0027%%\\x00%%\u0027)"},{"line_number":433,"context_line":"                \"\"\""},{"line_number":434,"context_line":"                if self.get_db_version(conn) \u003c 1:"},{"line_number":435,"context_line":"                    query +\u003d \u0027 +deleted \u003d 0\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_a189ec26","line":432,"range":{"start_line":432,"start_character":39,"end_line":432,"end_character":41},"updated":"2019-10-04 22:49:03.000000000","message":"Not that it really matters, since this doesn\u0027t work, but you only need one % on either side since it\u0027s in the args.","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6c1eff903a436df684511a5ffa9a4d6402a2efd2","unresolved":false,"context_lines":[{"line_number":429,"context_line":"                \"\"\""},{"line_number":430,"context_line":"                if not allow_null:"},{"line_number":431,"context_line":"                    query +\u003d \u0027 name NOT LIKE ? AND\u0027"},{"line_number":432,"context_line":"                    query_args.append(\u0027%%\\x00%%\u0027)"},{"line_number":433,"context_line":"                \"\"\""},{"line_number":434,"context_line":"                if self.get_db_version(conn) \u003c 1:"},{"line_number":435,"context_line":"                    query +\u003d \u0027 +deleted \u003d 0\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_78915746","line":432,"range":{"start_line":432,"start_character":39,"end_line":432,"end_character":41},"in_reply_to":"3fa7e38b_a189ec26","updated":"2019-10-07 13:45:28.000000000","message":"OH!\n\nyeah that makes sense, when I did \u0027%\\x00%\u0027 I got \"%\" because the null terminates the arg, when I did \u0027%%\\x00%%\u0027 I got \"%%\" for the same reason ... \n\nSo then I should be able to craft a test using \u0027%00\u0027 in the prefix or marker that proves it\u0027s already also not working correctly... and then we\u0027re hozed.","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00d99f947499f94f65dd2d677d2c706a87444053","unresolved":false,"context_lines":[{"line_number":451,"context_line":"                # prefixes are now handled in the SQL statement."},{"line_number":452,"context_line":"                if prefix is None or not delimiter:"},{"line_number":453,"context_line":"                    return [r for r in curs"},{"line_number":454,"context_line":"                            if \u0027\\x00\u0027 not in r[0] or allow_null]"},{"line_number":455,"context_line":""},{"line_number":456,"context_line":"                # We have a delimiter and a prefix (possibly empty string) to"},{"line_number":457,"context_line":"                # handle"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_418fd82d","line":454,"range":{"start_line":454,"start_character":28,"end_line":454,"end_character":63},"updated":"2019-10-04 22:49:03.000000000","message":"This messes with our LIMIT in the query :-/","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            \u0027\u0027\u0027).fetchone())"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def list_containers_iter(self, limit, marker, end_marker, prefix,"},{"line_number":358,"context_line":"                             delimiter, reverse\u003dFalse, allow_reserved\u003dFalse):"},{"line_number":359,"context_line":"        \"\"\""},{"line_number":360,"context_line":"        Get a list of containers sorted by name starting at marker onward, up"},{"line_number":361,"context_line":"        to limit entries. Entries will begin with the prefix and will not have"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_a79abdc1","line":358,"range":{"start_line":358,"start_character":55,"end_line":358,"end_character":69},"updated":"2019-11-23 08:06:35.000000000","message":"reaper should be updated to set this to True.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":355,"context_line":"            \u0027\u0027\u0027).fetchone())"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"    def list_containers_iter(self, limit, marker, end_marker, prefix,"},{"line_number":358,"context_line":"                             delimiter, reverse\u003dFalse, allow_reserved\u003dFalse):"},{"line_number":359,"context_line":"        \"\"\""},{"line_number":360,"context_line":"        Get a list of containers sorted by name starting at marker onward, up"},{"line_number":361,"context_line":"        to limit entries. Entries will begin with the prefix and will not have"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_5ca94c8c","line":358,"range":{"start_line":358,"start_character":55,"end_line":358,"end_character":69},"in_reply_to":"3fa7e38b_a79abdc1","updated":"2019-11-25 22:30:44.000000000","message":"Done","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                        curs.close()"},{"line_number":446,"context_line":"                        return results"},{"line_number":447,"context_line":"                    end \u003d name.find(delimiter, len(prefix))"},{"line_number":448,"context_line":"                    if end \u003e\u003d 0:"},{"line_number":449,"context_line":"                        if reverse:"},{"line_number":450,"context_line":"                            end_marker \u003d name[:end + len(delimiter)]"},{"line_number":451,"context_line":"                        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_473bc9c6","line":448,"updated":"2019-11-23 08:06:35.000000000","message":"I kinda wish I\u0027d done this as a separate patch... might be worth backporting? Certainly seems quite separate... the bug just got noticeably *worse* when trying to use \\x00 as a delimiter.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"483630799a4a965064b2673c746530c42c0e7845","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                        curs.close()"},{"line_number":446,"context_line":"                        return results"},{"line_number":447,"context_line":"                    end \u003d name.find(delimiter, len(prefix))"},{"line_number":448,"context_line":"                    if end \u003e\u003d 0:"},{"line_number":449,"context_line":"                        if reverse:"},{"line_number":450,"context_line":"                            end_marker \u003d name[:end + len(delimiter)]"},{"line_number":451,"context_line":"                        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_46bb1974","line":448,"in_reply_to":"3fa7e38b_2c6062cf","updated":"2020-01-03 00:36:29.000000000","message":"Pushed up https://review.opendev.org/700964 to add a unit test demonstrating the bad, and https://review.opendev.org/700965 to backport this one fix and the unit test to stable/train.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3eeb4db80e894ae5d4b87ee2ef265fa90bfedba6","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                        curs.close()"},{"line_number":446,"context_line":"                        return results"},{"line_number":447,"context_line":"                    end \u003d name.find(delimiter, len(prefix))"},{"line_number":448,"context_line":"                    if end \u003e\u003d 0:"},{"line_number":449,"context_line":"                        if reverse:"},{"line_number":450,"context_line":"                            end_marker \u003d name[:end + len(delimiter)]"},{"line_number":451,"context_line":"                        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_b31982d2","line":448,"in_reply_to":"3fa7e38b_473bc9c6","updated":"2019-11-26 15:28:14.000000000","message":"ok, but what does this even DO?  Is there an open bug?\n\nreverting this to pure inequality doesn\u0027t cause any unittest failures in account.test_backend\n\nI tried to break the  same line in container backend (which is subtlety different, so that\u0027s maybe not great) and THAT didn\u0027t break anything EITHER\n\n... so I don\u0027t really understand how this got changed or to what purposes?","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3f008880123115f15b302ee95ff6438b6342c53","unresolved":false,"context_lines":[{"line_number":445,"context_line":"                        curs.close()"},{"line_number":446,"context_line":"                        return results"},{"line_number":447,"context_line":"                    end \u003d name.find(delimiter, len(prefix))"},{"line_number":448,"context_line":"                    if end \u003e\u003d 0:"},{"line_number":449,"context_line":"                        if reverse:"},{"line_number":450,"context_line":"                            end_marker \u003d name[:end + len(delimiter)]"},{"line_number":451,"context_line":"                        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_2c6062cf","line":448,"in_reply_to":"3fa7e38b_b31982d2","updated":"2019-12-04 22:59:42.000000000","message":"It\u0027s the account-level equivalent of https://bugs.launchpad.net/swift/+bug/1475018","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"swift/account/server.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c7d3175571e943530f8f055c1c439c1f75fa1013","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        start_time \u003d time.time()"},{"line_number":284,"context_line":"        req \u003d Request(env)"},{"line_number":285,"context_line":"        self.logger.txn_id \u003d req.headers.get(\u0027x-trans-id\u0027, None)"},{"line_number":286,"context_line":"        if not check_utf8(wsgi_to_str(req.path_info), internal\u003dTrue):"},{"line_number":287,"context_line":"            res \u003d HTTPPreconditionFailed(body\u003d\u0027Invalid UTF8 or contains NULL\u0027)"},{"line_number":288,"context_line":"        else:"},{"line_number":289,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_619f7403","line":286,"updated":"2019-09-19 18:06:26.000000000","message":"we could easily use req.allow_null_bytes here as well if the proxy is forwarding the backend headers...","commit_id":"f16f398d589b4c22ef6b468e7a40a8bb06bfdc05"}],"swift/common/constraints.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86e158fcfad4f7d2634a4e5977ab1ad506f6a511","unresolved":false,"context_lines":[{"line_number":346,"context_line":"    return request"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"def check_utf8(string, internal\u003dFalse):"},{"line_number":350,"context_line":"    \"\"\""},{"line_number":351,"context_line":"    Validate if a string is valid UTF-8 str or unicode and that it"},{"line_number":352,"context_line":"    does not contain any reserved characters."}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_5670ce40","line":349,"updated":"2019-11-14 19:48:52.000000000","message":"Looks like slo and bulk middlewares also call this -- might want to think about whether they should respect req.allow_reserved_names, too.\n\nLater, though. Can definitely be future work, if and when we find a need for it.","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        if any(0xD800 \u003c\u003d ord(codepoint) \u003c\u003d 0xDFFF"},{"line_number":384,"context_line":"               for codepoint in decoded):"},{"line_number":385,"context_line":"            return False"},{"line_number":386,"context_line":"        if b\u0027\\x00\u0027 !\u003d utils.RESERVED_BYTE and b\u0027\\x00\u0027 in encoded:"},{"line_number":387,"context_line":"            return False"},{"line_number":388,"context_line":"        return True if internal else utils.RESERVED_BYTE not in encoded"},{"line_number":389,"context_line":"    # If string is unicode, decode() will raise UnicodeEncodeError"},{"line_number":390,"context_line":"    # So, we should catch both UnicodeDecodeError \u0026 UnicodeEncodeError"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_2769edbc","line":387,"range":{"start_line":386,"start_character":8,"end_line":387,"end_character":24},"updated":"2019-11-23 08:06:35.000000000","message":"We should be able to drop this now; I think it\u0027s a leftover from when we were debating about trying to claw back \\x01 instead.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        if any(0xD800 \u003c\u003d ord(codepoint) \u003c\u003d 0xDFFF"},{"line_number":384,"context_line":"               for codepoint in decoded):"},{"line_number":385,"context_line":"            return False"},{"line_number":386,"context_line":"        if b\u0027\\x00\u0027 !\u003d utils.RESERVED_BYTE and b\u0027\\x00\u0027 in encoded:"},{"line_number":387,"context_line":"            return False"},{"line_number":388,"context_line":"        return True if internal else utils.RESERVED_BYTE not in encoded"},{"line_number":389,"context_line":"    # If string is unicode, decode() will raise UnicodeEncodeError"},{"line_number":390,"context_line":"    # So, we should catch both UnicodeDecodeError \u0026 UnicodeEncodeError"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_fc93585a","line":387,"range":{"start_line":386,"start_character":8,"end_line":387,"end_character":24},"in_reply_to":"3fa7e38b_2769edbc","updated":"2019-11-25 22:30:44.000000000","message":"Done","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"swift/common/internal_client.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def iter_containers("},{"line_number":364,"context_line":"            self, account, marker\u003d\u0027\u0027, end_marker\u003d\u0027\u0027, prefix\u003d\u0027\u0027,"},{"line_number":365,"context_line":"            acceptable_statuses\u003d(2, HTTP_NOT_FOUND)):"},{"line_number":366,"context_line":"        \"\"\""},{"line_number":367,"context_line":"        Returns an iterator of containers dicts from an account."},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_6d7cc2ea","line":365,"updated":"2019-11-21 17:37:53.000000000","message":"Oh hey, might need a way to *discover* those reserved containers...","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":489,"context_line":"        \"\"\""},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"        path \u003d self.make_path(account, container)"},{"line_number":492,"context_line":"        resp \u003d self.make_request(\u0027HEAD\u0027, path, {}, (2, HTTP_NOT_FOUND))"},{"line_number":493,"context_line":"        return not resp.status_int \u003d\u003d HTTP_NOT_FOUND"},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"    def create_container("}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_6d92824d","line":492,"updated":"2019-11-21 17:37:53.000000000","message":"Hmm... should this work with reserved names?","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def get_container_metadata("},{"line_number":537,"context_line":"            self, account, container, metadata_prefix\u003d\u0027\u0027,"},{"line_number":538,"context_line":"            acceptable_statuses\u003d(2,), params\u003dNone):"},{"line_number":539,"context_line":"        \"\"\"Gets container metadata."},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"        :param account: The container\u0027s account."}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_4d8a261b","line":538,"updated":"2019-11-21 17:37:53.000000000","message":"Good catch on delete_container! We should probably update this guy, too...","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    def iter_objects("},{"line_number":562,"context_line":"            self, account, container, marker\u003d\u0027\u0027, end_marker\u003d\u0027\u0027, prefix\u003d\u0027\u0027,"},{"line_number":563,"context_line":"            acceptable_statuses\u003d(2, HTTP_NOT_FOUND)):"},{"line_number":564,"context_line":"        \"\"\""},{"line_number":565,"context_line":"        Returns an iterator of object dicts from a container."},{"line_number":566,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_ed8f522b","line":563,"updated":"2019-11-21 17:37:53.000000000","message":"And here...","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":585,"context_line":""},{"line_number":586,"context_line":"    def set_container_metadata("},{"line_number":587,"context_line":"            self, account, container, metadata, metadata_prefix\u003d\u0027\u0027,"},{"line_number":588,"context_line":"            acceptable_statuses\u003d(2,)):"},{"line_number":589,"context_line":"        \"\"\""},{"line_number":590,"context_line":"        Sets container metadata.  A call to this will add to the container"},{"line_number":591,"context_line":"        metadata and not overwrite all of it with values in the metadata dict."}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_6d092293","line":588,"updated":"2019-11-21 17:37:53.000000000","message":"here...","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":746,"context_line":""},{"line_number":747,"context_line":"    def set_object_metadata("},{"line_number":748,"context_line":"            self, account, container, obj, metadata,"},{"line_number":749,"context_line":"            metadata_prefix\u003d\u0027\u0027, acceptable_statuses\u003d(2,)):"},{"line_number":750,"context_line":"        \"\"\""},{"line_number":751,"context_line":"        Sets an object\u0027s metadata.  The object\u0027s metadata will be overwritten"},{"line_number":752,"context_line":"        by the values in the metadata dict."}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_6d17e2a4","line":749,"updated":"2019-11-21 17:37:53.000000000","message":"here...","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3eeb4db80e894ae5d4b87ee2ef265fa90bfedba6","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        headers \u003d dict(headers)"},{"line_number":186,"context_line":"        headers[\u0027user-agent\u0027] \u003d self.user_agent"},{"line_number":187,"context_line":"        headers[\u0027x-backend-allow-reserved-names\u0027] \u003d \u0027true\u0027"},{"line_number":188,"context_line":"        for attempt in range(self.request_tries):"},{"line_number":189,"context_line":"            resp \u003d exc_type \u003d exc_value \u003d exc_traceback \u003d None"},{"line_number":190,"context_line":"            req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_deac4538","line":187,"updated":"2019-11-26 15:28:14.000000000","message":"i wonder if somepoint we\u0027ll want this to be more like a setdefault kinda thing...\n\noh well, \"jump that bridge...\"","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":515,"context_line":"        self.make_request(\u0027PUT\u0027, path, headers, acceptable_statuses)"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def delete_container("},{"line_number":518,"context_line":"            self, account, container, headers\u003dNone,"},{"line_number":519,"context_line":"            acceptable_statuses\u003d(2, HTTP_NOT_FOUND)):"},{"line_number":520,"context_line":"        \"\"\""},{"line_number":521,"context_line":"        Deletes a container."}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_e75e7511","line":518,"range":{"start_line":518,"start_character":38,"end_line":518,"end_character":50},"updated":"2019-11-23 08:06:35.000000000","message":"No longer strictly necessary, but probably a good idea.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def upload_object("},{"line_number":777,"context_line":"            self, fobj, account, container, obj, headers\u003dNone,"},{"line_number":778,"context_line":"            acceptable_statuses\u003d(2,)):"},{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":"        :param fobj: File object to read object\u0027s content from."},{"line_number":781,"context_line":"        :param account: The object\u0027s account."}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_075ab11c","line":778,"range":{"start_line":778,"start_character":12,"end_line":778,"end_character":36},"updated":"2019-11-23 08:06:35.000000000","message":"Getting a little out of scope, but we want it for our probe tests.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"swift/common/middleware/gatekeeper.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00d99f947499f94f65dd2d677d2c706a87444053","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.shunt_x_timestamp \u003d config_true_value("},{"line_number":77,"context_line":"            conf.get(\u0027shunt_inbound_x_timestamp\u0027, \u0027true\u0027))"},{"line_number":78,"context_line":"        self.shunt_x_allow_null_byte \u003d config_true_value("},{"line_number":79,"context_line":"            conf.get(\u0027shunt_inbound_x_allow_null_byte\u0027, \u0027false\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __call__(self, env, start_response):"},{"line_number":82,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_21cbbc53","line":79,"updated":"2019-10-04 22:49:03.000000000","message":"I\u0027m probably bike-shedding, but I dunno about the option name...\n\nLike, it\u0027s weird that there are these two options that look like shunt_inbound_\u003cheader\u003e, but they have different default values. Despite that, their default *behaviors* at least *feel* kinda similar -- don\u0027t let the client futz with this thing that (generally speaking) should be internal to the cluster.\n\nHm.","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6c1eff903a436df684511a5ffa9a4d6402a2efd2","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.shunt_x_timestamp \u003d config_true_value("},{"line_number":77,"context_line":"            conf.get(\u0027shunt_inbound_x_timestamp\u0027, \u0027true\u0027))"},{"line_number":78,"context_line":"        self.shunt_x_allow_null_byte \u003d config_true_value("},{"line_number":79,"context_line":"            conf.get(\u0027shunt_inbound_x_allow_null_byte\u0027, \u0027false\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __call__(self, env, start_response):"},{"line_number":82,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_5889fb23","line":79,"in_reply_to":"3fa7e38b_21cbbc53","updated":"2019-10-07 13:45:28.000000000","message":"I think we should just start working to change the default x-timestamp value - it\u0027s probably only \u0027true\u0027 for backwards compat because container-sync\n\nI honestly am surprised it\u0027s not false by default... we don\u0027t want clients messing with x-timestamp","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"e7adb226ac26e06fbbdeb9d899c850d355ee40e9","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            self.logger.debug(\u0027shunted request headers: %s\u0027 %"},{"line_number":92,"context_line":"                              [(\u0027X-Timestamp\u0027, ts)])"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if \u0027X-Allow-Reserved-Byte\u0027 in req.headers \\"},{"line_number":95,"context_line":"                and self.shunt_x_allow_reserved_byte:"},{"line_number":96,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Byte\u0027] \u003d \\"},{"line_number":97,"context_line":"                req.headers[\u0027X-Allow-Reserved-Byte\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_81b28948","line":94,"updated":"2019-10-24 15:34:14.000000000","message":"should it be \u0027X-Allow-Reserved-Names\u0027 as defined in swob.py?","commit_id":"d81dc8a7218d52407c7b3066fdf80a33f1562c7b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2f49cd6b2cb1746e35bf968c101151c914d194d2","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            self.logger.debug(\u0027shunted request headers: %s\u0027 %"},{"line_number":92,"context_line":"                              [(\u0027X-Timestamp\u0027, ts)])"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if \u0027X-Allow-Reserved-Byte\u0027 in req.headers \\"},{"line_number":95,"context_line":"                and self.shunt_x_allow_reserved_byte:"},{"line_number":96,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Byte\u0027] \u003d \\"},{"line_number":97,"context_line":"                req.headers[\u0027X-Allow-Reserved-Byte\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa7e38b_62a66cae","line":94,"in_reply_to":"3fa7e38b_81b28948","updated":"2019-10-24 17:51:00.000000000","message":"yes, and i\u0027m missing a test!  #willfix","commit_id":"d81dc8a7218d52407c7b3066fdf80a33f1562c7b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1407428c8ed19e68d599be66aba7837a4a10e8e7","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.shunt_x_timestamp \u003d config_true_value("},{"line_number":77,"context_line":"            conf.get(\u0027shunt_inbound_x_timestamp\u0027, \u0027true\u0027))"},{"line_number":78,"context_line":"        self.shunt_x_allow_reserved_names \u003d config_true_value("},{"line_number":79,"context_line":"            conf.get(\u0027shunt_inbound_x_allow_reserved_names\u0027, \u0027false\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __call__(self, env, start_response):"},{"line_number":82,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_cf5eb278","line":79,"updated":"2019-11-08 04:03:32.000000000","message":"this needs to go in etc example templates","commit_id":"318794efb29c90cdf1e600756752dbda9cea7eea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86e158fcfad4f7d2634a4e5977ab1ad506f6a511","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.shunt_x_timestamp \u003d config_true_value("},{"line_number":77,"context_line":"            conf.get(\u0027shunt_inbound_x_timestamp\u0027, \u0027true\u0027))"},{"line_number":78,"context_line":"        self.shunt_x_allow_reserved_names \u003d config_true_value("},{"line_number":79,"context_line":"            conf.get(\u0027shunt_inbound_x_allow_reserved_names\u0027, \u0027false\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __call__(self, env, start_response):"},{"line_number":82,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_96d5e649","line":79,"updated":"2019-11-14 19:48:52.000000000","message":"This still smells weird to me.\n\n shunt_inbound_x_timestamp\n\ntakes a client-provided system header and shifts it somewhere harmless (but still accessible for things like container sync if they need it), but then\n\n shunt_inbound_x_allow_reserved_names\n\ntakes a client-provided header that would otherwise be harmless and shifts it somewhere privileged.\n\nFor two names that look so similar, these feel like very different behaviors -- which is reinforced by the fact that they have different defaults. OTOH, I also don\u0027t have a better suggestion in mind...","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        self.shunt_x_timestamp \u003d config_true_value("},{"line_number":77,"context_line":"            conf.get(\u0027shunt_inbound_x_timestamp\u0027, \u0027true\u0027))"},{"line_number":78,"context_line":"        self.shunt_x_allow_reserved_names \u003d config_true_value("},{"line_number":79,"context_line":"            conf.get(\u0027shunt_inbound_x_allow_reserved_names\u0027, \u0027false\u0027))"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def __call__(self, env, start_response):"},{"line_number":82,"context_line":"        req \u003d Request(env)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_4ee827de","line":79,"in_reply_to":"3fa7e38b_96d5e649","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027X-Allow-Reserved-Names\u0027 in req.headers \\"},{"line_number":95,"context_line":"                and self.shunt_x_allow_reserved_names:"},{"line_number":96,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Names\u0027] \u003d \\"},{"line_number":97,"context_line":"                req.headers[\u0027X-Allow-Reserved-Names\u0027]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        def gatekeeper_response(status, response_headers, exc_info\u003dNone):"},{"line_number":100,"context_line":"            def fixed_response_headers():"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_5c41cfa5","line":97,"updated":"2019-11-14 23:12:40.000000000","message":"Should we pop() the original, like we do for X-Timestamp?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027X-Allow-Reserved-Names\u0027 in req.headers \\"},{"line_number":95,"context_line":"                and self.shunt_x_allow_reserved_names:"},{"line_number":96,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Names\u0027] \u003d \\"},{"line_number":97,"context_line":"                req.headers[\u0027X-Allow-Reserved-Names\u0027]"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        def gatekeeper_response(status, response_headers, exc_info\u003dNone):"},{"line_number":100,"context_line":"            def fixed_response_headers():"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_6ece4384","line":97,"in_reply_to":"3fa7e38b_5c41cfa5","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        if \u0027X-Allow-Reserved-Names\u0027 in req.headers \\"},{"line_number":95,"context_line":"                and self.allow_reserved_names_header:"},{"line_number":96,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Names\u0027] \u003d \\"},{"line_number":97,"context_line":"                req.headers.pop(\u0027X-Allow-Reserved-Names\u0027)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        def gatekeeper_response(status, response_headers, exc_info\u003dNone):"},{"line_number":100,"context_line":"            def fixed_response_headers():"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_15509ad4","line":97,"updated":"2019-11-23 08:06:35.000000000","message":"...I\u0027m\u0027a just put this out there... https://github.com/tipabu/no_op_gatekeeper","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c3f858cbd81160eac387f35c4664e663d750743","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                              [(\u0027X-Timestamp\u0027, ts)])"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        if \u0027X-Allow-Reserved-Names\u0027 in req.headers \\"},{"line_number":95,"context_line":"                and self.allow_reserved_names_header:"},{"line_number":96,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Names\u0027] \u003d \\"},{"line_number":97,"context_line":"                req.headers.pop(\u0027X-Allow-Reserved-Names\u0027)"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_e3f13e98","line":95,"range":{"start_line":95,"start_character":20,"end_line":95,"end_character":52},"updated":"2019-12-20 06:58:15.000000000","message":"In adding some versioning to the sharding probe tests, I kinda wish this was gated on reseller-admin-ness instead...\n\nBut that\u0027s hard to determine here, where we\u0027re pretty far left of auth.","commit_id":"698717d886b2b55ea9b490719851c85c20b57240"}],"swift/common/middleware/listing_formats.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1c635280b91c22fec757111801ef36f0fe9aa7bc","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    def filter_null(self, listing):"},{"line_number":126,"context_line":"        new_listing \u003d []"},{"line_number":127,"context_line":"        for entry in list(listing):"},{"line_number":128,"context_line":"            if \u0027\\x00\u0027 in entry[\u0027name\u0027]:"},{"line_number":129,"context_line":"                # XXX we need to get the resource name too"},{"line_number":130,"context_line":"                self.app.logger.warning("},{"line_number":131,"context_line":"                    \u0027bad news %r all up in ur listing\u0027, entry[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f9ca7b6c","line":128,"range":{"start_line":128,"start_character":32,"end_line":128,"end_character":36},"updated":"2019-10-01 19:19:44.000000000","message":"Can\u0027t forget about delimiter queries!","commit_id":"6d8edcbe0715a16c9b92f0420a8d85a12ca73647"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1c635280b91c22fec757111801ef36f0fe9aa7bc","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        new_listing \u003d []"},{"line_number":127,"context_line":"        for entry in list(listing):"},{"line_number":128,"context_line":"            if \u0027\\x00\u0027 in entry[\u0027name\u0027]:"},{"line_number":129,"context_line":"                # XXX we need to get the resource name too"},{"line_number":130,"context_line":"                self.app.logger.warning("},{"line_number":131,"context_line":"                    \u0027bad news %r all up in ur listing\u0027, entry[\u0027name\u0027])"},{"line_number":132,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_9974a700","line":129,"range":{"start_line":129,"start_character":22,"end_line":129,"end_character":58},"updated":"2019-10-01 19:19:44.000000000","message":"Fortunately, the __call__ already picked out account/container... should be easy enough to plumb in.","commit_id":"6d8edcbe0715a16c9b92f0420a8d85a12ca73647"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1c635280b91c22fec757111801ef36f0fe9aa7bc","unresolved":false,"context_lines":[{"line_number":224,"context_line":"            elif out_content_type \u003d\u003d \u0027text/plain\u0027:"},{"line_number":225,"context_line":"                body \u003d listing_to_text(listing)"},{"line_number":226,"context_line":"            else:"},{"line_number":227,"context_line":"                body \u003d json.dumps(listing)"},{"line_number":228,"context_line":"        except KeyError:"},{"line_number":229,"context_line":"            # listing was in a bad format -- funky static web listing??"},{"line_number":230,"context_line":"            start_response(status, headers)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_797c4beb","line":227,"updated":"2019-10-01 19:19:44.000000000","message":"Gotta encode","commit_id":"6d8edcbe0715a16c9b92f0420a8d85a12ca73647"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90599a79783c856dbcdac176163934a125409225","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        new_listing \u003d []"},{"line_number":128,"context_line":"        for entry in list(listing):"},{"line_number":129,"context_line":"            for key in (\u0027name\u0027, \u0027subdir\u0027):"},{"line_number":130,"context_line":"                if RESERVED_BYTE in entry.get(key, \u0027\u0027):"},{"line_number":131,"context_line":"                    if container:"},{"line_number":132,"context_line":"                        self.app.logger.warning("},{"line_number":133,"context_line":"                            \u0027Container listing for %s/%s had \u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_410b9523","line":130,"range":{"start_line":130,"start_character":19,"end_line":130,"end_character":32},"updated":"2019-10-17 21:30:16.000000000","message":"OK zuul, sure, this needs to be RESERVED_STR...","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c17de6a224e4d9497060bfab265dae9e6797cca4","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        new_listing \u003d []"},{"line_number":128,"context_line":"        for entry in list(listing):"},{"line_number":129,"context_line":"            for key in (\u0027name\u0027, \u0027subdir\u0027):"},{"line_number":130,"context_line":"                if RESERVED_BYTE in entry.get(key, \u0027\u0027):"},{"line_number":131,"context_line":"                    if container:"},{"line_number":132,"context_line":"                        self.app.logger.warning("},{"line_number":133,"context_line":"                            \u0027Container listing for %s/%s had \u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_0548295a","line":130,"range":{"start_line":130,"start_character":19,"end_line":130,"end_character":32},"in_reply_to":"3fa7e38b_410b9523","updated":"2019-10-21 14:10:22.000000000","message":"Done","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            listing \u003d self.filter_reserved(listing, acct, cont)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        try:"},{"line_number":229,"context_line":"            if out_content_type.endswith(\u0027/xml\u0027):"},{"line_number":230,"context_line":"                if cont:"},{"line_number":231,"context_line":"                    body \u003d container_to_xml(listing, cont)"},{"line_number":232,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_3cee53ed","line":229,"updated":"2019-11-14 23:12:40.000000000","message":"Huh. Looks like etree will put the raw null byte in the XML doc -- I guess that\u0027s as sane as anything? I was kinda expecting a \u0026#0; -- but I guess that\u0027s not valid XML? Neither is the raw byte... or at any rate, I haven\u0027t found an XML parser willing to eat it yet.\n\n \u003e\u003e\u003e doc \u003d b\u0027\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e\u003cdoc\u003e\\x00\u003c/doc\u003e\u0027\n \u003e\u003e\u003e lxml.etree.fromstring(doc)\n Traceback (most recent call last):\n   File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n   File \"src/lxml/etree.pyx\", line 3211, in lxml.etree.fromstring\n   File \"src/lxml/parser.pxi\", line 1877, in lxml.etree._parseMemoryDocument\n   File \"src/lxml/parser.pxi\", line 1765, in lxml.etree._parseDoc\n   File \"src/lxml/parser.pxi\", line 1127, in lxml.etree._BaseParser._parseDoc\n   File \"src/lxml/parser.pxi\", line 601, in lxml.etree._ParserContext._handleParseResultDoc\n   File \"src/lxml/parser.pxi\", line 711, in lxml.etree._handleParseResult\n   File \"src/lxml/parser.pxi\", line 640, in lxml.etree._raiseParseError\n   File \"\u003cstring\u003e\", line 1\n lxml.etree.XMLSyntaxError: Premature end of data in tag doc line 1, line 1, column 44\n \u003e\u003e\u003e xml.etree.ElementTree.fromstring(doc)\n Traceback (most recent call last):\n   File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n   File \"/usr/lib64/python3.7/xml/etree/ElementTree.py\", line 1315, in XML\n     parser.feed(text)\n xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 1, column 43\n\nSeems like txt output would likely also be confusing -- should we make the logic above more like\n\n if out_content_type !\u003d \u0027application/json\u0027 or \\\n         not req.allow_reserved_names:\n     listing \u003d self.filter_reserved(listing, acct, cont)\n\n?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c6b6424b901758bc4607f453e60fe4d8c6ed7244","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            for key in (\u0027name\u0027, \u0027subdir\u0027):"},{"line_number":130,"context_line":"                if RESERVED_STR in entry.get(key, \u0027\u0027):"},{"line_number":131,"context_line":"                    if container:"},{"line_number":132,"context_line":"                        self.app.logger.warning("},{"line_number":133,"context_line":"                            \u0027Container listing for %s/%s had \u0027"},{"line_number":134,"context_line":"                            \u0027reserved byte in %s: %r\u0027,"},{"line_number":135,"context_line":"                            account, container, key, entry[key])"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_ae8c14d8","line":132,"range":{"start_line":132,"start_character":29,"end_line":132,"end_character":39},"updated":"2019-11-20 00:21:57.000000000","message":"This is making some bad assumptions about the app that was passed to the filter factory...\n\nWe should set up our own logger.","commit_id":"cc3ea64d18df2f400caf1f9f1e5bd6f7bec627fc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"85372a29524f1b5db30f4c2606421fbcf00ec4bd","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            for key in (\u0027name\u0027, \u0027subdir\u0027):"},{"line_number":131,"context_line":"                if RESERVED_STR in entry.get(key, \u0027\u0027):"},{"line_number":132,"context_line":"                    if container:"},{"line_number":133,"context_line":"                        self.app.logger.warning("},{"line_number":134,"context_line":"                            \u0027Container listing for %s/%s had \u0027"},{"line_number":135,"context_line":"                            \u0027reserved byte in %s: %r\u0027,"},{"line_number":136,"context_line":"                            account, container, key, entry[key])"}],"source_content_type":"text/x-python","patch_set":29,"id":"3fa7e38b_808235c6","line":133,"range":{"start_line":133,"start_character":29,"end_line":133,"end_character":32},"updated":"2019-11-20 22:58:55.000000000","message":"Still got that app.","commit_id":"ec8866610a64909ae366602141172396a1ff53cb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                        self.logger.warning("},{"line_number":134,"context_line":"                            \u0027Container listing for %s/%s had \u0027"},{"line_number":135,"context_line":"                            \u0027reserved byte in %s: %r\u0027,"},{"line_number":136,"context_line":"                            account, container, key, entry[key])"},{"line_number":137,"context_line":"                    else:"},{"line_number":138,"context_line":"                        self.logger.warning("},{"line_number":139,"context_line":"                            \u0027Account listing for %s had \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_2797ad92","line":136,"range":{"start_line":136,"start_character":28,"end_line":136,"end_character":46},"updated":"2019-11-23 08:06:35.000000000","message":"These should likely get wsgi_quote()ed.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                        self.logger.warning("},{"line_number":134,"context_line":"                            \u0027Container listing for %s/%s had \u0027"},{"line_number":135,"context_line":"                            \u0027reserved byte in %s: %r\u0027,"},{"line_number":136,"context_line":"                            account, container, key, entry[key])"},{"line_number":137,"context_line":"                    else:"},{"line_number":138,"context_line":"                        self.logger.warning("},{"line_number":139,"context_line":"                            \u0027Account listing for %s had \u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_5c814cc1","line":136,"range":{"start_line":136,"start_character":28,"end_line":136,"end_character":46},"in_reply_to":"3fa7e38b_2797ad92","updated":"2019-11-25 22:30:44.000000000","message":"Done","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                        self.logger.warning("},{"line_number":139,"context_line":"                            \u0027Account listing for %s had \u0027"},{"line_number":140,"context_line":"                            \u0027reserved byte in %s: %r\u0027,"},{"line_number":141,"context_line":"                            account, key, entry[key])"},{"line_number":142,"context_line":"                    break  # out of the *key* loop; check next entry"},{"line_number":143,"context_line":"            else:"},{"line_number":144,"context_line":"                new_listing.append(entry)"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_e78c3581","line":141,"range":{"start_line":141,"start_character":28,"end_line":141,"end_character":35},"updated":"2019-11-23 08:06:35.000000000","message":"...and here","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                        self.logger.warning("},{"line_number":139,"context_line":"                            \u0027Account listing for %s had \u0027"},{"line_number":140,"context_line":"                            \u0027reserved byte in %s: %r\u0027,"},{"line_number":141,"context_line":"                            account, key, entry[key])"},{"line_number":142,"context_line":"                    break  # out of the *key* loop; check next entry"},{"line_number":143,"context_line":"            else:"},{"line_number":144,"context_line":"                new_listing.append(entry)"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_fc6b581b","line":141,"range":{"start_line":141,"start_character":28,"end_line":141,"end_character":35},"in_reply_to":"3fa7e38b_e78c3581","updated":"2019-11-25 22:30:44.000000000","message":"Done","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"swift/common/middleware/symlink.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":568,"context_line":"            if resp is not None:"},{"line_number":569,"context_line":"                resp \u003d status_map[self._get_status_int()](request\u003dreq)"},{"line_number":570,"context_line":"                resp.status \u003d self._response_status"},{"line_number":571,"context_line":"                raise resp"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"        # N.B. TGT_ETAG_SYMLINK_HDR was converted as part of verifying it"},{"line_number":574,"context_line":"        symlink_usermeta_to_sysmeta(req.headers)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_2dd00ac8","line":571,"updated":"2019-11-21 17:37:53.000000000","message":"?\n\nIt\u0027s not obvious to me why we want a raise instead of return here...","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"3fa7e38b_e7b3d54c","updated":"2019-11-23 08:06:35.000000000","message":"Maybe should get broken out as a separate change. Pretty sure you could hit the 500 that prompted this on 2.23.0, which means we ought to consider a backport.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3eeb4db80e894ae5d4b87ee2ef265fa90bfedba6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"3fa7e38b_9ef80d4b","in_reply_to":"3fa7e38b_e7b3d54c","updated":"2019-11-26 15:28:14.000000000","message":"Yeah, that sounds right.  To start I\u0027ve created the bug report:\n\n\nhttps://bugs.launchpad.net/swift/+bug/1854074","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"swift/common/request_helpers.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c62dcdec877de67a6144d45f6cfcb642d70b3308","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    RESERVED_STR, RESERVED_BYTE"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"if six.PY2:"},{"line_number":46,"context_line":"    RESERVED \u003d RESERVED_BYTE"},{"line_number":47,"context_line":"else:"},{"line_number":48,"context_line":"    RESERVED \u003d RESERVED_STR"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_ee0f102d","line":45,"updated":"2019-10-17 20:47:25.000000000","message":"nit: We could *probably* get away with just using RESERVED_STR and (ab)using py2\u0027s fuzzy matching that allows\n\n \u003e\u003e\u003e b\u0027\\x00\u0027 in u\u0027asdf\\x00qwer\u0027\n True\n\nbut w/e, I\u0027m also OK being explicit like this.","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c17de6a224e4d9497060bfab265dae9e6797cca4","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    RESERVED_STR, RESERVED_BYTE"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"if six.PY2:"},{"line_number":46,"context_line":"    RESERVED \u003d RESERVED_BYTE"},{"line_number":47,"context_line":"else:"},{"line_number":48,"context_line":"    RESERVED \u003d RESERVED_STR"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_6536bdea","line":45,"in_reply_to":"3fa7e38b_ee0f102d","updated":"2019-10-21 14:10:22.000000000","message":"Done","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c62dcdec877de67a6144d45f6cfcb642d70b3308","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def validate_internal_container(container):"},{"line_number":99,"context_line":"    if container:"},{"line_number":100,"context_line":"        _validate_internal_name(container, \u0027container\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_cb7a46b9","line":99,"updated":"2019-10-17 20:47:25.000000000","message":"I wonder if this check should get rolled into _validate_internal_name -- like, what\u0027s the expected behavior for\n\n _validate_internal_name(\u0027\u0027)\n\n?","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c17de6a224e4d9497060bfab265dae9e6797cca4","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def validate_internal_container(container):"},{"line_number":99,"context_line":"    if container:"},{"line_number":100,"context_line":"        _validate_internal_name(container, \u0027container\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_65647de6","line":99,"in_reply_to":"3fa7e38b_cb7a46b9","updated":"2019-10-21 14:10:22.000000000","message":"I like the way responsibility is DRY\u0027d out here.  I think the interfaces should be better documented.","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c62dcdec877de67a6144d45f6cfcb642d70b3308","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"def validate_internal_obj(container, obj):"},{"line_number":104,"context_line":"    validate_internal_container(container)"},{"line_number":105,"context_line":"    if obj:"},{"line_number":106,"context_line":"        _validate_internal_name(obj, \u0027object\u0027)"},{"line_number":107,"context_line":"        if RESERVED in obj and RESERVED not in container:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_ab56ea29","line":104,"updated":"2019-10-17 20:47:25.000000000","message":"Should this include a type_?","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c17de6a224e4d9497060bfab265dae9e6797cca4","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"def validate_internal_obj(container, obj):"},{"line_number":104,"context_line":"    validate_internal_container(container)"},{"line_number":105,"context_line":"    if obj:"},{"line_number":106,"context_line":"        _validate_internal_name(obj, \u0027object\u0027)"},{"line_number":107,"context_line":"        if RESERVED in obj and RESERVED not in container:"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_e5786d90","line":104,"in_reply_to":"3fa7e38b_ab56ea29","updated":"2019-10-21 14:10:22.000000000","message":"it does through the container function","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e4df4ae54057c30ea27cd7df6b628b3bf390e4","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"def split_reserved_name(name):"},{"line_number":307,"context_line":"    return name.split(RESERVED_STR)[1:]"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_a1180c84","line":307,"updated":"2019-10-22 20:47:30.000000000","message":"Might want a\n\n if not name.startswith(RESERVED_STR):\n     raise ValueError(\u0027argument is not a reserved name\u0027)","commit_id":"a51fba887a1abbdb3e539bc19e0e0305562d643e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba9a98a283248abad616feeb77a9b6a5f47b5ff7","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"def split_reserved_name(name):"},{"line_number":307,"context_line":"    return name.split(RESERVED_STR)[1:]"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"def remove_items(headers, condition):"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_bb758634","line":307,"in_reply_to":"3fa7e38b_a1180c84","updated":"2019-10-23 18:51:15.000000000","message":"great idea!","commit_id":"a51fba887a1abbdb3e539bc19e0e0305562d643e"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"0e192fb6b2e23e25bbbc4d125b1846575dba69ae","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    validate_internal_container(account, container)"},{"line_number":123,"context_line":"    if obj:"},{"line_number":124,"context_line":"        _validate_internal_name(obj, \u0027object\u0027)"},{"line_number":125,"context_line":"        if RESERVED in obj and not container.startswith(RESERVED):"},{"line_number":126,"context_line":"            raise HTTPBadRequest(body\u003d\u0027Invalid reserved-namespace object \u0027"},{"line_number":127,"context_line":"                                 \u0027in user-namespace container\u0027)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_5556bd2c","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":65},"updated":"2019-11-14 09:24:42.000000000","message":"what about the opposite? should \"regular\" object names be allowed in reserved-namespace containers?\n\nplease also add a comment as to why objs with reserved names are not allowed in regular containers. It will probably serve as a good reminder for our future selves...","commit_id":"318794efb29c90cdf1e600756752dbda9cea7eea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86e158fcfad4f7d2634a4e5977ab1ad506f6a511","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    validate_internal_container(account, container)"},{"line_number":123,"context_line":"    if obj:"},{"line_number":124,"context_line":"        _validate_internal_name(obj, \u0027object\u0027)"},{"line_number":125,"context_line":"        if RESERVED in obj and not container.startswith(RESERVED):"},{"line_number":126,"context_line":"            raise HTTPBadRequest(body\u003d\u0027Invalid reserved-namespace object \u0027"},{"line_number":127,"context_line":"                                 \u0027in user-namespace container\u0027)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_b6fd826f","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":65},"in_reply_to":"3fa7e38b_5556bd2c","updated":"2019-11-14 19:48:52.000000000","message":"The whole namespace is for *us*, so I don\u0027t know that I\u0027m opposed to allowing arbitrary names in a reserved container... *shrug*\n\nOTOH, it\u0027d also be easy enough for us to satisfy a requirement that object names also be reserved. IDK. Seems like we\u0027re only getting in our own way at that point, though...","commit_id":"318794efb29c90cdf1e600756752dbda9cea7eea"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    validate_internal_container(account, container)"},{"line_number":123,"context_line":"    if obj:"},{"line_number":124,"context_line":"        _validate_internal_name(obj, \u0027object\u0027)"},{"line_number":125,"context_line":"        if RESERVED in obj and not container.startswith(RESERVED):"},{"line_number":126,"context_line":"            raise HTTPBadRequest(body\u003d\u0027Invalid reserved-namespace object \u0027"},{"line_number":127,"context_line":"                                 \u0027in user-namespace container\u0027)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_8e937fa3","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":65},"in_reply_to":"3fa7e38b_b6fd826f","updated":"2019-11-18 18:27:49.000000000","message":"So we\u0027re going to block it both ways - like an xor\n#willfix","commit_id":"318794efb29c90cdf1e600756752dbda9cea7eea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    RESERVED_STR, RESERVED_BYTE"},{"line_number":43,"context_line":"from swift.common.wsgi import make_subrequest"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"if six.PY2:"},{"line_number":46,"context_line":"    RESERVED \u003d RESERVED_BYTE"},{"line_number":47,"context_line":"else:"},{"line_number":48,"context_line":"    RESERVED \u003d RESERVED_STR"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_a7e87d15","line":48,"range":{"start_line":45,"start_character":0,"end_line":48,"end_character":27},"updated":"2019-11-23 08:06:35.000000000","message":"Alternatively,\n\n RESERVED \u003d \u0027\\x00\u0027","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    RESERVED_STR, RESERVED_BYTE"},{"line_number":43,"context_line":"from swift.common.wsgi import make_subrequest"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"if six.PY2:"},{"line_number":46,"context_line":"    RESERVED \u003d RESERVED_BYTE"},{"line_number":47,"context_line":"else:"},{"line_number":48,"context_line":"    RESERVED \u003d RESERVED_STR"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"OBJECT_TRANSIENT_SYSMETA_PREFIX \u003d \u0027x-object-transient-sysmeta-\u0027"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_0fd71851","line":48,"range":{"start_line":45,"start_character":0,"end_line":48,"end_character":27},"in_reply_to":"3fa7e38b_a7e87d15","updated":"2019-11-25 22:30:44.000000000","message":"Done, and moved into utils","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    :raises: HTTPBadRequest"},{"line_number":110,"context_line":"    \"\"\""},{"line_number":111,"context_line":"    validate_internal_account(account)"},{"line_number":112,"context_line":"    if container:"},{"line_number":113,"context_line":"        _validate_internal_name(container, \u0027container\u0027)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_a775dd99","line":112,"range":{"start_line":112,"start_character":4,"end_line":112,"end_character":17},"updated":"2019-11-23 08:06:35.000000000","message":"It seems kinda funny that validate_internal_container() may only actually validate account...","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        _validate_internal_name(container, \u0027container\u0027)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"def validate_internal_obj(account, container, obj):"},{"line_number":117,"context_line":"    \"\"\""},{"line_number":118,"context_line":"    Validate internal account, container and object names."},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_67ee0522","line":116,"updated":"2019-11-23 08:06:35.000000000","message":"Hmmm... so this actively prevents us from being able to use the object-expirer with reserved names, yeah? The queue entries would be invalid.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    :raises: HTTPBadRequest"},{"line_number":121,"context_line":"    \"\"\""},{"line_number":122,"context_line":"    validate_internal_container(account, container)"},{"line_number":123,"context_line":"    if obj:"},{"line_number":124,"context_line":"        _validate_internal_name(obj, \u0027object\u0027)"},{"line_number":125,"context_line":"        if container.startswith(RESERVED) and not obj.startswith(RESERVED):"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_07415136","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":31},"updated":"2019-11-23 08:06:35.000000000","message":"...particularly since it means that\n\n validate_internal_obj(\u0027acct\u0027, None, \u0027\\x00obj\u0027)\n\npasses just fine and doesn\u0027t raise :-/\n\nI think I might prefer that we replace this call with an explicit\n\n validate_internal_account(account)\n _validate_internal_name(container, \u0027container\u0027)","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    :raises: HTTPBadRequest"},{"line_number":121,"context_line":"    \"\"\""},{"line_number":122,"context_line":"    validate_internal_container(account, container)"},{"line_number":123,"context_line":"    if obj:"},{"line_number":124,"context_line":"        _validate_internal_name(obj, \u0027object\u0027)"},{"line_number":125,"context_line":"        if container.startswith(RESERVED) and not obj.startswith(RESERVED):"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_0f1cf810","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":31},"in_reply_to":"3fa7e38b_07415136","updated":"2019-11-25 22:30:44.000000000","message":"Done","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b3f008880123115f15b302ee95ff6438b6342c53","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def _validate_internal_name(name, type_\u003d\u0027name\u0027):"},{"line_number":87,"context_line":"    if RESERVED in name and not name.startswith(RESERVED):"},{"line_number":88,"context_line":"        raise HTTPBadRequest(body\u003d\u0027Invalid reserved-namespace %s\u0027 % (type_))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_e948fc8a","line":87,"range":{"start_line":87,"start_character":37,"end_line":87,"end_character":47},"updated":"2019-12-04 22:59:42.000000000","message":"Hmm... so we kept this, huh? I\u0027m still a little worried about our work queues... reconciler and expirer, in particular...","commit_id":"698717d886b2b55ea9b490719851c85c20b57240"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"483630799a4a965064b2673c746530c42c0e7845","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def _validate_internal_name(name, type_\u003d\u0027name\u0027):"},{"line_number":87,"context_line":"    if RESERVED in name and not name.startswith(RESERVED):"},{"line_number":88,"context_line":"        raise HTTPBadRequest(body\u003d\u0027Invalid reserved-namespace %s\u0027 % (type_))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_e9ceadb5","line":87,"range":{"start_line":87,"start_character":37,"end_line":87,"end_character":47},"in_reply_to":"3fa7e38b_e948fc8a","updated":"2020-01-03 00:36:29.000000000","message":"Getting addressed in https://review.opendev.org/#/c/700449/","commit_id":"698717d886b2b55ea9b490719851c85c20b57240"}],"swift/common/swob.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c7d3175571e943530f8f055c1c439c1f75fa1013","unresolved":false,"context_lines":[{"line_number":1066,"context_line":"    @property"},{"line_number":1067,"context_line":"    def allow_null_byte(self):"},{"line_number":1068,"context_line":"        return config_true_value("},{"line_number":1069,"context_line":"            self.environ.get(\u0027HTTP_X_BACKEND_ALLOW_NULL_BYTE\u0027))"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"    def as_referer(self):"},{"line_number":1072,"context_line":"        return self.method + \u0027 \u0027 + self.url"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa7e38b_01f9e04b","line":1069,"updated":"2019-09-19 18:06:26.000000000","message":"we could also consider the *method* of the request if we wanted?","commit_id":"f16f398d589b4c22ef6b468e7a40a8bb06bfdc05"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90599a79783c856dbcdac176163934a125409225","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        return self.host_url + self.path_qs"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"    @property"},{"line_number":1067,"context_line":"    def allow_reserved_byte(self):"},{"line_number":1068,"context_line":"        return config_true_value(self.environ.get("},{"line_number":1069,"context_line":"            \u0027HTTP_X_BACKEND_ALLOW_RESERVED_BYTE\u0027))"},{"line_number":1070,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_a147e94c","line":1067,"range":{"start_line":1067,"start_character":23,"end_line":1067,"end_character":27},"updated":"2019-10-17 21:30:16.000000000","message":"OK, with some of the other changes... idk if this is a good name or not. allow_reserved_char? allow_reserve_names?\n\nApplies for the header, too, of course.","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c17de6a224e4d9497060bfab265dae9e6797cca4","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        return self.host_url + self.path_qs"},{"line_number":1065,"context_line":""},{"line_number":1066,"context_line":"    @property"},{"line_number":1067,"context_line":"    def allow_reserved_byte(self):"},{"line_number":1068,"context_line":"        return config_true_value(self.environ.get("},{"line_number":1069,"context_line":"            \u0027HTTP_X_BACKEND_ALLOW_RESERVED_BYTE\u0027))"},{"line_number":1070,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_c5877112","line":1067,"range":{"start_line":1067,"start_character":23,"end_line":1067,"end_character":27},"in_reply_to":"3fa7e38b_a147e94c","updated":"2019-10-21 14:10:22.000000000","message":"Done","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"}],"swift/common/utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c62dcdec877de67a6144d45f6cfcb642d70b3308","unresolved":false,"context_lines":[{"line_number":186,"context_line":"IPV6_RE \u003d re.compile(\"^\\[(?P\u003caddress\u003e.*)\\](:(?P\u003cport\u003e[0-9]+))?$\")"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":189,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":190,"context_line":"RESERVED_STR \u003d RESERVED_BYTE.decode(\u0027utf8\u0027)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_6b2eb2ac","line":189,"updated":"2019-10-17 20:47:25.000000000","message":"\\o/ RESERVED_BYTE is always bytes!","commit_id":"16acdb9a0ff5df288ba33a1a0ac5f1a25c7ed147"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86e158fcfad4f7d2634a4e5977ab1ad506f6a511","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":189,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":190,"context_line":"RESERVED_STR \u003d RESERVED_BYTE.decode(\u0027utf8\u0027)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"LOG_LINE_DEFAULT_FORMAT \u003d \u0027{remote_addr} - - [{time.d}/{time.b}/{time.Y}\u0027 \\"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_366bd285","line":190,"updated":"2019-11-14 19:48:52.000000000","message":"Worth just saying\n\n u\u0027\\x00\u0027\n\n?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":189,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":190,"context_line":"RESERVED_STR \u003d RESERVED_BYTE.decode(\u0027utf8\u0027)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"LOG_LINE_DEFAULT_FORMAT \u003d \u0027{remote_addr} - - [{time.d}/{time.b}/{time.Y}\u0027 \\"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_4ec1074e","line":190,"in_reply_to":"3fa7e38b_366bd285","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":189,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":190,"context_line":"RESERVED_STR \u003d u\u0027\\x00\u0027"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"LOG_LINE_DEFAULT_FORMAT \u003d \u0027{remote_addr} - - [{time.d}/{time.b}/{time.Y}\u0027 \\"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_07887168","line":190,"updated":"2019-11-23 08:06:35.000000000","message":"Feels kind of strange that these are defined here and not in request_helpers...","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"swift/container/backend.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c3f858cbd81160eac387f35c4664e663d750743","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"            limit, marker, end_marker, prefix\u003dNone, delimiter\u003dNone, path\u003dNone,"},{"line_number":1236,"context_line":"            reverse\u003dFalse, include_deleted\u003dinclude_deleted,"},{"line_number":1237,"context_line":"            transform_func\u003dself._record_to_dict, since_row\u003dsince_row,"},{"line_number":1238,"context_line":"            all_policies\u003dTrue"},{"line_number":1239,"context_line":"        )"},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"    def _transform_record(self, record):"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_7ed85c23","line":1238,"updated":"2019-12-20 06:58:15.000000000","message":"This should include\n\n allow_reserved\u003dTrue","commit_id":"698717d886b2b55ea9b490719851c85c20b57240"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"483630799a4a965064b2673c746530c42c0e7845","unresolved":false,"context_lines":[{"line_number":1235,"context_line":"            limit, marker, end_marker, prefix\u003dNone, delimiter\u003dNone, path\u003dNone,"},{"line_number":1236,"context_line":"            reverse\u003dFalse, include_deleted\u003dinclude_deleted,"},{"line_number":1237,"context_line":"            transform_func\u003dself._record_to_dict, since_row\u003dsince_row,"},{"line_number":1238,"context_line":"            all_policies\u003dTrue"},{"line_number":1239,"context_line":"        )"},{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"    def _transform_record(self, record):"}],"source_content_type":"text/x-python","patch_set":38,"id":"3fa7e38b_49dca170","line":1238,"in_reply_to":"3fa7e38b_7ed85c23","updated":"2020-01-03 00:36:29.000000000","message":"Getting addressed in https://review.opendev.org/#/c/682382/61, which will also include a probe test that shards a reserved-namespace container","commit_id":"698717d886b2b55ea9b490719851c85c20b57240"}],"swift/container/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e4df4ae54057c30ea27cd7df6b628b3bf390e4","unresolved":false,"context_lines":[{"line_number":653,"context_line":"        given_limit \u003d get_param(req, \u0027limit\u0027)"},{"line_number":654,"context_line":"        reverse \u003d config_true_value(get_param(req, \u0027reverse\u0027))"},{"line_number":655,"context_line":"        allow_reserved \u003d config_true_value("},{"line_number":656,"context_line":"            req.headers.get(\u0027X-Backend-Allow-Reserved-Byte\u0027, \u0027false\u0027))"},{"line_number":657,"context_line":"        if given_limit and given_limit.isdigit():"},{"line_number":658,"context_line":"            limit \u003d int(given_limit)"},{"line_number":659,"context_line":"            if limit \u003e constraints.CONTAINER_LISTING_LIMIT:"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_d3007b03","line":656,"range":{"start_line":656,"start_character":54,"end_line":656,"end_character":58},"updated":"2019-10-22 20:47:30.000000000","message":"X-Backend-Allow-Reserved-Names now, yeah? Or we could just use req.allow_reserved_names","commit_id":"a51fba887a1abbdb3e539bc19e0e0305562d643e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba9a98a283248abad616feeb77a9b6a5f47b5ff7","unresolved":false,"context_lines":[{"line_number":653,"context_line":"        given_limit \u003d get_param(req, \u0027limit\u0027)"},{"line_number":654,"context_line":"        reverse \u003d config_true_value(get_param(req, \u0027reverse\u0027))"},{"line_number":655,"context_line":"        allow_reserved \u003d config_true_value("},{"line_number":656,"context_line":"            req.headers.get(\u0027X-Backend-Allow-Reserved-Byte\u0027, \u0027false\u0027))"},{"line_number":657,"context_line":"        if given_limit and given_limit.isdigit():"},{"line_number":658,"context_line":"            limit \u003d int(given_limit)"},{"line_number":659,"context_line":"            if limit \u003e constraints.CONTAINER_LISTING_LIMIT:"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_db708243","line":656,"range":{"start_line":656,"start_character":54,"end_line":656,"end_character":58},"in_reply_to":"3fa7e38b_d3007b03","updated":"2019-10-23 18:51:15.000000000","message":"bah, #willfix","commit_id":"a51fba887a1abbdb3e539bc19e0e0305562d643e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86e158fcfad4f7d2634a4e5977ab1ad506f6a511","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    return headers"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def get_container_name_and_placement(req):"},{"line_number":88,"context_line":"    \"\"\""},{"line_number":89,"context_line":"    Split and validate path for a container."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_36199221","line":87,"updated":"2019-11-14 19:48:52.000000000","message":"This is (dangerously?) similar to\n\n swift.account.server.get_container_name_and_placement\n\nI\u0027d be tempted to prefix these *_name_and_placement functions with _ to make us think twice before importing them elsewhere.","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    return headers"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"def get_container_name_and_placement(req):"},{"line_number":88,"context_line":"    \"\"\""},{"line_number":89,"context_line":"    Split and validate path for a container."},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_aee19bd1","line":87,"in_reply_to":"3fa7e38b_36199221","updated":"2019-11-18 18:27:49.000000000","message":"right, only difference is minsegs allows container to be None in the account.server case\n\nI\u0027m not really \"worried\" about them being used out of context\n\nIf that WERE a priority to me I\u0027m not sure I\u0027d buy the \"just prefix them as private names\" as a good solution.\n\nIf someone wants *this exact function* in another context the name won\u0027t stop them - if there\u0027s a \"smell\" in review because it\u0027s private, they\u0027d probably just rename only the one they want and then we\u0027re left with inconsistency across the modules.  \n\nMaybe better we just hope they:\n\n    from account import server as act\n    act.get_container_name_and_placement\n\n???\n\nWhat would you think about making them static methods:\n\n  ContainerController.get_container_name_and_placement(req)\n\nvs.\n\n  AccountController.get_container_name_and_placement(req)\n\nI could even see generalized get_resource and get_sub_resource abstract implementations on BaseStorageServer using concrete attributes for cls.MINSEG and cls.MAXSEG !?!?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":540,"context_line":"    @timing_stats(sample_rate\u003d0.1)"},{"line_number":541,"context_line":"    def HEAD(self, req):"},{"line_number":542,"context_line":"        \"\"\"Handle HTTP HEAD request.\"\"\""},{"line_number":543,"context_line":"        drive, part, account, container, obj \u003d get_obj_name_and_placement(req)"},{"line_number":544,"context_line":"        out_content_type \u003d listing_formats.get_listing_content_type(req)"},{"line_number":545,"context_line":"        try:"},{"line_number":546,"context_line":"            check_drive(self.root, drive, self.mount_check)"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_27aecde6","line":543,"range":{"start_line":543,"start_character":41,"end_line":543,"end_character":44},"updated":"2019-11-23 08:06:35.000000000","message":"Wait, what? Pre-existing behavior, but... surely that can\u0027t be right. This isn\u0027t *used anywhere*, is it? And neither should any client ever be *sending it in*.","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3eeb4db80e894ae5d4b87ee2ef265fa90bfedba6","unresolved":false,"context_lines":[{"line_number":540,"context_line":"    @timing_stats(sample_rate\u003d0.1)"},{"line_number":541,"context_line":"    def HEAD(self, req):"},{"line_number":542,"context_line":"        \"\"\"Handle HTTP HEAD request.\"\"\""},{"line_number":543,"context_line":"        drive, part, account, container, obj \u003d get_obj_name_and_placement(req)"},{"line_number":544,"context_line":"        out_content_type \u003d listing_formats.get_listing_content_type(req)"},{"line_number":545,"context_line":"        try:"},{"line_number":546,"context_line":"            check_drive(self.root, drive, self.mount_check)"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_3e46b97d","line":543,"range":{"start_line":543,"start_character":41,"end_line":543,"end_character":44},"in_reply_to":"3fa7e38b_27aecde6","updated":"2019-11-26 15:28:14.000000000","message":"yeah i remember cracking up when I spotted this","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        :param req: an instance of :class:`swift.common.swob.Request`"},{"line_number":658,"context_line":"        :returns: an instance of :class:`swift.common.swob.Response`"},{"line_number":659,"context_line":"        \"\"\""},{"line_number":660,"context_line":"        drive, part, account, container, obj \u003d get_obj_name_and_placement(req)"},{"line_number":661,"context_line":"        path \u003d get_param(req, \u0027path\u0027)"},{"line_number":662,"context_line":"        prefix \u003d get_param(req, \u0027prefix\u0027)"},{"line_number":663,"context_line":"        delimiter \u003d get_param(req, \u0027delimiter\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_47a989da","line":660,"range":{"start_line":660,"start_character":41,"end_line":660,"end_character":44},"updated":"2019-11-23 08:06:35.000000000","message":"Ditto","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":720,"context_line":"            container_list \u003d src_broker.list_objects_iter("},{"line_number":721,"context_line":"                limit, marker, end_marker, prefix, delimiter, path,"},{"line_number":722,"context_line":"                storage_policy_index\u003dinfo[\u0027storage_policy_index\u0027],"},{"line_number":723,"context_line":"                reverse\u003dreverse, allow_reserved\u003dreq.allow_reserved_names)"},{"line_number":724,"context_line":"        return self.create_listing(req, out_content_type, info, resp_headers,"},{"line_number":725,"context_line":"                                   broker.metadata, container_list, container)"},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_c79d79bb","line":723,"updated":"2019-11-23 08:06:35.000000000","message":"Reaper *also* needs to get updated to send\n\n X-Backend-Allow-Reserved-Names: true","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":720,"context_line":"            container_list \u003d src_broker.list_objects_iter("},{"line_number":721,"context_line":"                limit, marker, end_marker, prefix, delimiter, path,"},{"line_number":722,"context_line":"                storage_policy_index\u003dinfo[\u0027storage_policy_index\u0027],"},{"line_number":723,"context_line":"                reverse\u003dreverse, allow_reserved\u003dreq.allow_reserved_names)"},{"line_number":724,"context_line":"        return self.create_listing(req, out_content_type, info, resp_headers,"},{"line_number":725,"context_line":"                                   broker.metadata, container_list, container)"},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_efe5dc0a","line":723,"in_reply_to":"3fa7e38b_c79d79bb","updated":"2019-11-25 22:30:44.000000000","message":"Done","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    @public"},{"line_number":773,"context_line":"    @timing_stats()"},{"line_number":774,"context_line":"    def UPDATE(self, req):"},{"line_number":775,"context_line":"        \"\"\""},{"line_number":776,"context_line":"        Handle HTTP UPDATE request (merge_items RPCs coming from the proxy.)"},{"line_number":777,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_67a045f4","line":774,"range":{"start_line":774,"start_character":8,"end_line":774,"end_character":14},"updated":"2019-11-23 08:06:35.000000000","message":"Hmm... I bet we can add whatever crazy names we like to a listing using this API, huh?","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"swift/obj/server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00d99f947499f94f65dd2d677d2c706a87444053","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    device, partition, account, container, obj, policy \u003d \\"},{"line_number":100,"context_line":"        get_name_and_placement(request, 5, 5, True)"},{"line_number":101,"context_line":"    if \u0027\\x00\u0027 in obj and \u0027\\x00\u0027 not in container:"},{"line_number":102,"context_line":"        raise HTTPPreconditionFailed(body\u003d\u0027Invalid null-namespace object \u0027"},{"line_number":103,"context_line":"                                     \u0027in user-namespace container\u0027)"},{"line_number":104,"context_line":"    return device, partition, account, container, obj, policy"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_01d560e5","line":102,"range":{"start_line":102,"start_character":14,"end_line":102,"end_character":36},"updated":"2019-10-04 22:49:03.000000000","message":"I know this matches what we\u0027re doing in __call__ when we fail the check_utf8... but I never really liked our abuse of 412. Can\u0027t this just be HTTPBadRequest?","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6c1eff903a436df684511a5ffa9a4d6402a2efd2","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    device, partition, account, container, obj, policy \u003d \\"},{"line_number":100,"context_line":"        get_name_and_placement(request, 5, 5, True)"},{"line_number":101,"context_line":"    if \u0027\\x00\u0027 in obj and \u0027\\x00\u0027 not in container:"},{"line_number":102,"context_line":"        raise HTTPPreconditionFailed(body\u003d\u0027Invalid null-namespace object \u0027"},{"line_number":103,"context_line":"                                     \u0027in user-namespace container\u0027)"},{"line_number":104,"context_line":"    return device, partition, account, container, obj, policy"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_b8a6efaa","line":102,"range":{"start_line":102,"start_character":14,"end_line":102,"end_character":36},"in_reply_to":"3fa7e38b_01d560e5","updated":"2019-10-07 13:45:28.000000000","message":"Yes, definately agree #willfix","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00d99f947499f94f65dd2d677d2c706a87444053","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"        self.logger.txn_id \u003d req.headers.get(\u0027x-trans-id\u0027, None)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"        if not check_utf8(wsgi_to_str(req.path_info), internal\u003dTrue):"},{"line_number":1295,"context_line":"            res \u003d HTTPPreconditionFailed(body\u003d\u0027Invalid UTF8 or contains NULL\u0027)"},{"line_number":1296,"context_line":"        else:"},{"line_number":1297,"context_line":"            try:"},{"line_number":1298,"context_line":"                # disallow methods which have not been marked \u0027public\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_e1d92422","line":1295,"range":{"start_line":1295,"start_character":60,"end_line":1295,"end_character":76},"updated":"2019-10-04 22:49:03.000000000","message":"Heh, I suppose we could drop this now...","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6c1eff903a436df684511a5ffa9a4d6402a2efd2","unresolved":false,"context_lines":[{"line_number":1292,"context_line":"        self.logger.txn_id \u003d req.headers.get(\u0027x-trans-id\u0027, None)"},{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"        if not check_utf8(wsgi_to_str(req.path_info), internal\u003dTrue):"},{"line_number":1295,"context_line":"            res \u003d HTTPPreconditionFailed(body\u003d\u0027Invalid UTF8 or contains NULL\u0027)"},{"line_number":1296,"context_line":"        else:"},{"line_number":1297,"context_line":"            try:"},{"line_number":1298,"context_line":"                # disallow methods which have not been marked \u0027public\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_18e623ea","line":1295,"range":{"start_line":1295,"start_character":60,"end_line":1295,"end_character":76},"in_reply_to":"3fa7e38b_e1d92422","updated":"2019-10-07 13:45:28.000000000","message":"just the \"or NULL\" bit in the error message?","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"86e158fcfad4f7d2634a4e5977ab1ad506f6a511","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"        parameters and is used, for example, by both replication and EC."},{"line_number":1268,"context_line":"        \"\"\""},{"line_number":1269,"context_line":"        device, partition, suffix_parts, policy \u003d \\"},{"line_number":1270,"context_line":"            get_name_and_placement(request, 2, 3, True)"},{"line_number":1271,"context_line":"        suffixes \u003d suffix_parts.split(\u0027-\u0027) if suffix_parts else []"},{"line_number":1272,"context_line":"        try:"},{"line_number":1273,"context_line":"            hashes \u003d self._diskfile_router[policy].get_hashes("}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_f6b9baeb","line":1270,"range":{"start_line":1270,"start_character":12,"end_line":1270,"end_character":34},"updated":"2019-11-14 19:48:52.000000000","message":"Right; this call to get_name_and_placement doesn\u0027t need updating because we don\u0027t actually have a name in hand.","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"        parameters and is used, for example, by both replication and EC."},{"line_number":1268,"context_line":"        \"\"\""},{"line_number":1269,"context_line":"        device, partition, suffix_parts, policy \u003d \\"},{"line_number":1270,"context_line":"            get_name_and_placement(request, 2, 3, True)"},{"line_number":1271,"context_line":"        suffixes \u003d suffix_parts.split(\u0027-\u0027) if suffix_parts else []"},{"line_number":1272,"context_line":"        try:"},{"line_number":1273,"context_line":"            hashes \u003d self._diskfile_router[policy].get_hashes("}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_cee657e8","line":1270,"range":{"start_line":1270,"start_character":12,"end_line":1270,"end_character":34},"in_reply_to":"3fa7e38b_f6b9baeb","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            env, (\"/%s/%s/%s\" % (version, wsgi_account, wsgi_container)),"},{"line_number":358,"context_line":"            (swift_source or \u0027GET_CONTAINER_INFO\u0027))"},{"line_number":359,"context_line":"        if config_true_value(env.get(\u0027HTTP_X_BACKEND_ALLOW_RESERVED_NAMES\u0027)):"},{"line_number":360,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Names\u0027] \u003d \u0027true\u0027"},{"line_number":361,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":362,"context_line":"        close_if_possible(resp.app_iter)"},{"line_number":363,"context_line":"        # Check in infocache to see if the proxy (or anyone else) already"}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_8846cc4f","line":360,"updated":"2019-11-21 17:37:53.000000000","message":"I wonder if get_container_info should just *always* allow reserved names...","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6a1bcf002b2531788218d7b912e0776b18a0f3d5","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            env, (\"/%s/%s/%s\" % (version, wsgi_account, wsgi_container)),"},{"line_number":358,"context_line":"            (swift_source or \u0027GET_CONTAINER_INFO\u0027))"},{"line_number":359,"context_line":"        if config_true_value(env.get(\u0027HTTP_X_BACKEND_ALLOW_RESERVED_NAMES\u0027)):"},{"line_number":360,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Names\u0027] \u003d \u0027true\u0027"},{"line_number":361,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":362,"context_line":"        close_if_possible(resp.app_iter)"},{"line_number":363,"context_line":"        # Check in infocache to see if the proxy (or anyone else) already"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_87f1c102","line":360,"updated":"2019-11-23 08:06:35.000000000","message":"I think I\u0027m still a fan of *always* setting this header here. Not sure I like the idea of get_container_info getting *and caching* different results depending on whether the call was as part of an API that can use reserved names or not...\n\nShould probably do something similar for get_account_info/get_object_info","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"87b21ba7da476f9c01b6cd0b2b0f324f5d659748","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            env, (\"/%s/%s/%s\" % (version, wsgi_account, wsgi_container)),"},{"line_number":358,"context_line":"            (swift_source or \u0027GET_CONTAINER_INFO\u0027))"},{"line_number":359,"context_line":"        if config_true_value(env.get(\u0027HTTP_X_BACKEND_ALLOW_RESERVED_NAMES\u0027)):"},{"line_number":360,"context_line":"            req.headers[\u0027X-Backend-Allow-Reserved-Names\u0027] \u003d \u0027true\u0027"},{"line_number":361,"context_line":"        resp \u003d req.get_response(app)"},{"line_number":362,"context_line":"        close_if_possible(resp.app_iter)"},{"line_number":363,"context_line":"        # Check in infocache to see if the proxy (or anyone else) already"}],"source_content_type":"text/x-python","patch_set":34,"id":"3fa7e38b_ef7cfc20","line":360,"in_reply_to":"3fa7e38b_87f1c102","updated":"2019-11-25 22:30:44.000000000","message":"Done","commit_id":"543e2a3cdd2c752de4790ae0f7825ede86eb0946"}],"test/probe/test_reserved_name.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"3fa7e38b_68791091","updated":"2019-11-21 17:37:53.000000000","message":"\\o/ A probe test!","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"27e41925543d9b1299bfe12179206954b29f4ff6","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        finally:"},{"line_number":67,"context_line":"            shutil.rmtree(tempdir)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_symlink_target(self):"},{"line_number":70,"context_line":"        if \u0027symlink\u0027 not in self.cluster_info:"},{"line_number":71,"context_line":"            raise unittest.SkipTest("},{"line_number":72,"context_line":"                \"Symlink not enabled in proxy; can\u0027t test \""}],"source_content_type":"text/x-python","patch_set":32,"id":"3fa7e38b_483774b1","line":69,"updated":"2019-11-21 17:37:53.000000000","message":"Solid test! We could even have a simplified version of this that *just* uses internal_client to verify that we can create, read, and delete reserved names -- no symlink required!","commit_id":"b995a3c7e5c77523d1294624c2bbfaf8b3474a13"}],"test/unit/account/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"00d99f947499f94f65dd2d677d2c706a87444053","unresolved":false,"context_lines":[{"line_number":1825,"context_line":"        self.assertEqual(json.loads(resp.body),"},{"line_number":1826,"context_line":"                         self._expected_listing(containers))"},{"line_number":1827,"context_line":""},{"line_number":1828,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?prefix\u003dnul\u0026delimiter\u003dl\u0027, headers\u003d{"},{"line_number":1829,"context_line":"            \u0027X-Backend-Allow-Null-Byte\u0027: \u0027true\u0027,"},{"line_number":1830,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027})"},{"line_number":1831,"context_line":"        resp \u003d req.get_response(self.controller)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_4178382a","line":1828,"range":{"start_line":1828,"start_character":39,"end_line":1828,"end_character":61},"updated":"2019-10-04 22:49:03.000000000","message":"Should we have a test with %00 in prefix and/or delimiter?","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6c1eff903a436df684511a5ffa9a4d6402a2efd2","unresolved":false,"context_lines":[{"line_number":1825,"context_line":"        self.assertEqual(json.loads(resp.body),"},{"line_number":1826,"context_line":"                         self._expected_listing(containers))"},{"line_number":1827,"context_line":""},{"line_number":1828,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?prefix\u003dnul\u0026delimiter\u003dl\u0027, headers\u003d{"},{"line_number":1829,"context_line":"            \u0027X-Backend-Allow-Null-Byte\u0027: \u0027true\u0027,"},{"line_number":1830,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027})"},{"line_number":1831,"context_line":"        resp \u003d req.get_response(self.controller)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_18ff0368","line":1828,"range":{"start_line":1828,"start_character":39,"end_line":1828,"end_character":61},"in_reply_to":"3fa7e38b_4178382a","updated":"2019-10-07 13:45:28.000000000","message":"yes, all that and more #willfix","commit_id":"275b9a7712fa3be4600f0e5f6266ea583ba587e1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":1912,"context_line":"        self.assertEqual(resp.status_int, 200, resp.body)"},{"line_number":1913,"context_line":"        self.assertEqual(json.loads(resp.body), [])"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        # allow-null header doesn\u0027t really make a difference"},{"line_number":1916,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?prefix\u003d%s\u0026delimiter\u003dl\u0027 %"},{"line_number":1917,"context_line":"                            get_reserved_name(\u0027nul\u0027), headers\u003d{"},{"line_number":1918,"context_line":"                                \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_f10224ba","line":1915,"range":{"start_line":1915,"start_character":28,"end_line":1915,"end_character":60},"updated":"2019-11-14 23:12:40.000000000","message":"Lies! We went from nothing to something!","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":1912,"context_line":"        self.assertEqual(resp.status_int, 200, resp.body)"},{"line_number":1913,"context_line":"        self.assertEqual(json.loads(resp.body), [])"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        # allow-null header doesn\u0027t really make a difference"},{"line_number":1916,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?prefix\u003d%s\u0026delimiter\u003dl\u0027 %"},{"line_number":1917,"context_line":"                            get_reserved_name(\u0027nul\u0027), headers\u003d{"},{"line_number":1918,"context_line":"                                \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_8eccdf61","line":1915,"range":{"start_line":1915,"start_character":28,"end_line":1915,"end_character":60},"in_reply_to":"3fa7e38b_f10224ba","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":1952,"context_line":"        self.assertEqual(json.loads(resp.body),"},{"line_number":1953,"context_line":"                         self._expected_listing(containers))"},{"line_number":1954,"context_line":""},{"line_number":1955,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?marker\u003d%s\u0027 % quote("},{"line_number":1956,"context_line":"            self._expected_listing(containers)[0][\u0027name\u0027]), headers\u003d{"},{"line_number":1957,"context_line":"                \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027,"},{"line_number":1958,"context_line":"                \u0027Accept\u0027: \u0027application/json\u0027})"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_31a99c23","line":1955,"range":{"start_line":1955,"start_character":52,"end_line":1955,"end_character":57},"updated":"2019-11-14 23:12:40.000000000","message":"Right -- WSGI\u0027s QUERY_STRING is whatever we got on the wire, so it ought to be quoted by the time it hit the account server. If it\u0027s *not* (as above), that should be OK, too, though.","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":1952,"context_line":"        self.assertEqual(json.loads(resp.body),"},{"line_number":1953,"context_line":"                         self._expected_listing(containers))"},{"line_number":1954,"context_line":""},{"line_number":1955,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?marker\u003d%s\u0027 % quote("},{"line_number":1956,"context_line":"            self._expected_listing(containers)[0][\u0027name\u0027]), headers\u003d{"},{"line_number":1957,"context_line":"                \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027,"},{"line_number":1958,"context_line":"                \u0027Accept\u0027: \u0027application/json\u0027})"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_2ed5abe6","line":1955,"range":{"start_line":1955,"start_character":52,"end_line":1955,"end_character":57},"in_reply_to":"3fa7e38b_31a99c23","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":2052,"context_line":"        self._report_containers(containers)"},{"line_number":2053,"context_line":""},{"line_number":2054,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?prefix\u003d%s\u0026delimiter\u003d%s\u0027 % ("},{"line_number":2055,"context_line":"            get_reserved_name(\u0027null\u0027), get_reserved_name()), headers\u003d{"},{"line_number":2056,"context_line":"                \u0027Accept\u0027: \u0027application/json\u0027})"},{"line_number":2057,"context_line":"        resp \u003d req.get_response(self.controller)"},{"line_number":2058,"context_line":"        self.assertEqual(resp.status_int, 200, resp.body)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_91c97052","line":2055,"range":{"start_line":2055,"start_character":39,"end_line":2055,"end_character":56},"updated":"2019-11-14 23:12:40.000000000","message":"Cool! So null byte works just fine for a delimiter!","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":2052,"context_line":"        self._report_containers(containers)"},{"line_number":2053,"context_line":""},{"line_number":2054,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a?prefix\u003d%s\u0026delimiter\u003d%s\u0027 % ("},{"line_number":2055,"context_line":"            get_reserved_name(\u0027null\u0027), get_reserved_name()), headers\u003d{"},{"line_number":2056,"context_line":"                \u0027Accept\u0027: \u0027application/json\u0027})"},{"line_number":2057,"context_line":"        resp \u003d req.get_response(self.controller)"},{"line_number":2058,"context_line":"        self.assertEqual(resp.status_int, 200, resp.body)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_4ed267ff","line":2055,"range":{"start_line":2055,"start_character":39,"end_line":2055,"end_character":56},"in_reply_to":"3fa7e38b_91c97052","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"test/unit/account/test_utils.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        put_timestamp \u003d next(self.ts)"},{"line_number":218,"context_line":"        now \u003d time.time()"},{"line_number":219,"context_line":"        with mock.patch(\u0027time.time\u0027, new\u003dlambda: now):"},{"line_number":220,"context_line":"            broker.initialize(put_timestamp.internal)"},{"line_number":221,"context_line":"        container_timestamp \u003d next(self.ts)"},{"line_number":222,"context_line":"        broker.put_container(get_reserved_name(\u0027foo\u0027),"},{"line_number":223,"context_line":"                             container_timestamp.internal, 0, 10, 100, 0)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_dcb29fe5","line":220,"updated":"2019-11-14 23:12:40.000000000","message":"Off-topic: Oh jeez... what? created_at come from the account-server\u0027s local time during initialize? So basically *guaranteed* to have skew between replicas...","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027})"},{"line_number":247,"context_line":"        resp \u003d utils.account_listing_response("},{"line_number":248,"context_line":"            \u0027a\u0027, req, \u0027application/json\u0027, broker,"},{"line_number":249,"context_line":"            allow_reserved\u003dreq.allow_reserved_names)"},{"line_number":250,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":251,"context_line":"        expected \u003d HeaderKeyDict({"},{"line_number":252,"context_line":"            \u0027Content-Type\u0027: \u0027application/json; charset\u003dutf-8\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_fcdafb1a","line":249,"range":{"start_line":249,"start_character":27,"end_line":249,"end_character":51},"updated":"2019-11-14 23:12:40.000000000","message":"Makes for some funny testing of swob, but OK -- certainly, it\u0027s representative of what the account server\u0027s going to be doing...\n\nBut since we\u0027ve already got the request in hand, I wonder if we should eschew the new param and just check req.allow_reserved_names in account_listing_response() directly.","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027})"},{"line_number":247,"context_line":"        resp \u003d utils.account_listing_response("},{"line_number":248,"context_line":"            \u0027a\u0027, req, \u0027application/json\u0027, broker,"},{"line_number":249,"context_line":"            allow_reserved\u003dreq.allow_reserved_names)"},{"line_number":250,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":251,"context_line":"        expected \u003d HeaderKeyDict({"},{"line_number":252,"context_line":"            \u0027Content-Type\u0027: \u0027application/json; charset\u003dutf-8\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_aefafb73","line":249,"range":{"start_line":249,"start_character":27,"end_line":249,"end_character":51},"in_reply_to":"3fa7e38b_fcdafb1a","updated":"2019-11-18 18:27:49.000000000","message":"wait... did you already fix this?  did I already pull?!","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"test/unit/common/middleware/test_listing_formats.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.fake_account_listing_with_reserved \u003d json.dumps(["},{"line_number":42,"context_line":"            {\u0027name\u0027: \u0027bar\u0027, \u0027bytes\u0027: 0, \u0027count\u0027: 0,"},{"line_number":43,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":44,"context_line":"            {\u0027name\u0027: \u0027bar%sversions\u0027 % utils.RESERVED_STR, \u0027bytes\u0027: 0,"},{"line_number":45,"context_line":"             \u0027count\u0027: 0, \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":46,"context_line":"            {\u0027subdir\u0027: \u0027foo_\u0027},"},{"line_number":47,"context_line":"        ]).encode(\u0027ascii\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_7c74cbd0","line":44,"range":{"start_line":44,"start_character":22,"end_line":44,"end_character":35},"updated":"2019-11-14 23:12:40.000000000","message":"This isn\u0027t actually a valid reserved name, though, right?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.fake_account_listing_with_reserved \u003d json.dumps(["},{"line_number":42,"context_line":"            {\u0027name\u0027: \u0027bar\u0027, \u0027bytes\u0027: 0, \u0027count\u0027: 0,"},{"line_number":43,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":44,"context_line":"            {\u0027name\u0027: \u0027bar%sversions\u0027 % utils.RESERVED_STR, \u0027bytes\u0027: 0,"},{"line_number":45,"context_line":"             \u0027count\u0027: 0, \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":46,"context_line":"            {\u0027subdir\u0027: \u0027foo_\u0027},"},{"line_number":47,"context_line":"        ]).encode(\u0027ascii\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_ce409709","line":44,"range":{"start_line":44,"start_character":22,"end_line":44,"end_character":35},"in_reply_to":"3fa7e38b_7c74cbd0","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            {\u0027name\u0027: \u0027bar\u0027, \u0027hash\u0027: \u0027etag\u0027, \u0027bytes\u0027: 0,"},{"line_number":50,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027,"},{"line_number":51,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":52,"context_line":"            {\u0027name\u0027: \u0027bar%sextra data\u0027 % utils.RESERVED_STR, \u0027hash\u0027: \u0027etag\u0027,"},{"line_number":53,"context_line":"             \u0027bytes\u0027: 0, \u0027content_type\u0027: \u0027text/plain\u0027,"},{"line_number":54,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":55,"context_line":"            {\u0027subdir\u0027: \u0027foo/\u0027},"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_9c6f47f9","line":52,"range":{"start_line":52,"start_character":22,"end_line":52,"end_character":37},"updated":"2019-11-14 23:12:40.000000000","message":"Nor this one.","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            {\u0027name\u0027: \u0027bar\u0027, \u0027hash\u0027: \u0027etag\u0027, \u0027bytes\u0027: 0,"},{"line_number":50,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027,"},{"line_number":51,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":52,"context_line":"            {\u0027name\u0027: \u0027bar%sextra data\u0027 % utils.RESERVED_STR, \u0027hash\u0027: \u0027etag\u0027,"},{"line_number":53,"context_line":"             \u0027bytes\u0027: 0, \u0027content_type\u0027: \u0027text/plain\u0027,"},{"line_number":54,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":55,"context_line":"            {\u0027subdir\u0027: \u0027foo/\u0027},"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_6e496330","line":52,"range":{"start_line":52,"start_character":22,"end_line":52,"end_character":37},"in_reply_to":"3fa7e38b_9c6f47f9","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            {\u0027name\u0027: \u0027bar%sextra data\u0027 % utils.RESERVED_STR, \u0027hash\u0027: \u0027etag\u0027,"},{"line_number":53,"context_line":"             \u0027bytes\u0027: 0, \u0027content_type\u0027: \u0027text/plain\u0027,"},{"line_number":54,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":55,"context_line":"            {\u0027subdir\u0027: \u0027foo/\u0027},"},{"line_number":56,"context_line":"        ]).encode(\u0027ascii\u0027)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_valid_account(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_3c573329","line":55,"updated":"2019-11-14 23:12:40.000000000","message":"Should probably have some reserved subdirs, too, yeah?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            {\u0027name\u0027: \u0027bar%sextra data\u0027 % utils.RESERVED_STR, \u0027hash\u0027: \u0027etag\u0027,"},{"line_number":53,"context_line":"             \u0027bytes\u0027: 0, \u0027content_type\u0027: \u0027text/plain\u0027,"},{"line_number":54,"context_line":"             \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027},"},{"line_number":55,"context_line":"            {\u0027subdir\u0027: \u0027foo/\u0027},"},{"line_number":56,"context_line":"        ]).encode(\u0027ascii\u0027)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_valid_account(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_cedc1747","line":55,"in_reply_to":"3fa7e38b_3c573329","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027})"},{"line_number":122,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":123,"context_line":"        self.assertEqual(resp.body, b\u0027bar\\nbar%sversions\\nfoo_\\n\u0027 %"},{"line_number":124,"context_line":"                         utils.RESERVED_STR.encode(\u0027ascii\u0027))"},{"line_number":125,"context_line":"        self.assertEqual(resp.headers[\u0027Content-Type\u0027],"},{"line_number":126,"context_line":"                         \u0027text/plain; charset\u003dutf-8\u0027)"},{"line_number":127,"context_line":"        self.assertEqual(self.fake_swift.calls[-1], ("}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_bc43236c","line":124,"range":{"start_line":124,"start_character":25,"end_line":124,"end_character":59},"updated":"2019-11-14 23:12:40.000000000","message":"May as well use\n\n utils.RESERVED_BYTE\n\nDitto WRT other encode() calls below...","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027})"},{"line_number":122,"context_line":"        resp \u003d req.get_response(self.app)"},{"line_number":123,"context_line":"        self.assertEqual(resp.body, b\u0027bar\\nbar%sversions\\nfoo_\\n\u0027 %"},{"line_number":124,"context_line":"                         utils.RESERVED_STR.encode(\u0027ascii\u0027))"},{"line_number":125,"context_line":"        self.assertEqual(resp.headers[\u0027Content-Type\u0027],"},{"line_number":126,"context_line":"                         \u0027text/plain; charset\u003dutf-8\u0027)"},{"line_number":127,"context_line":"        self.assertEqual(self.fake_swift.calls[-1], ("}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_6ee5e309","line":124,"range":{"start_line":124,"start_character":25,"end_line":124,"end_character":59},"in_reply_to":"3fa7e38b_bc43236c","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"test/unit/common/test_constraints.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"28e4df4ae54057c30ea27cd7df6b628b3bf390e4","unresolved":false,"context_lines":[{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def test_check_utf8(self):"},{"line_number":508,"context_line":"        unicode_sample \u003d u\u0027\\uc77c\\uc601\u0027"},{"line_number":509,"context_line":"        unicode_with_reserved \u003d u\u0027abc%sdef\u0027 % utils.RESERVED_BYTE"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        # Some false-y values"},{"line_number":512,"context_line":"        self.assertFalse(constraints.check_utf8(None))"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_533a4bc4","line":509,"updated":"2019-10-22 20:47:30.000000000","message":"We went back to making this\n\n u\"abcb\u0027\\\\x00\u0027def\"","commit_id":"a51fba887a1abbdb3e539bc19e0e0305562d643e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ba9a98a283248abad616feeb77a9b6a5f47b5ff7","unresolved":false,"context_lines":[{"line_number":506,"context_line":""},{"line_number":507,"context_line":"    def test_check_utf8(self):"},{"line_number":508,"context_line":"        unicode_sample \u003d u\u0027\\uc77c\\uc601\u0027"},{"line_number":509,"context_line":"        unicode_with_reserved \u003d u\u0027abc%sdef\u0027 % utils.RESERVED_BYTE"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":"        # Some false-y values"},{"line_number":512,"context_line":"        self.assertFalse(constraints.check_utf8(None))"}],"source_content_type":"text/x-python","patch_set":17,"id":"3fa7e38b_bbaa666e","line":509,"in_reply_to":"3fa7e38b_533a4bc4","updated":"2019-10-23 18:51:15.000000000","message":"Done","commit_id":"a51fba887a1abbdb3e539bc19e0e0305562d643e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":534,"context_line":"        self.assertTrue(constraints.check_utf8(\u0027foobar\u0027, internal\u003dTrue))"},{"line_number":535,"context_line":"        # internal allows reserved names"},{"line_number":536,"context_line":"        self.assertTrue(constraints.check_utf8(unicode_with_reserved,"},{"line_number":537,"context_line":"                                               internal\u003dTrue))"},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"    def test_check_utf8_non_canonical(self):"},{"line_number":540,"context_line":"        self.assertFalse(constraints.check_utf8(b\u0027\\xed\\xa0\\xbc\\xed\\xbc\\xb8\u0027))"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_9c066721","line":537,"updated":"2019-11-14 23:12:40.000000000","message":"Maybe do it again with some bytes?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"test/unit/common/test_request_helpers.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        self.assertIsNone(rh._validate_internal_name("},{"line_number":187,"context_line":"            rh.get_reserved_name(\u0027foo\u0027)))"},{"line_number":188,"context_line":"        self.assertIsNone(rh._validate_internal_name("},{"line_number":189,"context_line":"            rh.get_reserved_name(\u0027foo\u0027, \u0027bar\u0027)))"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def test_invalid_reserved_name(self):"},{"line_number":192,"context_line":"        with self.assertRaises(HTTPException) as raised:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_b71fbc59","line":189,"updated":"2019-11-14 23:12:40.000000000","message":"Other cases to try\n\n self.assertIsNone(rh._validate_internal_name(\u0027\u0027))\n self.assertIsNone(rh._validate_internal_name(rh.RESERVED))","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        self.assertIsNone(rh._validate_internal_name("},{"line_number":187,"context_line":"            rh.get_reserved_name(\u0027foo\u0027)))"},{"line_number":188,"context_line":"        self.assertIsNone(rh._validate_internal_name("},{"line_number":189,"context_line":"            rh.get_reserved_name(\u0027foo\u0027, \u0027bar\u0027)))"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def test_invalid_reserved_name(self):"},{"line_number":192,"context_line":"        with self.assertRaises(HTTPException) as raised:"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_0e9f8fb4","line":189,"in_reply_to":"3fa7e38b_b71fbc59","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        self.assertEqual(e.body, b\"Invalid reserved-namespace object\")"},{"line_number":263,"context_line":"        with self.assertRaises(HTTPException) as raised:"},{"line_number":264,"context_line":"            rh.validate_internal_obj("},{"line_number":265,"context_line":"                \u0027AUTH_foo\u0027, \u0027bar\u0027, rh.get_reserved_name(\u0027baz\u0027))"},{"line_number":266,"context_line":"        e \u003d raised.exception"},{"line_number":267,"context_line":"        self.assertEqual(e.status_int, 400)"},{"line_number":268,"context_line":"        self.assertEqual(str(e), \u0027400 Bad Request\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_f773f4b2","line":265,"updated":"2019-11-14 23:12:40.000000000","message":"Worth demonstrating that even with a reserved account, the non-reserved container means a reserved object will raise?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        self.assertEqual(e.body, b\"Invalid reserved-namespace object\")"},{"line_number":263,"context_line":"        with self.assertRaises(HTTPException) as raised:"},{"line_number":264,"context_line":"            rh.validate_internal_obj("},{"line_number":265,"context_line":"                \u0027AUTH_foo\u0027, \u0027bar\u0027, rh.get_reserved_name(\u0027baz\u0027))"},{"line_number":266,"context_line":"        e \u003d raised.exception"},{"line_number":267,"context_line":"        self.assertEqual(e.status_int, 400)"},{"line_number":268,"context_line":"        self.assertEqual(str(e), \u0027400 Bad Request\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_8eaa9fcf","line":265,"in_reply_to":"3fa7e38b_f773f4b2","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"test/unit/common/test_swob.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"        self.assertFalse(req.allow_reserved_names)"},{"line_number":1127,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027\u0027, headers\u003d{"},{"line_number":1128,"context_line":"            \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027})"},{"line_number":1129,"context_line":"        self.assertTrue(req.allow_reserved_names)"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"class TestStatusMap(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_f7cf74b0","line":1129,"updated":"2019-11-14 23:12:40.000000000","message":"Should we show that trying to *set* allow_reserved_names raises an AttributeError?\n\nAlternatively, is it worth making a setter? I suppose I ought to go see what it looks like later in the chain to have to use it purely as a header...","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"        self.assertFalse(req.allow_reserved_names)"},{"line_number":1127,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027\u0027, headers\u003d{"},{"line_number":1128,"context_line":"            \u0027X-Backend-Allow-Reserved-Names\u0027: \u0027true\u0027})"},{"line_number":1129,"context_line":"        self.assertTrue(req.allow_reserved_names)"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"class TestStatusMap(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_ee29d3f1","line":1129,"in_reply_to":"3fa7e38b_f7cf74b0","updated":"2019-11-18 18:27:49.000000000","message":"I don\u0027t want to write an interface we don\u0027t use anymore than I want to assert a behavior we don\u0027t care about","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"test/unit/container/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            logger\u003dself.logger)"},{"line_number":80,"context_line":"        # some of the policy tests want at least two policies"},{"line_number":81,"context_line":"        self.assertTrue(len(POLICIES) \u003e 1)"},{"line_number":82,"context_line":"        self.ts \u003d (Timestamp(t) for t in itertools.count(int(time.time())))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def tearDown(self):"},{"line_number":85,"context_line":"        rmtree(os.path.dirname(self.testdir), ignore_errors\u003d1)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_7792a45a","line":82,"updated":"2019-11-14 23:12:40.000000000","message":"nit: We\u0027ve got a helper for this these days, don\u0027t we?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e5109f9f5cf5268026f4eeda5f1bc5b1ace97d2e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            logger\u003dself.logger)"},{"line_number":80,"context_line":"        # some of the policy tests want at least two policies"},{"line_number":81,"context_line":"        self.assertTrue(len(POLICIES) \u003e 1)"},{"line_number":82,"context_line":"        self.ts \u003d (Timestamp(t) for t in itertools.count(int(time.time())))"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def tearDown(self):"},{"line_number":85,"context_line":"        rmtree(os.path.dirname(self.testdir), ignore_errors\u003d1)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_2e436bb2","line":82,"in_reply_to":"3fa7e38b_7792a45a","updated":"2019-11-18 18:27:49.000000000","message":"Done","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"251d9a6be4cb9d2a5454a6668895317743d2565a","unresolved":false,"context_lines":[{"line_number":7166,"context_line":"        })"},{"line_number":7167,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7168,"context_line":"        self.assertEqual(resp.status, \u0027412 Precondition Failed\u0027)"},{"line_number":7169,"context_line":"        self.assertEqual(resp.body, \u0027Invalid null-namespace object in \u0027"},{"line_number":7170,"context_line":"                         \u0027user-namespace container\u0027)"},{"line_number":7171,"context_line":""},{"line_number":7172,"context_line":"    def test_not_utf8_and_not_logging_requests(self):"},{"line_number":7173,"context_line":"        inbuf \u003d WsgiBytesIO()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_1a466223","line":7170,"range":{"start_line":7169,"start_character":36,"end_line":7170,"end_character":51},"updated":"2019-10-01 22:29:00.000000000","message":"This is gonna be a byte-string.","commit_id":"1315de7b0e09b5c999e4161b12209732d2ed027f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":7182,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":7183,"context_line":"        self.assertEqual(resp.status, \u0027201 Created\u0027)"},{"line_number":7184,"context_line":""},{"line_number":7185,"context_line":"        bad_req \u003d Request.blank(\u0027/sda1/p/a/c/%s\u0027 % obj, method\u003d\u0027PUT\u0027, headers\u003d{"},{"line_number":7186,"context_line":"            \u0027X-Timestamp\u0027: next(self.ts).internal})"},{"line_number":7187,"context_line":"        resp \u003d bad_req.get_response(self.object_controller)"},{"line_number":7188,"context_line":"        self.assertEqual(resp.status, \u0027400 Bad Request\u0027)"},{"line_number":7189,"context_line":"        self.assertEqual(resp.body, b\u0027Invalid reserved-namespace object \u0027"},{"line_number":7190,"context_line":"                         b\u0027in user-namespace container\u0027)"},{"line_number":7191,"context_line":""},{"line_number":7192,"context_line":"        for method in (\u0027GET\u0027, \u0027POST\u0027, \u0027DELETE\u0027):"},{"line_number":7193,"context_line":"            req.method \u003d method"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_172fb03e","line":7190,"range":{"start_line":7185,"start_character":0,"end_line":7190,"end_character":56},"updated":"2019-11-14 23:12:40.000000000","message":"Isn\u0027t this covered by test_create_reserved_namespace_object_in_user_container? Oh, I guess all the bad_req assertions below...","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2c6731e6c7bca9d003ba016646e267ce36995bf3","unresolved":false,"context_lines":[{"line_number":7189,"context_line":"        self.assertEqual(resp.body, b\u0027Invalid reserved-namespace object \u0027"},{"line_number":7190,"context_line":"                         b\u0027in user-namespace container\u0027)"},{"line_number":7191,"context_line":""},{"line_number":7192,"context_line":"        for method in (\u0027GET\u0027, \u0027POST\u0027, \u0027DELETE\u0027):"},{"line_number":7193,"context_line":"            req.method \u003d method"},{"line_number":7194,"context_line":"            req.headers[\u0027X-Timestamp\u0027] \u003d next(self.ts).internal"},{"line_number":7195,"context_line":"            resp \u003d req.get_response(self.object_controller)"}],"source_content_type":"text/x-python","patch_set":23,"id":"3fa7e38b_3700acab","line":7192,"updated":"2019-11-14 23:12:40.000000000","message":"What about HEAD?\n\nI don\u0027t think OPTIONS actually goes to the backend, right?","commit_id":"6c90f5c9679b70e7c7ef0e15efda800e4fc9d6d3"}]}
