)]}'
{"doc/saio/swift/proxy-server.conf":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"d32e9dc8c81845bbc5931eaffa0fe2d81beb8a26","unresolved":false,"context_lines":[{"line_number":8,"context_line":"[pipeline:main]"},{"line_number":9,"context_line":"# Yes, proxy-logging appears twice. This is so that"},{"line_number":10,"context_line":"# middleware-originated requests get logged too."},{"line_number":11,"context_line":"pipeline \u003d catch_errors healthcheck proxy-logging bulk ratelimit crossdomain slo dlo cache tempurl tempauth staticweb account-quotas container-quotas proxy-logging proxy-server"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[filter:catch_errors]"},{"line_number":14,"context_line":"use \u003d egg:swift#catch_errors"}],"source_content_type":"text/plain","patch_set":7,"id":"AAAAUH%2F%2Bzxs%3D","line":11,"updated":"2014-01-22 04:22:17.000000000","message":"Should we move tempurl before slo and dlo?  See question: https://answers.launchpad.net/swift/+question/242333","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3423dcb3239627825dd5ab5bf6f589472cf30d9f","unresolved":false,"context_lines":[{"line_number":8,"context_line":"[pipeline:main]"},{"line_number":9,"context_line":"# Yes, proxy-logging appears twice. This is so that"},{"line_number":10,"context_line":"# middleware-originated requests get logged too."},{"line_number":11,"context_line":"pipeline \u003d catch_errors healthcheck proxy-logging bulk ratelimit crossdomain slo dlo cache tempurl tempauth staticweb account-quotas container-quotas proxy-logging proxy-server"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[filter:catch_errors]"},{"line_number":14,"context_line":"use \u003d egg:swift#catch_errors"}],"source_content_type":"text/plain","patch_set":7,"id":"AAAAUH%2F%2Bu6o%3D","line":11,"in_reply_to":"AAAAUH%2F%2Bzxs%3D","updated":"2014-01-22 18:56:18.000000000","message":"Experimentally, it works either way. I need to think about this one more to see if there\u0027s a problem with one order or the other.","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"}],"swift/common/middleware/dlo.py":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"16a762f426ec329c4b48c1b7095232618acc4b75","unresolved":false,"context_lines":[{"line_number":227,"context_line":"class DynamicLargeObject(object):"},{"line_number":228,"context_line":"    def __init__(self, app, conf):"},{"line_number":229,"context_line":"        self.app \u003d app"},{"line_number":230,"context_line":"        self.conf \u003d conf"},{"line_number":231,"context_line":"        self.logger \u003d get_logger(conf, log_route\u003d\u0027dlo\u0027)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        # DLO functionality used to live in the proxy server, not middleware,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BypA%3D","line":230,"updated":"2014-01-22 04:52:41.000000000","message":"Is there any reason to store the conf for this middleware?  Is it a /info thing?\n\nWhile we save it, the only references to it that I can see are on lines 238 - 241, where they could also reference it as just \"conf\" since it is still in context.  Additionally, the _populate_config_from_old_location modifies that dictionary, without referencing self.conf to do it, so we might as well just drop the self.conf references entirely, unless there is something I am missing here.","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3423dcb3239627825dd5ab5bf6f589472cf30d9f","unresolved":false,"context_lines":[{"line_number":227,"context_line":"class DynamicLargeObject(object):"},{"line_number":228,"context_line":"    def __init__(self, app, conf):"},{"line_number":229,"context_line":"        self.app \u003d app"},{"line_number":230,"context_line":"        self.conf \u003d conf"},{"line_number":231,"context_line":"        self.logger \u003d get_logger(conf, log_route\u003d\u0027dlo\u0027)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        # DLO functionality used to live in the proxy server, not middleware,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bu6A%3D","line":230,"in_reply_to":"AAAAUH%2F%2BypA%3D","updated":"2014-01-22 18:56:18.000000000","message":"Done","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"16a762f426ec329c4b48c1b7095232618acc4b75","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            read_conf_dir(cp, conf[\u0027__file__\u0027])"},{"line_number":254,"context_line":"        else:"},{"line_number":255,"context_line":"            cp.read(conf[\u0027__file__\u0027])"},{"line_number":256,"context_line":"        pipe \u003d None"},{"line_number":257,"context_line":"        try:"},{"line_number":258,"context_line":"            pipe \u003d cp.get(\"pipeline:main\", \"pipeline\")"},{"line_number":259,"context_line":"        except (NoSectionError, NoOptionError):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Byo8%3D","line":256,"updated":"2014-01-22 04:52:41.000000000","message":"This does not seem necessary.","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3423dcb3239627825dd5ab5bf6f589472cf30d9f","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            read_conf_dir(cp, conf[\u0027__file__\u0027])"},{"line_number":254,"context_line":"        else:"},{"line_number":255,"context_line":"            cp.read(conf[\u0027__file__\u0027])"},{"line_number":256,"context_line":"        pipe \u003d None"},{"line_number":257,"context_line":"        try:"},{"line_number":258,"context_line":"            pipe \u003d cp.get(\"pipeline:main\", \"pipeline\")"},{"line_number":259,"context_line":"        except (NoSectionError, NoOptionError):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bu5Y%3D","line":256,"in_reply_to":"AAAAUH%2F%2Byo8%3D","updated":"2014-01-22 18:56:18.000000000","message":"Indeed it is not. :)","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"16a762f426ec329c4b48c1b7095232618acc4b75","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            return self.app(env, start_response)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        # install our COPY-callback hook"},{"line_number":283,"context_line":"        env[\u0027swift.copy_response_hook\u0027] \u003d self.copy_response_hook("},{"line_number":284,"context_line":"            env.get(\u0027swift.copy_response_hook\u0027, lambda req, resp: resp))"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if ((req.method \u003d\u003d \u0027GET\u0027 or req.method \u003d\u003d \u0027HEAD\u0027) and"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Byoc%3D","line":283,"updated":"2014-01-22 04:52:41.000000000","message":"Why do you need to always install this hook?  Isn\u0027t this only necessary for PUT?","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3423dcb3239627825dd5ab5bf6f589472cf30d9f","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            return self.app(env, start_response)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        # install our COPY-callback hook"},{"line_number":283,"context_line":"        env[\u0027swift.copy_response_hook\u0027] \u003d self.copy_response_hook("},{"line_number":284,"context_line":"            env.get(\u0027swift.copy_response_hook\u0027, lambda req, resp: resp))"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        if ((req.method \u003d\u003d \u0027GET\u0027 or req.method \u003d\u003d \u0027HEAD\u0027) and"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bu4E%3D","line":283,"in_reply_to":"AAAAUH%2F%2Byoc%3D","updated":"2014-01-22 18:56:18.000000000","message":"Other middlewares might emit COPY/PUT requests at any time, including ones that come after us in the pipeline.\n\nI don\u0027t think any ones in Swift do that right now, but I\u0027ve been working on one that turns DELETE into COPY+DELETE (basically trashcan/recyclebin functionality, only worse), so in that case I definitely want the hook there for all requests.","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"e817204785cd4839bf0905e4025096b2234444e7","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from swift.common.utils import get_logger, json, SegmentedIterable, \\"},{"line_number":25,"context_line":"    RateLimitedIterator, read_conf_dir"},{"line_number":26,"context_line":"from swift.common.wsgi import WSGIContext"},{"line_number":27,"context_line":"from urllib import quote, unquote"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class GetContext(WSGIContext):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHJM%3D","line":27,"updated":"2014-01-30 01:48:12.000000000","message":"Better to use swift.common.utils.quote for utf8-safeness.","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d09684370551a88d1d176d656084678eca0d81f2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from swift.common.utils import get_logger, json, SegmentedIterable, \\"},{"line_number":25,"context_line":"    RateLimitedIterator, read_conf_dir"},{"line_number":26,"context_line":"from swift.common.wsgi import WSGIContext"},{"line_number":27,"context_line":"from urllib import quote, unquote"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class GetContext(WSGIContext):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHFQ%3D","line":27,"in_reply_to":"AAAAUH%2F%2BHJM%3D","updated":"2014-01-30 02:40:24.000000000","message":"Done","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"e817204785cd4839bf0905e4025096b2234444e7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                last_byte \u003d max(last_byte - seg_length, -1)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            if len(segments) \u003c CONTAINER_LISTING_LIMIT:"},{"line_number":97,"context_line":"                # a short page means that we\u0027re done with the listing"},{"line_number":98,"context_line":"                break"},{"line_number":99,"context_line":"            elif last_byte \u003c 0:"},{"line_number":100,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHJk%3D","line":97,"updated":"2014-01-30 01:48:12.000000000","message":"I know I coded this in the original, but we should keep in mind that this might not always be true (if db splitting ever happens). Not sure if it\u0027s worth changing tbh, we may never have an implementation that returns a short listing even if there is more to follow. Just felt like venting I guess, so feel free to ignore this. :)","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d09684370551a88d1d176d656084678eca0d81f2","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                last_byte \u003d max(last_byte - seg_length, -1)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"            if len(segments) \u003c CONTAINER_LISTING_LIMIT:"},{"line_number":97,"context_line":"                # a short page means that we\u0027re done with the listing"},{"line_number":98,"context_line":"                break"},{"line_number":99,"context_line":"            elif last_byte \u003c 0:"},{"line_number":100,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHCo%3D","line":97,"in_reply_to":"AAAAUH%2F%2BHJk%3D","updated":"2014-01-30 02:40:24.000000000","message":":)\n\nI\u0027d love to have split DBs or something, but I can only imagine the client breakage if Swift started returning short pages that weren\u0027t the end of the listing. We couldn\u0027t even tweak the whitespace in the XML container listing without knocking over someone\u0027s house of cards.\n\nYou\u0027re right, though, I didn\u0027t really think about it. I just grabbed existing behavior and copied it. If you don\u0027t mind, I\u0027d like to leave it as-is for now, since it does mean making fewer backend requests. If we do end up with split DBs someday, this middleware should be pretty easy to track down. :)","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"e817204785cd4839bf0905e4025096b2234444e7","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                            req, self.dlo.app, listing_iter,"},{"line_number":199,"context_line":"                            ua_suffix\u003d\"DLO MultipartGET\","},{"line_number":200,"context_line":"                            name\u003dreq.path, logger\u003dself.logger,"},{"line_number":201,"context_line":"                            max_get_time\u003d86400))"},{"line_number":202,"context_line":"        resp.app_iter.response \u003d resp"},{"line_number":203,"context_line":"        return resp"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHLY%3D","line":201,"updated":"2014-01-30 01:48:12.000000000","message":"Should this 86400 be self.dlo.max_get_time?","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d09684370551a88d1d176d656084678eca0d81f2","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                            req, self.dlo.app, listing_iter,"},{"line_number":199,"context_line":"                            ua_suffix\u003d\"DLO MultipartGET\","},{"line_number":200,"context_line":"                            name\u003dreq.path, logger\u003dself.logger,"},{"line_number":201,"context_line":"                            max_get_time\u003d86400))"},{"line_number":202,"context_line":"        resp.app_iter.response \u003d resp"},{"line_number":203,"context_line":"        return resp"},{"line_number":204,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHCk%3D","line":201,"in_reply_to":"AAAAUH%2F%2BHLY%3D","updated":"2014-01-30 02:40:24.000000000","message":"Yup, looks like I missed a spot when making that configurable. Fixed.","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"},{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"e817204785cd4839bf0905e4025096b2234444e7","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        except (NoSectionError, NoOptionError):"},{"line_number":259,"context_line":"            return"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        proxy_name \u003d pipe.rsplit(\u0027 \u0027, 1)[-1]"},{"line_number":262,"context_line":"        proxy_section \u003d \"app:\" + proxy_name"},{"line_number":263,"context_line":"        for setting in (\u0027rate_limit_after_segment\u0027,"},{"line_number":264,"context_line":"                        \u0027rate_limit_segments_per_sec\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHNU%3D","line":261,"updated":"2014-01-30 01:48:12.000000000","message":"Super minor: You can actually do rsplit(None, 1) to get the standard any-whitespace splitter; you know, in case some insane person used tabs.","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d09684370551a88d1d176d656084678eca0d81f2","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        except (NoSectionError, NoOptionError):"},{"line_number":259,"context_line":"            return"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        proxy_name \u003d pipe.rsplit(\u0027 \u0027, 1)[-1]"},{"line_number":262,"context_line":"        proxy_section \u003d \"app:\" + proxy_name"},{"line_number":263,"context_line":"        for setting in (\u0027rate_limit_after_segment\u0027,"},{"line_number":264,"context_line":"                        \u0027rate_limit_segments_per_sec\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BG9I%3D","line":261,"in_reply_to":"AAAAUH%2F%2BHNU%3D","updated":"2014-01-30 02:40:24.000000000","message":"Good to know. I can certainly fix that up as long as I\u0027m in here.","commit_id":"c319965380ecc660b21c58084e9e20e0d95363de"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":1216,"name":"gholt","email":"z-launchpad@brim.net","username":"gholt"},"change_message_id":"e817204785cd4839bf0905e4025096b2234444e7","unresolved":false,"context_lines":[{"line_number":136,"context_line":""},{"line_number":137,"context_line":"from contextlib import contextmanager"},{"line_number":138,"context_line":"from time import time"},{"line_number":139,"context_line":"from urllib import quote"},{"line_number":140,"context_line":"from cStringIO import StringIO"},{"line_number":141,"context_line":"from datetime import datetime"},{"line_number":142,"context_line":"from sys import exc_info"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BHIE%3D","side":"PARENT","line":139,"updated":"2014-01-30 01:48:12.000000000","message":"Just saw this one too. swift.common.utils.quote is safer.","commit_id":"9034558f0b0c7ec190ed243cace39b973e578f4e"}],"swift/common/utils.py":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"d32e9dc8c81845bbc5931eaffa0fe2d81beb8a26","unresolved":false,"context_lines":[{"line_number":2545,"context_line":"    return _quote(get_valid_utf8_str(value), safe)"},{"line_number":2546,"context_line":""},{"line_number":2547,"context_line":""},{"line_number":2548,"context_line":"def close_if_possible(maybe_closable):"},{"line_number":2549,"context_line":"    close_method \u003d getattr(maybe_closable, \u0027close\u0027, None)"},{"line_number":2550,"context_line":"    if callable(close_method):"},{"line_number":2551,"context_line":"        return close_method()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bzdc%3D","line":2548,"updated":"2014-01-22 04:22:17.000000000","message":"The only consumer of this method appears to be the slo module where it was originally. The calls to this method in the SloIterable were removed below when instantiated here as SegementedIterable, so it might be worth leaving these methods where they were.","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"d32e9dc8c81845bbc5931eaffa0fe2d81beb8a26","unresolved":false,"context_lines":[{"line_number":2628,"context_line":""},{"line_number":2629,"context_line":"                seg_resp \u003d seg_req.get_response(self.app)"},{"line_number":2630,"context_line":"                if not is_success(seg_resp.status_int):"},{"line_number":2631,"context_line":"                    raise SegmentError("},{"line_number":2632,"context_line":"                        \u0027ERROR: While processing manifest %s, \u0027"},{"line_number":2633,"context_line":"                        \u0027got %d while retrieving %s\u0027 %"},{"line_number":2634,"context_line":"                        (self.name, seg_resp.status_int, seg_path))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BzfM%3D","line":2631,"updated":"2014-01-22 04:22:17.000000000","message":"Prior to this statement in the original code there appears to be a close_if_possible(seg_resp.app_iter). Has that been folded into the handling of the iterator itself somehow?","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"3423dcb3239627825dd5ab5bf6f589472cf30d9f","unresolved":false,"context_lines":[{"line_number":2628,"context_line":""},{"line_number":2629,"context_line":"                seg_resp \u003d seg_req.get_response(self.app)"},{"line_number":2630,"context_line":"                if not is_success(seg_resp.status_int):"},{"line_number":2631,"context_line":"                    raise SegmentError("},{"line_number":2632,"context_line":"                        \u0027ERROR: While processing manifest %s, \u0027"},{"line_number":2633,"context_line":"                        \u0027got %d while retrieving %s\u0027 %"},{"line_number":2634,"context_line":"                        (self.name, seg_resp.status_int, seg_path))"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bu3s%3D","line":2631,"in_reply_to":"AAAAUH%2F%2BzfM%3D","updated":"2014-01-22 18:56:18.000000000","message":"Gah. I must have rebased this patch stupidly at one point. Will fix.","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"},{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"d32e9dc8c81845bbc5931eaffa0fe2d81beb8a26","unresolved":false,"context_lines":[{"line_number":2643,"context_line":"                    # object many times which would hammer our obj servers. If"},{"line_number":2644,"context_line":"                    # this is a range request, don\u0027t check content-length"},{"line_number":2645,"context_line":"                    # because it won\u0027t match."},{"line_number":2646,"context_line":"                    raise SegmentError("},{"line_number":2647,"context_line":"                        \u0027Object segment no longer valid: \u0027"},{"line_number":2648,"context_line":"                        \u0027%(path)s etag: %(r_etag)s !\u003d %(s_etag)s or \u0027"},{"line_number":2649,"context_line":"                        \u0027%(r_size)s !\u003d %(s_size)s.\u0027 %"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bzeo%3D","line":2646,"updated":"2014-01-22 04:22:17.000000000","message":"Same comment as above regarding close_if_possible call removal...","commit_id":"360019a98048cfe27b65e78a8a1270e51ac31b0d"}],"swift/proxy/server.py":[{"author":{"_account_id":2696,"name":"Darrell Bishop","email":"dbishop@nvidia.com","username":"darrellb"},"change_message_id":"c4afbe6d3b2624cf752b1fc5cdf7c2a89a642841","unresolved":false,"context_lines":[{"line_number":44,"context_line":"#"},{"line_number":45,"context_line":"# \"name\" (required) is the entry point name from setup.py."},{"line_number":46,"context_line":"#"},{"line_number":47,"context_line":"# \"after\" (optional) is a list of middlewares that this middleware should come"},{"line_number":48,"context_line":"# after. Default is for the middleware to go at the start of the pipeline. Any"},{"line_number":49,"context_line":"# middlewares in the \"after\" list that are not present in the pipeline will be"},{"line_number":50,"context_line":"# ignored, so you can safely name optional middlewares to come after. For"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F9ypU%3D","line":47,"updated":"2014-02-03 21:59:48.000000000","message":"This \"after\" doc is orphaned, right?  Your commit message and the code change below both indicate that \"after_fn\" fully supersedes \"after\".","commit_id":"31f3d241d376fba17b748976fe8e736e571ef795"}]}
