)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"For accounts and containers, system metadata in PUT and"},{"line_number":25,"context_line":"POST requests is treated in the same way as user"},{"line_number":26,"context_line":"metadata. For objects, system metadata is persisted for"},{"line_number":27,"context_line":"PUT requests only. POSTs (including POST as a copy) do"},{"line_number":28,"context_line":"not modify or delete existing system metadata."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"AAAATn%2F93Pc%3D","line":26,"updated":"2013-12-05 05:45:47.000000000","message":"What\u0027s the rationale for the difference between PUT and POST for objects?  Is it the same weird reason that Content-Type can\u0027t be changed via a POST?  But even that can be changed with a POST-as-copy, right?","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7aa9e964c063d3302cf4dfd5c8f12ca096f8349e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"For accounts and containers, system metadata in PUT and"},{"line_number":25,"context_line":"POST requests is treated in the same way as user"},{"line_number":26,"context_line":"metadata. For objects, system metadata is persisted for"},{"line_number":27,"context_line":"PUT requests only. POSTs (including POST as a copy) do"},{"line_number":28,"context_line":"not modify or delete existing system metadata."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"AAAATn%2F9uSU%3D","line":26,"in_reply_to":"AAAATn%2F93Pc%3D","updated":"2013-12-06 18:41:57.000000000","message":"I struggled to decide what was best to do with POSTs (and I am lacking a stakeholder/use case for the object sysmeta)...\r\n\r\n- POST has to replace the whole collection of metadata: we can\u0027t (easily) update subsets of meta (I guess because we only have one timestamp on the object+meta, as opposed to individualy timestamped meta items in containers \u0026 accounts).\r\n\r\n- So if we did accept fresh sysmeta on POSTs, one piece of middleware POSTing its new subset  could result in other middleware\u0027s sysmeta being lost.\r\n\r\n- Similarly, there\u0027s a  risk of a middleware generated POST causing user metadata to be lost.\r\n\r\n- I considered introducing a header that middleware could set on a POST to communicate to object server \u0027update all sysmeta but don\u0027t touch user meta\u0027, but in the absence of a use case that seemed to be potentially confusing and still does not avoid one middleware trashing another\u0027s sysmeta.\r\n\r\n- So I opted for sysmeta only being settable on PUT. Like user meta, sys meta could be partially updated by doing a COPY.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"}],"swift/account/server.py":[{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"780a72639929e51d932ab25de32098c0dcd8e3fb","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            metadata.update((key, (value, timestamp))"},{"line_number":159,"context_line":"                            for key, value in req.headers.iteritems()"},{"line_number":160,"context_line":"                            if key.lower().startswith(\u0027x-account-meta-\u0027) or"},{"line_number":161,"context_line":"                            key.lower().startswith(self.sys_meta_prefix))"},{"line_number":162,"context_line":"            if metadata:"},{"line_number":163,"context_line":"                broker.update_metadata(metadata)"},{"line_number":164,"context_line":"            if created:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2FfvU%3D","line":161,"updated":"2013-11-04 15:25:39.000000000","message":"It does not make sense to have a self.sys_meta_prefix but not self.meta_prefix. Either both or none. \n\nx.startswith() takes a tuple so you dont need to call it twice - instead use:\n  key.lower().startswith(\u0027x-account-meta-\u0027, \u0027x-account-sysmeta\u0027)","commit_id":"29c55c9d2a5332cb0b7407358ca9c51cb5c2a4ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b1f27c0a180afd0dd0c564c8316de8a2c77c9c01","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            metadata.update((key, (value, timestamp))"},{"line_number":159,"context_line":"                            for key, value in req.headers.iteritems()"},{"line_number":160,"context_line":"                            if key.lower().startswith(\u0027x-account-meta-\u0027) or"},{"line_number":161,"context_line":"                            key.lower().startswith(self.sys_meta_prefix))"},{"line_number":162,"context_line":"            if metadata:"},{"line_number":163,"context_line":"                broker.update_metadata(metadata)"},{"line_number":164,"context_line":"            if created:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2FdLE%3D","line":161,"in_reply_to":"AAAATn%2F%2FfvU%3D","updated":"2013-11-05 18:08:32.000000000","message":"Done.","commit_id":"29c55c9d2a5332cb0b7407358ca9c51cb5c2a4ab"}],"swift/common/middleware/gatekeeper.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"a4a8131b71cd8a00f3d8a047ea6dbbf3b6540b02","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    expr \u003d \u0027|\u0027.join(exclusions)"},{"line_number":60,"context_line":"    test \u003d re.compile(expr, re.IGNORECASE)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def is_excluded(arg):"},{"line_number":63,"context_line":"        return test.match(arg)"},{"line_number":64,"context_line":"    return is_excluded"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9uiE%3D","line":62,"updated":"2013-12-06 17:02:46.000000000","message":"You can just return\n\n  test.match\n\nhere, which is a single-argument function returning the same thing \"is_excluded\" would.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7aa9e964c063d3302cf4dfd5c8f12ca096f8349e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    expr \u003d \u0027|\u0027.join(exclusions)"},{"line_number":60,"context_line":"    test \u003d re.compile(expr, re.IGNORECASE)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def is_excluded(arg):"},{"line_number":63,"context_line":"        return test.match(arg)"},{"line_number":64,"context_line":"    return is_excluded"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9uZQ%3D","line":62,"in_reply_to":"AAAATn%2F9uiE%3D","updated":"2013-12-06 18:41:57.000000000","message":"of course! Done.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def __init__(self, app, conf):"},{"line_number":69,"context_line":"        self.app \u003d app"},{"line_number":70,"context_line":"        self.logger \u003d get_logger(conf, log_route\u003d\u0027gatekeeper\u0027)"},{"line_number":71,"context_line":"        self.reject_bad_requests \u003d conf.get(\u0027reject_bad_requests\u0027, False)"},{"line_number":72,"context_line":"        self.reject_bad_requests \u003d config_true_value(self.reject_bad_requests)"},{"line_number":73,"context_line":"        self.inbound_condition \u003d make_exclusion_test(inbound_exclusions)"},{"line_number":74,"context_line":"        self.outbound_condition \u003d make_exclusion_test(outbound_exclusions)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93Qg%3D","line":71,"updated":"2013-12-05 05:45:47.000000000","message":"Optional, but I find this less confusing (two assignments in a row?):\n\n  self.reject_bad_requests \u003d config_true_value(\n      conf.get(\u0027reject_bad_requests\u0027, \u0027false\u0027))","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    def __init__(self, app, conf):"},{"line_number":69,"context_line":"        self.app \u003d app"},{"line_number":70,"context_line":"        self.logger \u003d get_logger(conf, log_route\u003d\u0027gatekeeper\u0027)"},{"line_number":71,"context_line":"        self.reject_bad_requests \u003d conf.get(\u0027reject_bad_requests\u0027, False)"},{"line_number":72,"context_line":"        self.reject_bad_requests \u003d config_true_value(self.reject_bad_requests)"},{"line_number":73,"context_line":"        self.inbound_condition \u003d make_exclusion_test(inbound_exclusions)"},{"line_number":74,"context_line":"        self.outbound_condition \u003d make_exclusion_test(outbound_exclusions)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F919s%3D","line":71,"in_reply_to":"AAAATn%2F93Qg%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"}],"swift/common/request_helpers.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    Headers in the system metadata namespace are persisted by backend"},{"line_number":103,"context_line":"    servers in a similar way to user metadata. System metadata is"},{"line_number":104,"context_line":"    subsequently returned in the info dict generated by the"},{"line_number":105,"context_line":"    get_\u003cserver_type\u003e_info functions in base.py. The gatekeeper middleware"},{"line_number":106,"context_line":"    removes system metadata headers from client requests and response."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    :param req: a swob request"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93QE%3D","line":105,"updated":"2013-12-05 05:45:47.000000000","message":"Can you be more specific here:\n\n  ...functions in swift/proxy/controllers/base.py. The gatekeeper...","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":102,"context_line":"    Headers in the system metadata namespace are persisted by backend"},{"line_number":103,"context_line":"    servers in a similar way to user metadata. System metadata is"},{"line_number":104,"context_line":"    subsequently returned in the info dict generated by the"},{"line_number":105,"context_line":"    get_\u003cserver_type\u003e_info functions in base.py. The gatekeeper middleware"},{"line_number":106,"context_line":"    removes system metadata headers from client requests and response."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    :param req: a swob request"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9vUQ%3D","line":105,"in_reply_to":"AAAATn%2F93QE%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"\"\""},{"line_number":140,"context_line":"    if len(key) \u003c\u003d 11 + len(server_type):"},{"line_number":141,"context_line":"        return False"},{"line_number":142,"context_line":"    return key.lower().startswith(\u0027x-%s-sysmeta-\u0027 % server_type)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"def is_sys_or_user_meta(server_type, key):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93P0%3D","line":142,"updated":"2013-12-05 05:45:47.000000000","message":"This could use get_sys_meta_prefix(), reducing the number of places the magic substring \"sysmeta\" is known.  (Ditto below)","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"\"\""},{"line_number":140,"context_line":"    if len(key) \u003c\u003d 11 + len(server_type):"},{"line_number":141,"context_line":"        return False"},{"line_number":142,"context_line":"    return key.lower().startswith(\u0027x-%s-sysmeta-\u0027 % server_type)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"def is_sys_or_user_meta(server_type, key):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9vTU%3D","line":142,"in_reply_to":"AAAATn%2F93P0%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    :param key: header key"},{"line_number":176,"context_line":"    :returns: stripped header key"},{"line_number":177,"context_line":"    \"\"\""},{"line_number":178,"context_line":"    return key[len(\u0027x-%s-sysmeta-\u0027 % server_type):]"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"def get_sys_meta_prefix(server_type):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93P4%3D","line":178,"updated":"2013-12-05 05:45:47.000000000","message":"You could refactor here:\n\n  return key[len(get_sys_meta_prefix(server_type))]\n\nreducing the pieces of code who know the magic substring, \"sysmeta\".","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    :param key: header key"},{"line_number":176,"context_line":"    :returns: stripped header key"},{"line_number":177,"context_line":"    \"\"\""},{"line_number":178,"context_line":"    return key[len(\u0027x-%s-sysmeta-\u0027 % server_type):]"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"def get_sys_meta_prefix(server_type):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9vSw%3D","line":178,"in_reply_to":"AAAATn%2F93P4%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"}],"swift/common/wsgi.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"3de17aa9276a7ac71d72dd1d2cbd4f8a721ed97c","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        else:"},{"line_number":318,"context_line":"            log_name \u003d logger.name"},{"line_number":319,"context_line":"        global_conf \u003d {\u0027log_name\u0027: log_name}"},{"line_number":320,"context_line":"    app \u003d load_app(conf[\u0027__file__\u0027], global_conf\u003dglobal_conf)"},{"line_number":321,"context_line":"    max_clients \u003d int(conf.get(\u0027max_clients\u0027, \u00271024\u0027))"},{"line_number":322,"context_line":"    pool \u003d RestrictedGreenPool(size\u003dmax_clients)"},{"line_number":323,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F94VA%3D","line":320,"updated":"2013-12-05 02:03:37.000000000","message":"Why haven\u0027t all the other calls to loadapp() been similarly changed?\n\nI think at least one of the other loadapp() calls is specifically done early on in order to fast-fail if some part of the loading has errors.  It seems like you\u0027d want to exercise this pipeline-munging code at that time as well.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        else:"},{"line_number":318,"context_line":"            log_name \u003d logger.name"},{"line_number":319,"context_line":"        global_conf \u003d {\u0027log_name\u0027: log_name}"},{"line_number":320,"context_line":"    app \u003d load_app(conf[\u0027__file__\u0027], global_conf\u003dglobal_conf)"},{"line_number":321,"context_line":"    max_clients \u003d int(conf.get(\u0027max_clients\u0027, \u00271024\u0027))"},{"line_number":322,"context_line":"    pool \u003d RestrictedGreenPool(size\u003dmax_clients)"},{"line_number":323,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9u9Q%3D","line":320,"in_reply_to":"AAAATn%2F94VA%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done. In doing so, test_wsgi.py:TestWSGI.test_run_server_global_conf_callback() broke because it patches wsgi.loadapp(). Since the original wsgi.loadapp is no longer used, I have removed that and renamed the new wsgi.load_app to wsgi.loadapp, which keeps the test happy.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"}],"swift/container/server.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"65514b8c958512ac3966c8aaa6443318da906e3f","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        metadata.update("},{"line_number":461,"context_line":"            (key, (value, timestamp)) for key, value in req.headers.iteritems()"},{"line_number":462,"context_line":"            if key.lower() in self.save_headers or"},{"line_number":463,"context_line":"            key.lower().startswith(self.sys_meta_prefix) or"},{"line_number":464,"context_line":"            key.lower().startswith(\u0027x-container-meta-\u0027))"},{"line_number":465,"context_line":"        if metadata:"},{"line_number":466,"context_line":"            if \u0027X-Container-Sync-To\u0027 in metadata:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Fh6Y%3D","line":463,"updated":"2013-11-02 00:01:02.000000000","message":"4 occurrences of this change to this check in this file... this is screaming to be refactored into a helper method.","commit_id":"29c55c9d2a5332cb0b7407358ca9c51cb5c2a4ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b1f27c0a180afd0dd0c564c8316de8a2c77c9c01","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        metadata.update("},{"line_number":461,"context_line":"            (key, (value, timestamp)) for key, value in req.headers.iteritems()"},{"line_number":462,"context_line":"            if key.lower() in self.save_headers or"},{"line_number":463,"context_line":"            key.lower().startswith(self.sys_meta_prefix) or"},{"line_number":464,"context_line":"            key.lower().startswith(\u0027x-container-meta-\u0027))"},{"line_number":465,"context_line":"        if metadata:"},{"line_number":466,"context_line":"            if \u0027X-Container-Sync-To\u0027 in metadata:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2FdLk%3D","line":463,"in_reply_to":"AAAATn%2F%2Fh6Y%3D","updated":"2013-11-05 18:08:32.000000000","message":"These changes have become simpler as per comment from David Hadas. I\u0027m still happy to refactor this into a helper method if you think it better - something like is_metadata(key) - but it would be a one line method now so I\u0027ve held off doing that for now.","commit_id":"29c55c9d2a5332cb0b7407358ca9c51cb5c2a4ab"}],"swift/obj/server.py":[{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":416,"context_line":"                                if (val[0].lower().startswith(\u0027x-object-meta-\u0027)"},{"line_number":417,"context_line":"                                and len(val[0]) \u003e 14) or"},{"line_number":418,"context_line":"                                val[0].lower().startswith(\u0027x-object-sysmeta-\u0027))"},{"line_number":419,"context_line":"                for header_key in self.allowed_headers:"},{"line_number":420,"context_line":"                    if header_key in request.headers:"},{"line_number":421,"context_line":"                        header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fb8s%3D","line":418,"updated":"2013-11-06 12:00:03.000000000","message":"I know this is not something you added - \nWhy are we testing \u003e 14 here? \nWhy here and not everywhere?\nWhy do that at all?\nMy 2 cents is that we should allow \u0027X-Object-Meta-\u0027 to pass and therefore we better align this to the rest of the implementation.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"ff2fbda31cd51b3f3127dde1f4dabe29e684f543","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":416,"context_line":"                                if (val[0].lower().startswith(\u0027x-object-meta-\u0027)"},{"line_number":417,"context_line":"                                and len(val[0]) \u003e 14) or"},{"line_number":418,"context_line":"                                val[0].lower().startswith(\u0027x-object-sysmeta-\u0027))"},{"line_number":419,"context_line":"                for header_key in self.allowed_headers:"},{"line_number":420,"context_line":"                    if header_key in request.headers:"},{"line_number":421,"context_line":"                        header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Faiw%3D","line":418,"updated":"2013-11-06 20:20:53.000000000","message":"Perhaps having a request_helper like the following would be satisfactory:\n\n def user_or_sys_metadata(server_type, pair):\n     hdr_name_len \u003d len(val[0])\n     if hdr_name_len \u003c\u003d (8 + len(server_type)):\n         return False\n     hdr_name \u003d val[0].lower()\n     if hdr_name.startswith(\u0027x-%s-meta-\u0027 % server_type):\n         return True\n     if hdr_name_len \u003c\u003d (11 + len(server_type)):\n         return False\n     return hdr_name.startswith(\u0027x-%s-sysmeta-\u0027 % server_type)\n\nSo that the above code would look like:\n\n metadata.update(val for val in request.headers.iteritems() if request_helpers.user_or_sys_metadata(\u0027object\u0027, val))\n\nThen we can use this everywhere.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"17a8fa35f56e4df0424c1c4038df0e09340d49c2","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":416,"context_line":"                                if (val[0].lower().startswith(\u0027x-object-meta-\u0027)"},{"line_number":417,"context_line":"                                and len(val[0]) \u003e 14) or"},{"line_number":418,"context_line":"                                val[0].lower().startswith(\u0027x-object-sysmeta-\u0027))"},{"line_number":419,"context_line":"                for header_key in self.allowed_headers:"},{"line_number":420,"context_line":"                    if header_key in request.headers:"},{"line_number":421,"context_line":"                        header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FPA8%3D","line":418,"in_reply_to":"AAAATn%2F%2FWYM%3D","updated":"2013-11-12 14:20:45.000000000","message":"Why do we not want to add \"x-account-sysmeta-\" header? Seems like it is the only place where we filter for such a construct. If it is really an issue, we need it filter everywhere. \n\nI am still trying to understand why \"x-account-sysmeta-\" header needs to be filtered.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"3687c8fb705f8833d983e9e26d5f0789e521a320","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":416,"context_line":"                                if (val[0].lower().startswith(\u0027x-object-meta-\u0027)"},{"line_number":417,"context_line":"                                and len(val[0]) \u003e 14) or"},{"line_number":418,"context_line":"                                val[0].lower().startswith(\u0027x-object-sysmeta-\u0027))"},{"line_number":419,"context_line":"                for header_key in self.allowed_headers:"},{"line_number":420,"context_line":"                    if header_key in request.headers:"},{"line_number":421,"context_line":"                        header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWYM%3D","line":418,"in_reply_to":"AAAATn%2F%2FWu8%3D","updated":"2013-11-08 15:21:13.000000000","message":"Because we don\u0027t want to add \"x-account-sysmeta-\" header?","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"40a07ff1b1418707e6292330b711478dc1c25212","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":416,"context_line":"                                if (val[0].lower().startswith(\u0027x-object-meta-\u0027)"},{"line_number":417,"context_line":"                                and len(val[0]) \u003e 14) or"},{"line_number":418,"context_line":"                                val[0].lower().startswith(\u0027x-object-sysmeta-\u0027))"},{"line_number":419,"context_line":"                for header_key in self.allowed_headers:"},{"line_number":420,"context_line":"                    if header_key in request.headers:"},{"line_number":421,"context_line":"                        header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWu8%3D","line":418,"in_reply_to":"AAAATn%2F%2Faiw%3D","updated":"2013-11-08 11:41:35.000000000","message":"@Peter, can you justify why we need to test the length?\n\nSeems like we can do without this test.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":416,"context_line":"                                if (val[0].lower().startswith(\u0027x-object-meta-\u0027)"},{"line_number":417,"context_line":"                                and len(val[0]) \u003e 14) or"},{"line_number":418,"context_line":"                                val[0].lower().startswith(\u0027x-object-sysmeta-\u0027))"},{"line_number":419,"context_line":"                for header_key in self.allowed_headers:"},{"line_number":420,"context_line":"                    if header_key in request.headers:"},{"line_number":421,"context_line":"                        header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWes%3D","line":418,"in_reply_to":"AAAATn%2F%2Faiw%3D","updated":"2013-11-08 14:36:51.000000000","message":"ok I will look at introducing a helper","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":415,"context_line":"                metadata.update(val for val in request.headers.iteritems()"},{"line_number":416,"context_line":"                                if (val[0].lower().startswith(\u0027x-object-meta-\u0027)"},{"line_number":417,"context_line":"                                and len(val[0]) \u003e 14) or"},{"line_number":418,"context_line":"                                val[0].lower().startswith(\u0027x-object-sysmeta-\u0027))"},{"line_number":419,"context_line":"                for header_key in self.allowed_headers:"},{"line_number":420,"context_line":"                    if header_key in request.headers:"},{"line_number":421,"context_line":"                        header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbJs%3D","line":418,"in_reply_to":"AAAATn%2F%2Fb8s%3D","updated":"2013-11-08 14:36:51.000000000","message":"I had similar thoughts but I\u0027m nervous about just deleting this \u003e14 check. On the surface it appears unnecessary BUT... Proxy controllers check that metadata keys are longer than x-\u003ctype\u003e-meta- for all PUTs and POSTs except this one (object PUT) - maybe there is some good reason for it being checked here? So I\u0027m not yet comfortable with deleting the check in this patch - perhaps that should be a separate patch that will alert more eyes?","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":337,"context_line":"        if orig_timestamp \u003e\u003d request.headers[\u0027x-timestamp\u0027]:"},{"line_number":338,"context_line":"            return HTTPConflict(request\u003drequest)"},{"line_number":339,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: request.headers[\u0027x-timestamp\u0027]}"},{"line_number":340,"context_line":"        metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":341,"context_line":"                        if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":342,"context_line":"        metadata.update(val for val in request.headers.iteritems()"},{"line_number":343,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93PM%3D","line":340,"updated":"2013-12-05 05:45:47.000000000","message":"See commit message for a question re: the rationale for this difference vs. Account/Container servers.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7aa9e964c063d3302cf4dfd5c8f12ca096f8349e","unresolved":false,"context_lines":[{"line_number":337,"context_line":"        if orig_timestamp \u003e\u003d request.headers[\u0027x-timestamp\u0027]:"},{"line_number":338,"context_line":"            return HTTPConflict(request\u003drequest)"},{"line_number":339,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: request.headers[\u0027x-timestamp\u0027]}"},{"line_number":340,"context_line":"        metadata.update(val for val in orig_metadata.iteritems()"},{"line_number":341,"context_line":"                        if is_sys_meta(\u0027object\u0027, val[0]))"},{"line_number":342,"context_line":"        metadata.update(val for val in request.headers.iteritems()"},{"line_number":343,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9uMg%3D","line":340,"in_reply_to":"AAAATn%2F93PM%3D","updated":"2013-12-06 18:41:57.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"85335014b896fcbb3a8df8d5fe83b8136d480df8","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            return HTTPConflict(request\u003drequest)"},{"line_number":339,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: request.headers[\u0027x-timestamp\u0027]}"},{"line_number":340,"context_line":"        metadata.update(val for val in request.headers.iteritems()"},{"line_number":341,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":342,"context_line":"        for header_key in self.allowed_headers:"},{"line_number":343,"context_line":"            if header_key in request.headers:"},{"line_number":344,"context_line":"                header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2F1Yk%3D","line":341,"updated":"2014-01-07 22:25:21.000000000","message":"is there any harm in using sys_or_user_meta here?","commit_id":"6164fa246d4c8d2613b44751e3f08330694d1497"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"unresolved":false,"context_lines":[{"line_number":338,"context_line":"            return HTTPConflict(request\u003drequest)"},{"line_number":339,"context_line":"        metadata \u003d {\u0027X-Timestamp\u0027: request.headers[\u0027x-timestamp\u0027]}"},{"line_number":340,"context_line":"        metadata.update(val for val in request.headers.iteritems()"},{"line_number":341,"context_line":"                        if is_user_meta(\u0027object\u0027, val[0]))"},{"line_number":342,"context_line":"        for header_key in self.allowed_headers:"},{"line_number":343,"context_line":"            if header_key in request.headers:"},{"line_number":344,"context_line":"                header_caps \u003d header_key.title()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2FyTM%3D","line":341,"in_reply_to":"AAAAUH%2F%2F1Yk%3D","updated":"2014-01-08 14:36:34.000000000","message":"I think is_sys_or_user_meta should not be used here until support for object sysmeta is done. This patch does not enable object sysmeta -  some more work is needed to implement different semantics for sysmeta on object POST than semantic for user metadata.\n\nThe risk is that a middleware could send x-object-sysmeta-foo and it would be persisted along with user metadata, before object sysmeta is actually \u0027supported\u0027.\n\n(Unlike container and account, the proxy object controller is liberal in forwarding headers to the backend object server, so\nthere is nothing stopping middleware sending x-object-sysmeta-foo to the backend object server. For time being, that should be ignored at the object server, not persisted).","commit_id":"6164fa246d4c8d2613b44751e3f08330694d1497"}],"swift/proxy/controllers/base.py":[{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"780a72639929e51d932ab25de32098c0dcd8e3fb","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        INFO_SYS_META_KEY: dict((key[len(sys_meta_prefix):], value)"},{"line_number":145,"context_line":"                                for key, value in headers.iteritems()"},{"line_number":146,"context_line":"                                if key.startswith(sys_meta_prefix))"},{"line_number":147,"context_line":"    }"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"def headers_to_container_info(headers, status_int\u003dHTTP_OK):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Ffsc%3D","line":147,"updated":"2013-11-04 15:25:39.000000000","message":"Again, it does not sense for the code to have \u0027meta\u0027 and than INFO_SYS_META_KEY - I suggest that in this patch you simply use \u0027sysmeta\u0027 and get rid of the INFO_SYS_META_KEY. \n\nMaybe better to walk the headers only once instead of twice and occupy both dictionaries.","commit_id":"29c55c9d2a5332cb0b7407358ca9c51cb5c2a4ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b1f27c0a180afd0dd0c564c8316de8a2c77c9c01","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        INFO_SYS_META_KEY: dict((key[len(sys_meta_prefix):], value)"},{"line_number":145,"context_line":"                                for key, value in headers.iteritems()"},{"line_number":146,"context_line":"                                if key.startswith(sys_meta_prefix))"},{"line_number":147,"context_line":"    }"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"def headers_to_container_info(headers, status_int\u003dHTTP_OK):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2FdMA%3D","line":147,"in_reply_to":"AAAATn%2F%2Ffsc%3D","updated":"2013-11-05 18:08:32.000000000","message":"ok, removed INFO_SYS_META_KEY.\r\n\r\nRe. walking header once - good point, but there were already two iterations, one to lower case keys, one for meta, so I have introduced a function that all the headers_to_*_info functions can call to do lower case key, extract meta and extract sysmeta in one iteration.","commit_id":"29c55c9d2a5332cb0b7407358ca9c51cb5c2a4ab"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# key for middleware extension headers in request environ"},{"line_number":52,"context_line":"ENV_MWARE_HDRS_KEY \u003d \u0027swift.mware_headers\u0027"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def get_sys_meta_prefix(server_type):"},{"line_number":56,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbiQ%3D","line":53,"updated":"2013-11-06 12:00:03.000000000","message":"In other places (e.g. \u0027swift.authorize\u0027) we do not use constants.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    :returns: prefix string for server type\u0027s system metadata headers"},{"line_number":64,"context_line":"    \"\"\""},{"line_number":65,"context_line":"    return \u0027x-%s-%s-\u0027 % (server_type.lower(), \u0027sysmeta\u0027)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"def update_headers(response, headers):"},{"line_number":69,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fb78%3D","line":66,"updated":"2013-11-06 12:00:03.000000000","message":"To conform to the general style of coding I suggest to remove this function","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    two subsets containing user and system metadata."},{"line_number":129,"context_line":"    \"\"\""},{"line_number":130,"context_line":"    meta_prefix \u003d \u0027x-%s-meta-\u0027 % server_type"},{"line_number":131,"context_line":"    sysmeta_prefix \u003d get_sys_meta_prefix(server_type)"},{"line_number":132,"context_line":"    meta \u003d {}"},{"line_number":133,"context_line":"    sysmeta \u003d {}"},{"line_number":134,"context_line":"    all \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fb8I%3D","line":131,"updated":"2013-11-06 12:00:03.000000000","message":"Same comment as before: why treat sysmeta differently than meta?\n\nWhy not:\n    sysmeta_prefix \u003d \u0027x-%s-sysmeta-\u0027 % server_type","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if lkey.startswith(meta_prefix):"},{"line_number":139,"context_line":"            meta[lkey[len(meta_prefix):]] \u003d val"},{"line_number":140,"context_line":"        elif lkey.startswith(sysmeta_prefix):"},{"line_number":141,"context_line":"            sysmeta[lkey[len(sysmeta_prefix):]] \u003d val"},{"line_number":142,"context_line":"    return all, meta, sysmeta"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fbjg%3D","line":141,"updated":"2013-11-06 12:00:03.000000000","message":"if we are already doing that....    It may make more sense to use this function to divide all headers to three groups: meta, sysmeta and others....\n\ni.e. - adding here:\n       elseif: \n                other[lkey] \u003d val\n\nand later returning \n     return other, meta, sysmeta   \n\ninstead of returning all headers","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"17a8fa35f56e4df0424c1c4038df0e09340d49c2","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if lkey.startswith(meta_prefix):"},{"line_number":139,"context_line":"            meta[lkey[len(meta_prefix):]] \u003d val"},{"line_number":140,"context_line":"        elif lkey.startswith(sysmeta_prefix):"},{"line_number":141,"context_line":"            sysmeta[lkey[len(sysmeta_prefix):]] \u003d val"},{"line_number":142,"context_line":"    return all, meta, sysmeta"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FO%2F8%3D","line":141,"in_reply_to":"AAAATn%2F%2FbJE%3D","updated":"2013-11-12 14:20:45.000000000","message":"Its a small implementation issue - either way it works (I guess apart from  a minor performance difference)","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        if lkey.startswith(meta_prefix):"},{"line_number":139,"context_line":"            meta[lkey[len(meta_prefix):]] \u003d val"},{"line_number":140,"context_line":"        elif lkey.startswith(sysmeta_prefix):"},{"line_number":141,"context_line":"            sysmeta[lkey[len(sysmeta_prefix):]] \u003d val"},{"line_number":142,"context_line":"    return all, meta, sysmeta"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbJE%3D","line":141,"in_reply_to":"AAAATn%2F%2Fbjg%3D","updated":"2013-11-08 14:36:51.000000000","message":"I considered doing that but headers_to_container_info() requires the meta namespace headers to be returned in the \u0027all\u0027 dict in order to construct the cors info item. I could have changed the cors related code to use the \u0027meta\u0027 dict but that seemed to be making unnecessary changes to existing code. Open to suggestion?","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":578,"context_line":"    that is not a string"},{"line_number":579,"context_line":"    \"\"\""},{"line_number":580,"context_line":"    if req is None or not hdrs:"},{"line_number":581,"context_line":"        return"},{"line_number":582,"context_line":"    # will raise exception if any key is not a basestring"},{"line_number":583,"context_line":"    # or hdrs is not iterable"},{"line_number":584,"context_line":"    hdrs \u003d dict((k.lower(), v) for k, v in hdrs.iteritems())"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbhY%3D","line":581,"updated":"2013-11-06 12:00:03.000000000","message":"In C that makes perfect sense as it is always better to gracefully terminate than to have a crash...\n\nIn python, as far as I can say, you normally prefer that an exception would be raised if a wrong parameter was passed. Exceptions are than captured and the user get a graceful error.\n\nHiding the problem by avoiding this exception as done here only makes it harder for the bug to be discovered.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":578,"context_line":"    that is not a string"},{"line_number":579,"context_line":"    \"\"\""},{"line_number":580,"context_line":"    if req is None or not hdrs:"},{"line_number":581,"context_line":"        return"},{"line_number":582,"context_line":"    # will raise exception if any key is not a basestring"},{"line_number":583,"context_line":"    # or hdrs is not iterable"},{"line_number":584,"context_line":"    hdrs \u003d dict((k.lower(), v) for k, v in hdrs.iteritems())"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWgc%3D","line":581,"in_reply_to":"AAAATn%2F%2FbhY%3D","updated":"2013-11-08 14:36:51.000000000","message":"OK will fix","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":586,"context_line":"    # discard any rogue existing entry - should be a dict"},{"line_number":587,"context_line":"    exist \u003d exist if isinstance(exist, dict) else {}"},{"line_number":588,"context_line":"    exist.update(hdrs)"},{"line_number":589,"context_line":"    req.environ.update({ENV_MWARE_HDRS_KEY: exist})"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"def register_sys_metadata(req, server_type, metadata\u003d{}):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fbg4%3D","line":589,"updated":"2013-11-06 12:00:03.000000000","message":"Can do:\n      req.environ.get(\u0027swift.mware_headers\u0027).update(hdrs)\n\nOr do the same and force the keys to .lower()\n\nIn any case either do .lower() here or when you extract the headers - no need to do in both","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":586,"context_line":"    # discard any rogue existing entry - should be a dict"},{"line_number":587,"context_line":"    exist \u003d exist if isinstance(exist, dict) else {}"},{"line_number":588,"context_line":"    exist.update(hdrs)"},{"line_number":589,"context_line":"    req.environ.update({ENV_MWARE_HDRS_KEY: exist})"},{"line_number":590,"context_line":""},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"def register_sys_metadata(req, server_type, metadata\u003d{}):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbBQ%3D","line":589,"in_reply_to":"AAAATn%2F%2Fbg4%3D","updated":"2013-11-08 14:36:51.000000000","message":"Its not that simple. First, the first call to this function needs to construct a dict and set it in the environ. \r\n\r\nSecond, I want to raise an exception here if any key is not a string so that middleware is immediately aware of error, otherwise an exception will occur later which the middleware will be unaware of. The conversion to .lower() facilitates that.  (Although I\u0027m now thinking a better solution might be to use a swob HeaderKeyDict for mware_headers which would take care of this )","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":617,"context_line":"    if req is None or not metadata:"},{"line_number":618,"context_line":"        return"},{"line_number":619,"context_line":"    hdrs \u003d dict((\u0027%s%s\u0027 % (prefix, k), v) for k, v in metadata.iteritems())"},{"line_number":620,"context_line":"    register_mware_headers(req, hdrs)"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"def get_sys_metadata(info):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fbc0%3D","line":620,"updated":"2013-11-06 12:00:03.000000000","message":"Can you merge the two functions into one and have a single method for registering system metadata?\n\nBtw - I am not sure the term \u0027register\u0027 is the right one - it is more like \u0027set\u0027  - maybe set_sysmeta or a variant.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"76e9a1a0313c4d558037c6e4503148cc3a7eb718","unresolved":false,"context_lines":[{"line_number":617,"context_line":"    if req is None or not metadata:"},{"line_number":618,"context_line":"        return"},{"line_number":619,"context_line":"    hdrs \u003d dict((\u0027%s%s\u0027 % (prefix, k), v) for k, v in metadata.iteritems())"},{"line_number":620,"context_line":"    register_mware_headers(req, hdrs)"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"def get_sys_metadata(info):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FKok%3D","line":620,"in_reply_to":"AAAATn%2F%2FO%2Bk%3D","updated":"2013-11-13 17:39:39.000000000","message":"Middleware adding a header to the request environ is not sufficient to get that header to the backend. For example, we need to get x-timestamp to container backend server for container forwarding, but the proxy container controller will not pass x-timestamp through.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"17a8fa35f56e4df0424c1c4038df0e09340d49c2","unresolved":false,"context_lines":[{"line_number":617,"context_line":"    if req is None or not metadata:"},{"line_number":618,"context_line":"        return"},{"line_number":619,"context_line":"    hdrs \u003d dict((\u0027%s%s\u0027 % (prefix, k), v) for k, v in metadata.iteritems())"},{"line_number":620,"context_line":"    register_mware_headers(req, hdrs)"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"def get_sys_metadata(info):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FO%2Bk%3D","line":620,"in_reply_to":"AAAATn%2F%2FbAg%3D","updated":"2013-11-12 14:20:45.000000000","message":"Than why use this mechanism?\nWhy not simply add the header to the environment 9as done by other middleware today)?","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":617,"context_line":"    if req is None or not metadata:"},{"line_number":618,"context_line":"        return"},{"line_number":619,"context_line":"    hdrs \u003d dict((\u0027%s%s\u0027 % (prefix, k), v) for k, v in metadata.iteritems())"},{"line_number":620,"context_line":"    register_mware_headers(req, hdrs)"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"def get_sys_metadata(info):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbAg%3D","line":620,"in_reply_to":"AAAATn%2F%2Fbc0%3D","updated":"2013-11-08 14:36:51.000000000","message":"We need both because register_mware_headers allows any header name to be registered. It is deliberately broader that just sysmeta headers because middleware may want to pass headers that are NOT persistent state. For example, in our container forwarding middleware we need to pass x-timestamp through to the container controller, which does not happen by default.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":629,"context_line":"    :returns: a dict containing system metadata returned from the backend"},{"line_number":630,"context_line":"    \"\"\""},{"line_number":631,"context_line":"    return info.get(\u0027sysmeta\u0027, {})"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"class Controller(object):"},{"line_number":635,"context_line":"    \"\"\"Base WSGI controller class for the proxy\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fbkc%3D","line":632,"updated":"2013-11-06 12:00:03.000000000","message":"To conform to the general style of coding I suggest to remove this\nE.g. we dont have that for meta  :)","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":705,"context_line":"        dst_headers.update(dict((k.lower(), None)"},{"line_number":706,"context_line":"                           for k in dst_headers"},{"line_number":707,"context_line":"                           if k.lower().startswith(sys_meta_prefix)))"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":"        ext_hdrs \u003d req.environ.get(ENV_MWARE_HDRS_KEY)"},{"line_number":710,"context_line":"        # accept good stuff but quietly ignore any invalid header keys"},{"line_number":711,"context_line":"        # that may have snuck in by back door"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Fbmg%3D","line":708,"updated":"2013-11-06 12:00:03.000000000","message":"This sounds wrong.\n\nWe can have a generic:\ndef filter_sysmeta(headers)\nthat will return filtered headers without sysmeta and be used for incoming and outgoing headers.\n\nAlso - it is probably better to seperate this from the function adding the sysmeta","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":705,"context_line":"        dst_headers.update(dict((k.lower(), None)"},{"line_number":706,"context_line":"                           for k in dst_headers"},{"line_number":707,"context_line":"                           if k.lower().startswith(sys_meta_prefix)))"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":"        ext_hdrs \u003d req.environ.get(ENV_MWARE_HDRS_KEY)"},{"line_number":710,"context_line":"        # accept good stuff but quietly ignore any invalid header keys"},{"line_number":711,"context_line":"        # that may have snuck in by back door"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWf8%3D","line":708,"in_reply_to":"AAAATn%2F%2Fbmg%3D","updated":"2013-11-08 14:36:51.000000000","message":"Good point, I will make this generic","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":713,"context_line":"            dst_headers.update((k.lower(), v)"},{"line_number":714,"context_line":"                               for k, v in ext_hdrs.iteritems()"},{"line_number":715,"context_line":"                               if isinstance(k, basestring))"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def generate_request_headers(self, orig_req\u003dNone, additional\u003dNone,"},{"line_number":718,"context_line":"                                 transfer\u003dFalse):"},{"line_number":719,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbeY%3D","line":716,"updated":"2013-11-06 12:00:03.000000000","message":"See remarks above - i dont think we need to test if this is a dict, or if keys are basestring as this is coming from middleare - not from the user.\nAlso - you already .lower when adding keys to the env dictionary. \n\nThis may result in a simpler implementation which may not require to be implemented as a separate function.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":713,"context_line":"            dst_headers.update((k.lower(), v)"},{"line_number":714,"context_line":"                               for k, v in ext_hdrs.iteritems()"},{"line_number":715,"context_line":"                               if isinstance(k, basestring))"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def generate_request_headers(self, orig_req\u003dNone, additional\u003dNone,"},{"line_number":718,"context_line":"                                 transfer\u003dFalse):"},{"line_number":719,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWfc%3D","line":716,"in_reply_to":"AAAATn%2F%2FbeY%3D","updated":"2013-11-08 14:36:51.000000000","message":"OK. I coded this (and above) very defensively to avoid core generating a 5xx response due to some middleware error.","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":728,"context_line":"        # we require."},{"line_number":729,"context_line":"        headers \u003d HeaderKeyDict(additional) if additional else HeaderKeyDict()"},{"line_number":730,"context_line":"        if transfer:"},{"line_number":731,"context_line":"            self.transfer_headers(orig_req.headers, headers)"},{"line_number":732,"context_line":"        self.transfer_mware_headers(orig_req, headers)"},{"line_number":733,"context_line":"        headers.setdefault(\u0027x-timestamp\u0027, normalize_timestamp(time.time()))"},{"line_number":734,"context_line":"        if orig_req:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbmM%3D","line":731,"updated":"2013-11-06 12:00:03.000000000","message":"How about: \n\n           self.filter_sysmeta(headers)\n           headers.update(req.environ.get(\u0027swift.mware_headers\u0027))\n       \ninstead of the transfer_mware_headers() function","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":4108,"name":"David Hadas","email":"davidh@il.ibm.com","username":"david-hadas"},"change_message_id":"03af60a7cf0ad5caae60e0ed14acb090315d1807","unresolved":false,"context_lines":[{"line_number":741,"context_line":"        headers[\u0027referer\u0027] \u003d referer"},{"line_number":742,"context_line":"        return headers"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def filter_response_headers(self, resp):"},{"line_number":745,"context_line":"        \"\"\""},{"line_number":746,"context_line":"        Removes response headers that should not be returned to a client."},{"line_number":747,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FbvA%3D","line":744,"updated":"2013-11-06 12:00:03.000000000","message":"Maybe change this to:\ndef filter_headers(self, headers):\n     ...\n     keys \u003d filter...\n     ...","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51118d2760cd74eb0de9ae30154e5d652b751a63","unresolved":false,"context_lines":[{"line_number":741,"context_line":"        headers[\u0027referer\u0027] \u003d referer"},{"line_number":742,"context_line":"        return headers"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def filter_response_headers(self, resp):"},{"line_number":745,"context_line":"        \"\"\""},{"line_number":746,"context_line":"        Removes response headers that should not be returned to a client."},{"line_number":747,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FWfY%3D","line":744,"in_reply_to":"AAAATn%2F%2FbvA%3D","updated":"2013-11-08 14:36:51.000000000","message":"Done","commit_id":"d7fb626efa635311ff9bacabf7ff2050c90cd30c"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"                # post as copy so enforce POST semantics i.e. preserve"},{"line_number":1041,"context_line":"                # existing sysmeta, do not preserve existing user metadata"},{"line_number":1042,"context_line":"                test \u003d lambda x: is_sys_meta(\u0027object\u0027, x)"},{"line_number":1043,"context_line":"                remove_items(new_req.headers, test)"},{"line_number":1044,"context_line":"                copy_items(source_resp.headers, new_req.headers, test)"},{"line_number":1045,"context_line":"            else:"},{"line_number":1046,"context_line":"                copy_headers_into(source_resp, new_req)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93N4%3D","line":1043,"updated":"2013-12-05 05:45:47.000000000","message":"Is it possible to have the current PUT request with a legitimately-added-by-middleware system metadata value which that middleware wants to override the value being copied from the old object?  If so, this code will prevent that, retaining the old object\u0027s system metadata value.  That seems undesirable.\n\nNote that in the else case, the PUT request\u0027s headers are copied last, allowing them to override the source object\u0027s headers.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7aa9e964c063d3302cf4dfd5c8f12ca096f8349e","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"                # post as copy so enforce POST semantics i.e. preserve"},{"line_number":1041,"context_line":"                # existing sysmeta, do not preserve existing user metadata"},{"line_number":1042,"context_line":"                test \u003d lambda x: is_sys_meta(\u0027object\u0027, x)"},{"line_number":1043,"context_line":"                remove_items(new_req.headers, test)"},{"line_number":1044,"context_line":"                copy_items(source_resp.headers, new_req.headers, test)"},{"line_number":1045,"context_line":"            else:"},{"line_number":1046,"context_line":"                copy_headers_into(source_resp, new_req)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9uQg%3D","line":1043,"in_reply_to":"AAAATn%2F93N4%3D","updated":"2013-12-06 18:41:57.000000000","message":"Not sure I understand the concern...this code is for the post as copy case (see discussion under commit message). A COPY will override existing symeta items from old object with new sysmeta items in current PUT request (i.e. the else case)","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"64bda7b43793fbd68d1a836c611649eb01ff9c67","unresolved":false,"context_lines":[{"line_number":1037,"context_line":"                    source_resp.headers[\u0027Content-Type\u0027]"},{"line_number":1038,"context_line":"            if config_true_value("},{"line_number":1039,"context_line":"                    new_req.headers.get(\u0027x-fresh-metadata\u0027, \u0027false\u0027)):"},{"line_number":1040,"context_line":"                # post as copy so enforce POST semantics i.e. preserve"},{"line_number":1041,"context_line":"                # existing sysmeta, do not preserve existing user metadata"},{"line_number":1042,"context_line":"                test \u003d lambda x: is_sys_meta(\u0027object\u0027, x)"},{"line_number":1043,"context_line":"                remove_items(new_req.headers, test)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F9t5E%3D","line":1040,"updated":"2013-12-06 19:32:58.000000000","message":"I can\u0027t remember exactly what I was thinking in my previous comment, here.  I guess user object metadata behavior is counter-intuitive enough that it\u0027s really confusing with system metadata mixed in.  See my main comment earlier, where I put forth the idea that this patch (the sysmeta capability) may be better off without any attempt to support per-object sysmeta.","commit_id":"173087bc0bc160a7e367d102d709a7c371a9ea21"}],"swift/proxy/server.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"3de17aa9276a7ac71d72dd1d2cbd4f8a721ed97c","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        \u0027\u0027\u0027"},{"line_number":484,"context_line":"        apply_filters \u003d list(required_filters)"},{"line_number":485,"context_line":"        apply_filters.reverse()"},{"line_number":486,"context_line":"        for filt in apply_filters:"},{"line_number":487,"context_line":"            ctx \u003d pipe.remove_filter(filt)"},{"line_number":488,"context_line":"            if ctx:"},{"line_number":489,"context_line":"                self.logger.info(\u0027Removing configured filter %s\u0027 % filt)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93mY%3D","line":486,"updated":"2013-12-05 02:03:37.000000000","message":"It\u0027s a small thing, but this seems clearer:\n\n  ...\n  for filt in reversed(required_filters):\n      ...\n\nIt took me a second to realize that the list constructor was just to make a copy in order to mutate it on the next line, only to iterate over it.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":483,"context_line":"        \u0027\u0027\u0027"},{"line_number":484,"context_line":"        apply_filters \u003d list(required_filters)"},{"line_number":485,"context_line":"        apply_filters.reverse()"},{"line_number":486,"context_line":"        for filt in apply_filters:"},{"line_number":487,"context_line":"            ctx \u003d pipe.remove_filter(filt)"},{"line_number":488,"context_line":"            if ctx:"},{"line_number":489,"context_line":"                self.logger.info(\u0027Removing configured filter %s\u0027 % filt)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9u2c%3D","line":486,"in_reply_to":"AAAATn%2F93mY%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"}],"test/unit/account/test_server.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":520,"context_line":"        req \u003d Request.blank("},{"line_number":521,"context_line":"            \u0027/sda1/p/a\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":522,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(3),"},{"line_number":523,"context_line":"                     hdr: \u0027New Value\u0027})"},{"line_number":524,"context_line":"        resp \u003d req.get_response(self.controller)"},{"line_number":525,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":526,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93Kk%3D","line":523,"updated":"2013-12-05 05:45:47.000000000","message":"Are you deliberately testing that the case of the header keys don\u0027t matter here, or was this supposed to be\n\n  hdr.title(): \u0027New Value\u0027})\n\n(I could see some value in the former, maybe, but a comment would make it clear it was deliberate.)","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":520,"context_line":"        req \u003d Request.blank("},{"line_number":521,"context_line":"            \u0027/sda1/p/a\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027POST\u0027},"},{"line_number":522,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(3),"},{"line_number":523,"context_line":"                     hdr: \u0027New Value\u0027})"},{"line_number":524,"context_line":"        resp \u003d req.get_response(self.controller)"},{"line_number":525,"context_line":"        self.assertEqual(resp.status_int, 204)"},{"line_number":526,"context_line":"        req \u003d Request.blank(\u0027/sda1/p/a\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9uzs%3D","line":523,"in_reply_to":"AAAATn%2F93Kk%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done. Its a mistake, not deliberate. Thanks.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"}],"test/unit/common/middleware/test_gatekeeper.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __call__(self, env, start_response):"},{"line_number":28,"context_line":"        self.req \u003d Request(env)"},{"line_number":29,"context_line":"        #print \u0027%s %s\u0027 % (self.req.method, self.req.headers)"},{"line_number":30,"context_line":"        return Response(request\u003dself.req, body\u003d\u0027FAKE APP\u0027,"},{"line_number":31,"context_line":"                        headers\u003dself.headers)(env, start_response)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93Kg%3D","line":29,"updated":"2013-12-05 05:45:47.000000000","message":"Can you just remove this?","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def __call__(self, env, start_response):"},{"line_number":28,"context_line":"        self.req \u003d Request(env)"},{"line_number":29,"context_line":"        #print \u0027%s %s\u0027 % (self.req.method, self.req.headers)"},{"line_number":30,"context_line":"        return Response(request\u003dself.req, body\u003d\u0027FAKE APP\u0027,"},{"line_number":31,"context_line":"                        headers\u003dself.headers)(env, start_response)"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9uzI%3D","line":29,"in_reply_to":"AAAATn%2F93Kg%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    forbidden_headers_out \u003d dict(sysmeta_headers)"},{"line_number":54,"context_line":"    forbidden_headers_in \u003d dict(sysmeta_headers)"},{"line_number":55,"context_line":"    #not yet..."},{"line_number":56,"context_line":"    #forbidden_headers_in.update({\u0027x-timestamp\u0027: \u00271.0\u0027,"},{"line_number":57,"context_line":"    #                             \u0027X-Timestamp\u0027: \u00271.0\u0027})"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93KQ%3D","line":55,"updated":"2013-12-05 05:45:47.000000000","message":"What\u0027s the story on X-Timestamp \"coming soon\" as a header to be filtered?  Why not just add it in this patch? Does it break something?","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    forbidden_headers_out \u003d dict(sysmeta_headers)"},{"line_number":54,"context_line":"    forbidden_headers_in \u003d dict(sysmeta_headers)"},{"line_number":55,"context_line":"    #not yet..."},{"line_number":56,"context_line":"    #forbidden_headers_in.update({\u0027x-timestamp\u0027: \u00271.0\u0027,"},{"line_number":57,"context_line":"    #                             \u0027X-Timestamp\u0027: \u00271.0\u0027})"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9uxA%3D","line":55,"in_reply_to":"AAAATn%2F93KQ%3D","updated":"2013-12-06 17:10:32.000000000","message":"In conversation with Peter Portante he mentioned wanting to filter x-timestamp from client requests, but I believe container sync currently relies on x-timestamp propagating. There\u0027s a corresponding comment in the gatekeeper middleware module (line 43).\r\n\r\n\r\nI\u0027ll delete both comments.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"ca0e204061e13aedfa082a13975ee661cade8603","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertTrue(fake_app.req is None)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def test_reserved_header_rejected(self):"},{"line_number":93,"context_line":"        for method in [\u0027PUT\u0027, \u0027POST\u0027, \u0027GET\u0027, \u0027DELETE\u0027]:"},{"line_number":94,"context_line":"            self._test_reserved_header_rejected(method)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _test_reserved_header_not_rejected(self, method):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F93J0%3D","line":93,"updated":"2013-12-05 05:45:47.000000000","message":"Not that the code under test really cares what the method is, but you might consider throwing in COPY and OPTIONS here.  Ditto a few other places in this file.","commit_id":"8134281b444ce2d33661284435386250b65f3a42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1acf923a5a2961740e612de6978680aae622e3e2","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.assertTrue(fake_app.req is None)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def test_reserved_header_rejected(self):"},{"line_number":93,"context_line":"        for method in [\u0027PUT\u0027, \u0027POST\u0027, \u0027GET\u0027, \u0027DELETE\u0027]:"},{"line_number":94,"context_line":"            self._test_reserved_header_rejected(method)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _test_reserved_header_not_rejected(self, method):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F9urk%3D","line":93,"in_reply_to":"AAAATn%2F93J0%3D","updated":"2013-12-06 17:10:32.000000000","message":"Done","commit_id":"8134281b444ce2d33661284435386250b65f3a42"}],"test/unit/common/test_wsgi.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"85335014b896fcbb3a8df8d5fe83b8136d480df8","unresolved":false,"context_lines":[{"line_number":990,"context_line":"            \u0027swift.common.middleware.healthcheck\u0027,"},{"line_number":991,"context_line":"            \u0027swift.common.middleware.catch_errors\u0027,"},{"line_number":992,"context_line":"            \u0027swift.common.middleware.gatekeeper\u0027,"},{"line_number":993,"context_line":"            \u0027swift.proxy.server\u0027])"},{"line_number":994,"context_line":""},{"line_number":995,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":996,"context_line":"    unittest.main()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2F1hQ%3D","line":993,"updated":"2014-01-07 22:25:21.000000000","message":"love these tests ^  very DAMP","commit_id":"6164fa246d4c8d2613b44751e3f08330694d1497"}],"test/unit/proxy/controllers/test_account.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            if kwargs.get(\u0027headers\u0027, {}):"},{"line_number":105,"context_line":"                context[\u0027headers\u0027] \u003d kwargs.get(\u0027headers\u0027)"},{"line_number":106,"context_line":"            elif len(args) \u003e\u003d 7:"},{"line_number":107,"context_line":"                context[\u0027headers\u0027] \u003d args[6]"},{"line_number":108,"context_line":"        return callback"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_sys_meta_headers_PUT(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5r0%3D","line":107,"updated":"2014-01-07 02:02:57.000000000","message":"I wonder if just giving the method signature of bufferedhttp.http_connect() to callback() would make this clearer; then the body of callback would just turn into some assignment statements, and that might turn out easier to read.","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            if kwargs.get(\u0027headers\u0027, {}):"},{"line_number":105,"context_line":"                context[\u0027headers\u0027] \u003d kwargs.get(\u0027headers\u0027)"},{"line_number":106,"context_line":"            elif len(args) \u003e\u003d 7:"},{"line_number":107,"context_line":"                context[\u0027headers\u0027] \u003d args[6]"},{"line_number":108,"context_line":"        return callback"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_sys_meta_headers_PUT(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F388%3D","line":107,"in_reply_to":"AAAAUH%2F%2F5r0%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":122,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":123,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":124,"context_line":"        req \u003d Request.blank(\u0027/a\u0027, headers\u003dhdrs_in)"},{"line_number":125,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":126,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":127,"context_line":"            controller.PUT(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5s0%3D","line":124,"updated":"2014-01-07 02:02:57.000000000","message":"should be \u0027/v1/a\u0027","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":122,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":123,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":124,"context_line":"        req \u003d Request.blank(\u0027/a\u0027, headers\u003dhdrs_in)"},{"line_number":125,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":126,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":127,"context_line":"            controller.PUT(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F384%3D","line":124,"in_reply_to":"AAAAUH%2F%2F5s0%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":145,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":146,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":147,"context_line":"        req \u003d Request.blank(\u0027/a\u0027, headers\u003dhdrs_in)"},{"line_number":148,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":149,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":150,"context_line":"            controller.POST(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5ss%3D","line":147,"updated":"2014-01-07 02:02:57.000000000","message":"should be \u0027/v1/a\u0027","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":145,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":146,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":147,"context_line":"        req \u003d Request.blank(\u0027/a\u0027, headers\u003dhdrs_in)"},{"line_number":148,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":149,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":150,"context_line":"            controller.POST(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F380%3D","line":147,"in_reply_to":"AAAAUH%2F%2F5ss%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"}],"test/unit/proxy/controllers/test_base.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":509,"context_line":"        src_headers \u003d {\u0027x-remove-base-meta-owner\u0027: \u0027x\u0027,"},{"line_number":510,"context_line":"                       \u0027x-base-meta-size\u0027: \u0027151M\u0027,"},{"line_number":511,"context_line":"                       \u0027new-owner\u0027: \u0027Kun\u0027}"},{"line_number":512,"context_line":"        req \u003d Request.blank(\u0027/a/c/o\u0027, headers\u003dsrc_headers)"},{"line_number":513,"context_line":"        dst_headers \u003d base.generate_request_headers(req, transfer\u003dTrue)"},{"line_number":514,"context_line":"        expected_headers \u003d {\u0027x-base-meta-owner\u0027: \u0027\u0027,"},{"line_number":515,"context_line":"                            \u0027x-base-meta-size\u0027: \u0027151M\u0027}"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5rE%3D","line":512,"updated":"2014-01-07 02:02:57.000000000","message":"Should be \u0027/v1/a/c/o\u0027","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":509,"context_line":"        src_headers \u003d {\u0027x-remove-base-meta-owner\u0027: \u0027x\u0027,"},{"line_number":510,"context_line":"                       \u0027x-base-meta-size\u0027: \u0027151M\u0027,"},{"line_number":511,"context_line":"                       \u0027new-owner\u0027: \u0027Kun\u0027}"},{"line_number":512,"context_line":"        req \u003d Request.blank(\u0027/a/c/o\u0027, headers\u003dsrc_headers)"},{"line_number":513,"context_line":"        dst_headers \u003d base.generate_request_headers(req, transfer\u003dTrue)"},{"line_number":514,"context_line":"        expected_headers \u003d {\u0027x-base-meta-owner\u0027: \u0027\u0027,"},{"line_number":515,"context_line":"                            \u0027x-base-meta-size\u0027: \u0027151M\u0027}"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F38A%3D","line":512,"in_reply_to":"AAAAUH%2F%2F5rE%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        bad_hdrs \u003d {\u0027x-base-sysmeta-\u0027: \u0027too short\u0027}"},{"line_number":526,"context_line":"        hdrs \u003d dict(good_hdrs)"},{"line_number":527,"context_line":"        hdrs.update(bad_hdrs)"},{"line_number":528,"context_line":"        req \u003d Request.blank(\u0027/a/c/o\u0027, headers\u003dhdrs)"},{"line_number":529,"context_line":"        dst_headers \u003d base.generate_request_headers(req, transfer\u003dTrue)"},{"line_number":530,"context_line":"        for k, v in good_hdrs.iteritems():"},{"line_number":531,"context_line":"            print str(dst_headers)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5rI%3D","line":528,"updated":"2014-01-07 02:02:57.000000000","message":"Should be \u0027/v1/a/c/o\u0027","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":525,"context_line":"        bad_hdrs \u003d {\u0027x-base-sysmeta-\u0027: \u0027too short\u0027}"},{"line_number":526,"context_line":"        hdrs \u003d dict(good_hdrs)"},{"line_number":527,"context_line":"        hdrs.update(bad_hdrs)"},{"line_number":528,"context_line":"        req \u003d Request.blank(\u0027/a/c/o\u0027, headers\u003dhdrs)"},{"line_number":529,"context_line":"        dst_headers \u003d base.generate_request_headers(req, transfer\u003dTrue)"},{"line_number":530,"context_line":"        for k, v in good_hdrs.iteritems():"},{"line_number":531,"context_line":"            print str(dst_headers)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F378%3D","line":528,"in_reply_to":"AAAAUH%2F%2F5rI%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":528,"context_line":"        req \u003d Request.blank(\u0027/a/c/o\u0027, headers\u003dhdrs)"},{"line_number":529,"context_line":"        dst_headers \u003d base.generate_request_headers(req, transfer\u003dTrue)"},{"line_number":530,"context_line":"        for k, v in good_hdrs.iteritems():"},{"line_number":531,"context_line":"            print str(dst_headers)"},{"line_number":532,"context_line":"            self.assertTrue(k.lower() in dst_headers)"},{"line_number":533,"context_line":"            self.assertEqual(v, dst_headers[k.lower()])"},{"line_number":534,"context_line":"        for k, v in bad_hdrs.iteritems():"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5wM%3D","line":531,"updated":"2014-01-07 02:02:57.000000000","message":"Looks like a debugging print got left over.","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":528,"context_line":"        req \u003d Request.blank(\u0027/a/c/o\u0027, headers\u003dhdrs)"},{"line_number":529,"context_line":"        dst_headers \u003d base.generate_request_headers(req, transfer\u003dTrue)"},{"line_number":530,"context_line":"        for k, v in good_hdrs.iteritems():"},{"line_number":531,"context_line":"            print str(dst_headers)"},{"line_number":532,"context_line":"            self.assertTrue(k.lower() in dst_headers)"},{"line_number":533,"context_line":"            self.assertEqual(v, dst_headers[k.lower()])"},{"line_number":534,"context_line":"        for k, v in bad_hdrs.iteritems():"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F374%3D","line":531,"in_reply_to":"AAAAUH%2F%2F5wM%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"}],"test/unit/proxy/controllers/test_container.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":88,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":89,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":90,"context_line":"        req \u003d Request.blank(\u0027/a/c\u0027, headers\u003dhdrs_in)"},{"line_number":91,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":92,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":93,"context_line":"            controller.PUT(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5vE%3D","line":90,"updated":"2014-01-07 02:02:57.000000000","message":"This should be \u0027/v1/a/c\u0027. It won\u0027t affect this test since you call ContainerController.PUT directly, but as sort of a general hygiene thing, it should probably get fixed.\n\nThis change happened in commit 3530708, which was merged sometime after this change was first submitted. Hooray for stuff changing out from under you. :|","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":88,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":89,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":90,"context_line":"        req \u003d Request.blank(\u0027/a/c\u0027, headers\u003dhdrs_in)"},{"line_number":91,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":92,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":93,"context_line":"            controller.PUT(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F3%2F8%3D","line":90,"in_reply_to":"AAAAUH%2F%2F5vE%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done. yep, should have remembered that path_info_pop got eliminated.","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"5380a0efc617bff628adfe39792970c3e6aaf2df","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":111,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":112,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":113,"context_line":"        req \u003d Request.blank(\u0027/a/c\u0027, headers\u003dhdrs_in)"},{"line_number":114,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":115,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":116,"context_line":"            controller.POST(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F5vA%3D","line":113,"updated":"2014-01-07 02:02:57.000000000","message":"Same as above: \u0027/v1/a/c\u0027","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a4c74e4ce7c53241fef4d4cd72ce8c06d86b0f43","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        hdrs_in \u003d {sys_meta_key: \u0027foo\u0027,"},{"line_number":111,"context_line":"                   user_meta_key: \u0027bar\u0027,"},{"line_number":112,"context_line":"                   \u0027x-timestamp\u0027: \u00271.0\u0027}"},{"line_number":113,"context_line":"        req \u003d Request.blank(\u0027/a/c\u0027, headers\u003dhdrs_in)"},{"line_number":114,"context_line":"        with mock.patch(\u0027swift.proxy.controllers.base.http_connect\u0027,"},{"line_number":115,"context_line":"                        fake_http_connect(200, 200, give_connect\u003dcallback)):"},{"line_number":116,"context_line":"            controller.POST(req)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F%2F3%2FI%3D","line":113,"in_reply_to":"AAAAUH%2F%2F5vA%3D","updated":"2014-01-07 17:33:27.000000000","message":"Done","commit_id":"111bc041d8ef7eaea6518ac55e34a8edbcc66e3a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"85335014b896fcbb3a8df8d5fe83b8136d480df8","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self.assertEqual(context[\u0027headers\u0027][sys_meta_key], \u0027foo\u0027)"},{"line_number":117,"context_line":"        self.assertTrue(user_meta_key in context[\u0027headers\u0027])"},{"line_number":118,"context_line":"        self.assertEqual(context[\u0027headers\u0027][user_meta_key], \u0027bar\u0027)"},{"line_number":119,"context_line":"        self.assertNotEqual(context[\u0027headers\u0027][\u0027x-timestamp\u0027], \u00271.0\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2F1eA%3D","line":119,"updated":"2014-01-07 22:25:21.000000000","message":"why is this not equal?","commit_id":"6164fa246d4c8d2613b44751e3f08330694d1497"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self.assertEqual(context[\u0027headers\u0027][sys_meta_key], \u0027foo\u0027)"},{"line_number":117,"context_line":"        self.assertTrue(user_meta_key in context[\u0027headers\u0027])"},{"line_number":118,"context_line":"        self.assertEqual(context[\u0027headers\u0027][user_meta_key], \u0027bar\u0027)"},{"line_number":119,"context_line":"        self.assertNotEqual(context[\u0027headers\u0027][\u0027x-timestamp\u0027], \u00271.0\u0027)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2FySo%3D","line":119,"in_reply_to":"AAAAUH%2F%2F1eA%3D","updated":"2014-01-08 14:36:34.000000000","message":"Not equal because the container controller does not propagate x-timestamp from client request to backend request. As a consequence, the backend request should always have a fresh x-timestamp which cannot equal the string \u00271.0\u0027  because normalize_timestamp is applied to the value. (line 893 proxy/controllers/base.py)\n\nI included the x-timestamp assertion to check that my mods have not inadvertantly opened up a path for x-timestamp as well as x-container-sysmeta-* (and to convince myself of the statement above).","commit_id":"6164fa246d4c8d2613b44751e3f08330694d1497"}]}
