)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6198,"name":"Peter Portante","email":"peter.a.portante@gmail.com","username":"peter-a-portante"},"change_message_id":"ec957be44820e9f005e9ad849bf0c7d338571447","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Added discoverable capabilities."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Swift can now optionally be configured to allow requests to \u0027/info\u0027, providing information about the swift cluster.  Additionally a HMAC signed requests to \u0027/info?swiftinfo_sig\u003d\u003csign\u003e\u0026swiftinfo_expires\u003d\u003cexpires\u003e\u0027 can be configured allowing privileged access to more sensitive information not meant to be public."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I2379360fbfe3d9e9e8b25f1dc34517d199574495"},{"line_number":12,"context_line":"Implements: blueprint capabilities"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAATn%2F%2Fk%2Fk%3D","line":9,"updated":"2013-11-01 01:39:06.000000000","message":"Can you line wrap this to 70 characters if you revisit this?","commit_id":"55f8c2e9fe655dc5de32f67f4b4d5e6b95c7fd89"}],"etc/proxy-server.conf-sample":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":7,"context_line":"# user \u003d swift"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"# Disables exposing configuration setting via HTTP GET /info."},{"line_number":10,"context_line":"# expose_info \u003d false"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"# Key to use for admin calls that are HMAC signed.  Not setting an admin_key"},{"line_number":13,"context_line":"# will disable admin calls to /info."}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAATn%2F%2Bo6M%3D","line":10,"updated":"2013-11-22 07:12:33.000000000","message":"This should be \"true\" to reflect the default in proxy/server.py","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# expose_info \u003d false"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"# Key to use for admin calls that are HMAC signed.  Not setting an admin_key"},{"line_number":13,"context_line":"# will disable admin calls to /info."},{"line_number":14,"context_line":"# admin_key \u003d secret_admin_key"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# Allows the ability to withhold sections from showing up in the public"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAATn%2F%2Bo5s%3D","line":13,"updated":"2013-11-22 07:12:33.000000000","message":"Maybe a note saying \"default is empty\" or something?","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# Allows the ability to withhold sections from showing up in the public"},{"line_number":17,"context_line":"# calls to /info.  The following would cause the sections \u0027container_quotas\u0027"},{"line_number":18,"context_line":"# and \u0027tempurl\u0027 to not be listed."},{"line_number":19,"context_line":"# disallowed_sections \u003d container_quotas, tempurl"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# Use an integer to override the number of pre-forked processes that will"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAATn%2F%2Bo5o%3D","line":18,"updated":"2013-11-22 07:12:33.000000000","message":"Maybe a note saying \"default is empty\" or something?","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"}],"swift/common/middleware/bulk.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class CreateContainerError(Exception):"},{"line_number":36,"context_line":"    def __init__(self, msg, status_int, status):"},{"line_number":37,"context_line":"        register_swift_info(\u0027bulk\u0027)"},{"line_number":38,"context_line":"        self.status_int \u003d status_int"},{"line_number":39,"context_line":"        self.status \u003d status"},{"line_number":40,"context_line":"        Exception.__init__(self, msg)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Boxw%3D","line":37,"updated":"2013-11-22 07:12:33.000000000","message":"Sorry I didn\u0027t see this before, but this belongs in Bulk.__init__ down around line 199, not in this class.","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"}],"swift/common/middleware/formpost.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":162,"context_line":"class _IterRequestsFileLikeObject(object):"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def __init__(self, wsgi_input, boundary, input_buffer):"},{"line_number":165,"context_line":"        register_swift_info(\u0027formpost\u0027)"},{"line_number":166,"context_line":"        self.no_more_data_for_this_file \u003d False"},{"line_number":167,"context_line":"        self.no_more_files \u003d False"},{"line_number":168,"context_line":"        self.wsgi_input \u003d wsgi_input"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Boxo%3D","line":165,"updated":"2013-11-22 07:12:33.000000000","message":"This belongs down around FormPost.__init__ down around line 300, not up here.","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"}],"swift/common/middleware/recon.py":[{"author":{"_account_id":995,"name":"David Goetz","email":"david.goetz@rackspace.com","username":"david-goetz"},"change_message_id":"e1f46f754ddc70234b5937c8b5e7f787fa0e862c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def __init__(self, app, conf, *args, **kwargs):"},{"line_number":44,"context_line":"        register_swift_info(\u0027recon\u0027)"},{"line_number":45,"context_line":"        self.app \u003d app"},{"line_number":46,"context_line":"        self.devices \u003d conf.get(\u0027devices\u0027, \u0027/srv/node/\u0027)"},{"line_number":47,"context_line":"        swift_dir \u003d conf.get(\u0027swift_dir\u0027, \u0027/etc/swift\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FdVA%3D","line":44,"updated":"2013-11-05 17:34:29.000000000","message":"prob shouldn\u0027t be here since not run on proxy server","commit_id":"28adbf8aff0771aac218f06bfcf593963f78bfa0"}],"swift/common/middleware/slo.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"7ff6e7a7b03965be674d8b223216be85b66fba3f","unresolved":false,"context_lines":[{"line_number":178,"context_line":"class SloContext(WSGIContext):"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def __init__(self, slo, slo_etag):"},{"line_number":181,"context_line":"        register_swift_info(\u0027slo\u0027)"},{"line_number":182,"context_line":"        WSGIContext.__init__(self, slo.app)"},{"line_number":183,"context_line":"        self.slo_etag \u003d \u0027\"\u0027 + slo_etag.hexdigest() + \u0027\"\u0027"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FJBo%3D","line":181,"updated":"2013-11-13 22:06:28.000000000","message":"This is in the wrong place; it should really go in the StaticLargeObject class. Otherwise, it doesn\u0027t get registered until after a manifest PUT operation.","commit_id":"53f176dbd7152d9c07685c278201a47c720e5698"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                                     1024 * 1024 * 2))"},{"line_number":220,"context_line":"        self.min_segment_size \u003d int(self.conf.get(\u0027min_segment_size\u0027,"},{"line_number":221,"context_line":"                                    1024 * 1024))"},{"line_number":222,"context_line":"        self.bulk_deleter \u003d Bulk(app, {})"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def handle_multipart_put(self, req, start_response):"},{"line_number":225,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Bow4%3D","line":222,"updated":"2013-11-22 07:12:33.000000000","message":"hehe... so here\u0027s an interesting wrinkle for you. You\u0027re going to need some way of stopping Bulk.__init__ from calling register_swift_info when invoked from here, otherwise a cluster with SLO but without bulk operations will still report \"bulk\" in its /info response.","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"}],"swift/common/middleware/staticweb.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"\"\""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def __init__(self, staticweb, version, account, container, obj):"},{"line_number":142,"context_line":"        register_swift_info(\u0027staticweb\u0027)"},{"line_number":143,"context_line":"        WSGIContext.__init__(self, staticweb.app)"},{"line_number":144,"context_line":"        self.version \u003d version"},{"line_number":145,"context_line":"        self.account \u003d account"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2Bow0%3D","line":142,"updated":"2013-11-22 07:12:33.000000000","message":"I think this should be in StaticWeb.__init__ around line 440.","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"}],"swift/common/utils.py":[{"author":{"_account_id":995,"name":"David Goetz","email":"david.goetz@rackspace.com","username":"david-goetz"},"change_message_id":"e1f46f754ddc70234b5937c8b5e7f787fa0e862c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import uuid"},{"line_number":29,"context_line":"import functools"},{"line_number":30,"context_line":"from hashlib import md5"},{"line_number":31,"context_line":"from hashlib import sha1"},{"line_number":32,"context_line":"from random import random, shuffle"},{"line_number":33,"context_line":"from urllib import quote as _quote"},{"line_number":34,"context_line":"from contextlib import contextmanager, closing"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2FdU0%3D","line":31,"updated":"2013-11-05 17:34:29.000000000","message":"just do \tfrom hashlib import md5, sha1","commit_id":"28adbf8aff0771aac218f06bfcf593963f78bfa0"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"7ff6e7a7b03965be674d8b223216be85b66fba3f","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    :param expires: Unix timestamp as an int for when the URL"},{"line_number":111,"context_line":"                    expires."},{"line_number":112,"context_line":"    :param key: Key str, from the X-Account-Meta-Temp-URL-Key of"},{"line_number":113,"context_line":"                the account."},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    :returns: hexdigest str of the HMAC-SHA1 for the request."},{"line_number":116,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FRaU%3D","line":113,"updated":"2013-11-13 22:06:28.000000000","message":"Doc string needs some updates; since we\u0027re off in utils-land, it doesn\u0027t make sense to talk about \"the account\" here, nor tempurl keys.","commit_id":"53f176dbd7152d9c07685c278201a47c720e5698"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":124,"context_line":"_swift_admin_info \u003d {}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"def get_swift_info(admin\u003dFalse, disallowed_sections\u003d[]):"},{"line_number":128,"context_line":"    \"\"\""},{"line_number":129,"context_line":"    Returns information about the swift cluster that has been previously"},{"line_number":130,"context_line":"    registered with the register_swift_info call."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2BowU%3D","line":127,"updated":"2013-11-22 07:12:33.000000000","message":"Just a style note here: mutable default values tend to make folks\u0027 eyebrows go up a bit since Python computes default args once at compile time. It\u0027s not a problem here, strictly speaking, since disallowed_sections is not modified in this function. However, I think this would be better written as an empty tuple, not an empty list.","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"045aa5e19d6faa6deb07c0ec48bdc3862fdbb25b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        if section not in info:"},{"line_number":144,"context_line":"            info[section] \u003d {}"},{"line_number":145,"context_line":"        for key, value in _swift_info[section].iteritems():"},{"line_number":146,"context_line":"            info[section][key] \u003d value"},{"line_number":147,"context_line":"    if admin:"},{"line_number":148,"context_line":"        info[\u0027admin\u0027] \u003d dict(_swift_admin_info)"},{"line_number":149,"context_line":"        info[\u0027admin\u0027][\u0027disallowed_sections\u0027] \u003d list(disallowed_sections)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F%2BosM%3D","line":146,"updated":"2013-11-22 07:12:33.000000000","message":"I think (though I have not tried it) that the previous 4 lines could be replaced with:\n\n    info[section] \u003d dict(_swift_info[section].items())\n\nAt a minimum, \"for section in _swift_info\" won\u0027t repeat sections, so the \"if section not in info\" check is unnecessary.","commit_id":"6d1d424be6c52c1850264b1f313a5a734de7bac0"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"be39538228152caf65bdd95c049a6e575a6edd83","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                   added."},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    if name \u003d\u003d \u0027admin\u0027 or name \u003d\u003d \u0027disallowed_sections\u0027:"},{"line_number":164,"context_line":"        raise KeyError(\u0027\\\u0027admin\\\u0027 is reserved name.\u0027)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    if admin:"},{"line_number":167,"context_line":"        dict_to_use \u003d _swift_admin_info"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Blb0%3D","line":164,"updated":"2013-11-22 20:17:21.000000000","message":"this\u0027ll be a little confusing when name is \"disallowed_sections\"\n\nalso, this might be better as a ValueError; KeyError usually means \"this key isn\u0027t in this container\", while ValueError more often means \"this value you fed me is no good\"","commit_id":"cbcd1bd00f35af411459d58a9e9c410528c1b6f1"}],"swift/proxy/controllers/info.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"be39538228152caf65bdd95c049a6e575a6edd83","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        if \u0027Origin\u0027 in req.headers:"},{"line_number":90,"context_line":"            headers[\u0027Access-Control-Allow-Origin\u0027] \u003d req.headers[\u0027Origin\u0027]"},{"line_number":91,"context_line":"            headers[\u0027Access-Control-Expose-Headers\u0027] \u003d \u0027, \u0027.join("},{"line_number":92,"context_line":"                [\u0027x-trans-id\u0027])"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        info \u003d json.dumps(get_swift_info("},{"line_number":95,"context_line":"            admin\u003dadmin_request, disallowed_sections\u003dself.disallowed_sections))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2Blaw%3D","line":92,"updated":"2013-11-22 20:17:21.000000000","message":"It looks like there used to be other things here, but now there\u0027s just one. You can lose the whole join and list and just say\n\n    headers[\u0027Access-Control-Expose-Headers\u0027] \u003d \u0027x-trans-id\u0027","commit_id":"cbcd1bd00f35af411459d58a9e9c410528c1b6f1"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"be39538228152caf65bdd95c049a6e575a6edd83","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        headers[\u0027Content-Length\u0027] \u003d len(info)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if req.method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":99,"context_line":"            info \u003d \u0027\u0027"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        return HTTPOk(request\u003dreq,"},{"line_number":102,"context_line":"                      headers\u003dheaders,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BlUM%3D","line":99,"updated":"2013-11-22 20:17:21.000000000","message":"I could be wrong, but I don\u0027t think you need this conditional. IIRC, swob.Responses are smart enough to not return response bodies to HEAD requests.","commit_id":"cbcd1bd00f35af411459d58a9e9c410528c1b6f1"}],"swift/proxy/server.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"7ff6e7a7b03965be674d8b223216be85b66fba3f","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                return HTTPPreconditionFailed("},{"line_number":289,"context_line":"                    request\u003dreq, body\u003d\u0027Invalid UTF8 or contains NULL\u0027)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"            if req.path \u003d\u003d \u0027/info\u0027:"},{"line_number":292,"context_line":"                return self.handle_info(req)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2FRZ0%3D","line":291,"updated":"2013-11-13 22:06:28.000000000","message":"Some method filtering would be good to have here; I\u0027m not sure what the semantics of \"DELETE /info\" would be.\n\nSince this is read-only, I think the only methods allowed in should be GET, HEAD, and OPTIONS. [OPTIONS may be handled earlier; I haven\u0027t checked.]\n\n(Also, I am amused that a PSOT request (not POST) still results in a 200 OK w/a JSON response body.)","commit_id":"53f176dbd7152d9c07685c278201a47c720e5698"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"be39538228152caf65bdd95c049a6e575a6edd83","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from eventlet import Timeout"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from swift.__init__ import __canonical_version__ as swift_version"},{"line_number":26,"context_line":"from swift.common.ring import Ring"},{"line_number":27,"context_line":"from swift.common.utils import cache_from_env, get_logger, \\"},{"line_number":28,"context_line":"    get_remote_client, split_path, config_true_value, generate_trans_id, \\"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BlX4%3D","line":25,"updated":"2013-11-22 20:17:21.000000000","message":"could this first part just be \"from swift import...\" ? I\u0027ve never seen \"from X.__init__\" before.","commit_id":"cbcd1bd00f35af411459d58a9e9c410528c1b6f1"}],"test/unit/proxy/controllers/test_info.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"be39538228152caf65bdd95c049a6e575a6edd83","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from __future__ import with_statement"},{"line_number":17,"context_line":"import unittest"},{"line_number":18,"context_line":"import time"},{"line_number":19,"context_line":"from mock import Mock"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BlTU%3D","line":16,"updated":"2013-11-22 20:17:21.000000000","message":"I think you can drop this; the with statement is in Python 2.5+, and Swift only supports 2.6+.","commit_id":"cbcd1bd00f35af411459d58a9e9c410528c1b6f1"}]}
