)]}'
{"etc/proxy-server.conf-sample":[{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"f4ffdcf1553edf42b3c044070aa84af5bd189267","unresolved":false,"context_lines":[{"line_number":353,"context_line":"[filter:container-quotas]"},{"line_number":354,"context_line":"use \u003d egg:swift#container_quotas"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD"},{"line_number":357,"context_line":"# Note: Put before both ratelimit and auth in the pipeline."},{"line_number":358,"context_line":"[filter:slo]"},{"line_number":359,"context_line":"use \u003d egg:swift#slo"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAN3%2F%2F7D0%3D","line":356,"updated":"2013-03-06 09:39:15.000000000","message":"you have a bad merge here.","commit_id":"e54e59dcc5c6c3324d221a059e261c123cd88b72"}],"swift/common/middleware/account_quotas.py":[{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d2fe6685069431807e4af356ff0ac499befc8dd7","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        self.conf \u003d conf"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_quota(self, env, version, account):"},{"line_number":55,"context_line":"        \"\"\" Get quota und currently used storage from account \"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        request \u003d make_pre_authed_request(env, \u0027HEAD\u0027,"},{"line_number":58,"context_line":"                                          \u0027/%s/%s\u0027 % (version, account))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F%2BPo%3D","line":55,"updated":"2013-03-05 18:21:40.000000000","message":"*and","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"06eddd92b6c10c3be5327b1bc865c02e381b7138","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                          \u0027/%s/%s\u0027 % (version, account))"},{"line_number":59,"context_line":"        response \u003d request.get_response(self.app)"},{"line_number":60,"context_line":"        bytes_used \u003d response.headers.get(\u0027x-account-bytes-used\u0027, 0)"},{"line_number":61,"context_line":"        quota \u003d response.headers.get(\u0027x-account-meta-quota-bytes\u0027, -1)"},{"line_number":62,"context_line":"        return (bytes_used, quota)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def reseller_request(self, env):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F8cQ%3D","line":61,"updated":"2013-03-05 17:21:36.000000000","message":"why do you need this when you get swift.proxy.controllers.base.account_info which would give you the infos and the memcaching for free?","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9d4a972c060b6ed6faf647b8fb5ba1a86012693a","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                                          \u0027/%s/%s\u0027 % (version, account))"},{"line_number":59,"context_line":"        response \u003d request.get_response(self.app)"},{"line_number":60,"context_line":"        bytes_used \u003d response.headers.get(\u0027x-account-bytes-used\u0027, 0)"},{"line_number":61,"context_line":"        quota \u003d response.headers.get(\u0027x-account-meta-quota-bytes\u0027, -1)"},{"line_number":62,"context_line":"        return (bytes_used, quota)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def reseller_request(self, env):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F7OE%3D","line":61,"in_reply_to":"AAAAN3%2F%2F8cQ%3D","updated":"2013-03-06 07:42:34.000000000","message":"Oh, I wasn\u0027t aware of this - I\u0027ll change that, thanks! Because the function is now quite short I\u0027ll include the remaining three lines into __call__.","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"06eddd92b6c10c3be5327b1bc865c02e381b7138","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        quota \u003d response.headers.get(\u0027x-account-meta-quota-bytes\u0027, -1)"},{"line_number":62,"context_line":"        return (bytes_used, quota)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def reseller_request(self, env):"},{"line_number":65,"context_line":"        \"\"\" Returns True if request made by reseller, otherwise False. \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        valid_groups \u003d self.conf.get(\u0027groups\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F8bk%3D","line":64,"updated":"2013-03-05 17:21:36.000000000","message":"I am not sure this is the best way to do that, probably have something allow_overrides set by the auth middleware when we are reselleradmin and then have the middleware be able to use it? Just an idea probably gholt would know better about it. and FYI: the default keystone reseller role is ResellerAdmin.","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9d4a972c060b6ed6faf647b8fb5ba1a86012693a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        quota \u003d response.headers.get(\u0027x-account-meta-quota-bytes\u0027, -1)"},{"line_number":62,"context_line":"        return (bytes_used, quota)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def reseller_request(self, env):"},{"line_number":65,"context_line":"        \"\"\" Returns True if request made by reseller, otherwise False. \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        valid_groups \u003d self.conf.get(\u0027groups\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F7OA%3D","line":64,"in_reply_to":"AAAAN3%2F%2F8bk%3D","updated":"2013-03-06 07:42:34.000000000","message":"I had a look into keystoneauth.py, tempauth.py and swauth/middleware.py. In tempauth and swauth this is hard coded to \".reseller_admin\", only Keystone has an option for one group name (and not a list of groups). I\u0027ll use some lines from the mentioned files, this will make this function much shorter and easier to read. No more union sets ;-)","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"d2fe6685069431807e4af356ff0ac499befc8dd7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \"\"\" Returns True if request made by reseller, otherwise False. \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        valid_groups \u003d self.conf.get(\u0027groups\u0027,"},{"line_number":68,"context_line":"                                     \u0027reseller,.reseller_admin\u0027).split(\u0027,\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        #used by keystone"},{"line_number":71,"context_line":"        ks_identity \u003d env.get(\u0027keystone.identity\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F%2BPk%3D","line":68,"updated":"2013-03-05 18:21:40.000000000","message":"Could you trim spaces from each group? I can easily see a user writing \n\n    groups \u003d someadmins, otheradmins\n\nand getting confused as to why people in \"otheradmins\" can\u0027t modify quotas.","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9d4a972c060b6ed6faf647b8fb5ba1a86012693a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \"\"\" Returns True if request made by reseller, otherwise False. \"\"\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        valid_groups \u003d self.conf.get(\u0027groups\u0027,"},{"line_number":68,"context_line":"                                     \u0027reseller,.reseller_admin\u0027).split(\u0027,\u0027)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        #used by keystone"},{"line_number":71,"context_line":"        ks_identity \u003d env.get(\u0027keystone.identity\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F7N8%3D","line":68,"in_reply_to":"AAAAN3%2F%2F%2BPk%3D","updated":"2013-03-06 07:42:34.000000000","message":"Good idea. On the other side - after looking into the authentication files, please see above - I think I should only use one group name. Keystone also uses only one configurable name.","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"06eddd92b6c10c3be5327b1bc865c02e381b7138","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        #used by tempauth and swauth"},{"line_number":76,"context_line":"        user \u003d env.get(\u0027REMOTE_USER\u0027)"},{"line_number":77,"context_line":"        if user and (set(user.split(\u0027,\u0027)) \u0026 set(valid_groups)):"},{"line_number":78,"context_line":"            return True"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F8bQ%3D","line":77,"updated":"2013-03-05 17:21:36.000000000","message":"you seem to love those union set :)","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9d4a972c060b6ed6faf647b8fb5ba1a86012693a","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        #used by tempauth and swauth"},{"line_number":76,"context_line":"        user \u003d env.get(\u0027REMOTE_USER\u0027)"},{"line_number":77,"context_line":"        if user and (set(user.split(\u0027,\u0027)) \u0026 set(valid_groups)):"},{"line_number":78,"context_line":"            return True"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F7MA%3D","line":77,"in_reply_to":"AAAAN3%2F%2F8bQ%3D","updated":"2013-03-06 07:42:34.000000000","message":"Will be gone in next patch :)","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"06eddd92b6c10c3be5327b1bc865c02e381b7138","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        reseller \u003d self.reseller_request(env)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # deny quota set for non-resellers"},{"line_number":97,"context_line":"        val \u003d request.headers.get(\u0027X-Account-Meta-Quota-Bytes\u0027)"},{"line_number":98,"context_line":"        if val is not None and not reseller:"},{"line_number":99,"context_line":"            return HTTPForbidden()(env, start_response)"},{"line_number":100,"context_line":"        # verify new quota headers are properly formatted"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F8cM%3D","line":97,"updated":"2013-03-05 17:21:36.000000000","message":"any chances to get this as a config ?","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9d4a972c060b6ed6faf647b8fb5ba1a86012693a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        reseller \u003d self.reseller_request(env)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # deny quota set for non-resellers"},{"line_number":97,"context_line":"        val \u003d request.headers.get(\u0027X-Account-Meta-Quota-Bytes\u0027)"},{"line_number":98,"context_line":"        if val is not None and not reseller:"},{"line_number":99,"context_line":"            return HTTPForbidden()(env, start_response)"},{"line_number":100,"context_line":"        # verify new quota headers are properly formatted"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F7L8%3D","line":97,"in_reply_to":"AAAAN3%2F%2F8cM%3D","updated":"2013-03-06 07:42:34.000000000","message":"My intention was to use it in the same way like container_quotas (\u0027X-Container-Meta-Quota-Bytes\u0027)?","commit_id":"8d160982ebdb7a0101db002015c2a13833b7625f"},{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"bd188484820b6fa683e3d2c63aa8fd2457c78109","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 OpenStack Foundation."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2F69w%3D","line":1,"updated":"2013-03-06 11:41:13.000000000","message":"I think notmyname (John) was saying that we need to put our company names now instead of OpenStack but i am not sure.","commit_id":"e54e59dcc5c6c3324d221a059e261c123cd88b72"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"f5c7313051d111fe1b1a825527083afb5d0d04bb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2013 OpenStack Foundation."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2F680%3D","line":1,"in_reply_to":"AAAAN3%2F%2F69w%3D","updated":"2013-03-06 13:42:20.000000000","message":"I was following the guidelines from http://docs.openstack.org/developer/swift/development_guidelines.html - what do you think?","commit_id":"e54e59dcc5c6c3324d221a059e261c123cd88b72"},{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"bd188484820b6fa683e3d2c63aa8fd2457c78109","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            user_groups \u003d (req.remote_user or \u0027\u0027).split(\u0027,\u0027)"},{"line_number":63,"context_line":"            if \u0027.reseller_admin\u0027 in user_groups:"},{"line_number":64,"context_line":"                return True"},{"line_number":65,"context_line":"        except AttributeError:"},{"line_number":66,"context_line":"            # when keystone is used req.remote_user is a tuple, not a string"},{"line_number":67,"context_line":"            pass"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2F694%3D","line":65,"updated":"2013-03-06 11:41:13.000000000","message":"coverage said this is not unittested.","commit_id":"e54e59dcc5c6c3324d221a059e261c123cd88b72"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"f5c7313051d111fe1b1a825527083afb5d0d04bb","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            user_groups \u003d (req.remote_user or \u0027\u0027).split(\u0027,\u0027)"},{"line_number":63,"context_line":"            if \u0027.reseller_admin\u0027 in user_groups:"},{"line_number":64,"context_line":"                return True"},{"line_number":65,"context_line":"        except AttributeError:"},{"line_number":66,"context_line":"            # when keystone is used req.remote_user is a tuple, not a string"},{"line_number":67,"context_line":"            pass"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2F644%3D","line":65,"in_reply_to":"AAAAN3%2F%2F694%3D","updated":"2013-03-06 13:42:20.000000000","message":"Done","commit_id":"e54e59dcc5c6c3324d221a059e261c123cd88b72"},{"author":{"_account_id":866,"name":"Chmouel Boudjnah","email":"chmouel@chmouel.com","username":"chmouel"},"change_message_id":"bd188484820b6fa683e3d2c63aa8fd2457c78109","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        try:"},{"line_number":78,"context_line":"            request.split_path(2, 4, rest_with_last\u003dTrue)"},{"line_number":79,"context_line":"        except ValueError:"},{"line_number":80,"context_line":"            return self.app(env, start_response)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        new_quota \u003d request.headers.get(\u0027X-Account-Meta-Quota-Bytes\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2F690%3D","line":79,"updated":"2013-03-06 11:41:13.000000000","message":"same as above.","commit_id":"e54e59dcc5c6c3324d221a059e261c123cd88b72"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"f5c7313051d111fe1b1a825527083afb5d0d04bb","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        try:"},{"line_number":78,"context_line":"            request.split_path(2, 4, rest_with_last\u003dTrue)"},{"line_number":79,"context_line":"        except ValueError:"},{"line_number":80,"context_line":"            return self.app(env, start_response)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        new_quota \u003d request.headers.get(\u0027X-Account-Meta-Quota-Bytes\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAN3%2F%2F640%3D","line":79,"in_reply_to":"AAAAN3%2F%2F690%3D","updated":"2013-03-06 13:42:20.000000000","message":"Done","commit_id":"e54e59dcc5c6c3324d221a059e261c123cd88b72"},{"author":{"_account_id":995,"name":"David Goetz","email":"david.goetz@rackspace.com","username":"david-goetz"},"change_message_id":"1e10da8b0d4d1198017642fd9a12ea827e6a9de4","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def reseller_request(self, env, req):"},{"line_number":51,"context_line":"        \"\"\" Returns True if request made by reseller, otherwise False. \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # from swift/common/middleware/keystoneauth.py authorize()"},{"line_number":54,"context_line":"        env_identity \u003d env.get(\u0027keystone.identity\u0027, {})"},{"line_number":55,"context_line":"        user_roles \u003d env_identity.get(\u0027roles\u0027, [])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2F4ZE%3D","line":52,"updated":"2013-03-07 20:31:04.000000000","message":"instead of copying the code around is it possible to have a shared function they both use? maybe some kind of is_reseller_req function that auth middlewares can define and put into the env? if somebody wrote their own auth middleware and they wanted to use this it might come in handy.","commit_id":"c4e06a274372d2a53fe8df0abac7106b5244827d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"20e4b58675a37d18dd7ddb551984b2586991601a","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def reseller_request(self, env, req):"},{"line_number":51,"context_line":"        \"\"\" Returns True if request made by reseller, otherwise False. \"\"\""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        # from swift/common/middleware/keystoneauth.py authorize()"},{"line_number":54,"context_line":"        env_identity \u003d env.get(\u0027keystone.identity\u0027, {})"},{"line_number":55,"context_line":"        user_roles \u003d env_identity.get(\u0027roles\u0027, [])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2F3iI%3D","line":52,"in_reply_to":"AAAAN3%2F%2F4ZE%3D","updated":"2013-03-08 06:57:48.000000000","message":"It is possible to modify keystoneauth.py and tempauth.py and add three/two lines to each middleware setting env[\u0027swift_reseller\u0027] \u003d True. I\u0027ll submit a new patch.\nIf someone writes a new auth middleware he just has to set this flag.","commit_id":"c4e06a274372d2a53fe8df0abac7106b5244827d"},{"author":{"_account_id":995,"name":"David Goetz","email":"david.goetz@rackspace.com","username":"david-goetz"},"change_message_id":"1e10da8b0d4d1198017642fd9a12ea827e6a9de4","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        return False"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def __call__(self, env, start_response):"},{"line_number":72,"context_line":"        request \u003d Request(env)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        if request.method not in (\"POST\", \"PUT\"):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2F4Ys%3D","line":71,"updated":"2013-03-07 20:31:04.000000000","message":"(completely optional) you could use wsgify here if you\u0027d like (I think its neat but since this is already written, may not be worth it)","commit_id":"c4e06a274372d2a53fe8df0abac7106b5244827d"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"20e4b58675a37d18dd7ddb551984b2586991601a","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        return False"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def __call__(self, env, start_response):"},{"line_number":72,"context_line":"        request \u003d Request(env)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        if request.method not in (\"POST\", \"PUT\"):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAN3%2F%2F3iE%3D","line":71,"in_reply_to":"AAAAN3%2F%2F4Ys%3D","updated":"2013-03-08 06:57:48.000000000","message":"That is a good idea. I will change my code to use wsgify.","commit_id":"c4e06a274372d2a53fe8df0abac7106b5244827d"}]}
