)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"add name_check to /info"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Also removed a bunch of unnecessary unquotes. Just use path_info"},{"line_number":10,"context_line":"instead (it\u0027s already unquoted). This removes SCRIPT_NAME, but that"},{"line_number":11,"context_line":"is never set in Swift. Swift is always the root URL path."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"9a30ddce_357180e1","line":9,"updated":"2017-03-08 01:33:34.000000000","message":"gah, I hate that - now I\u0027m all like \"but there *must* have been a reason!?\"","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"f19cc6f9db3fbc3c1163b0d56d13b9ae55f524d8","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Also removed a bunch of unnecessary unquotes. Just use path_info"},{"line_number":10,"context_line":"instead (it\u0027s already unquoted). This removes SCRIPT_NAME, but that"},{"line_number":11,"context_line":"is never set in Swift. Swift is always the root URL path."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partially fixes: #1670915"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: If1af43485b4708cab6c4b5d7f6f0a334d8752518"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7a25e98e_a00486c6","line":12,"updated":"2017-03-13 20:20:12.000000000","message":"Is Swift always in the root path, even when Swift proxy runs under Apache and mod_wsgi? I thought it supported it with the init_request_processor hook, which was specifically added.","commit_id":"310e5e8f537027c779039dcb2ef7f301b4408e09"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2e1b3fa260ed4359d4c3eb7ef4beecdc9758ba58","unresolved":false,"context_lines":[{"line_number":7,"context_line":"add name_check to /info"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Also removed a bunch of unnecessary unquotes. Just use path_info"},{"line_number":10,"context_line":"instead (it\u0027s already unquoted)."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partially fixes: #1670915"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1a1ced50_9244bd1b","line":10,"updated":"2017-03-21 10:55:18.000000000","message":"ok, wsgi unquotes: https://github.com/eventlet/eventlet/blob/master/eventlet/wsgi.py#L585","commit_id":"7a175439aad37fc55234cfd78d3e4727747c200c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f3ca249148b6a620ab22486e93924e9e2987985","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Also removed a bunch of unnecessary unquotes. Just use path_info"},{"line_number":10,"context_line":"instead (it\u0027s already unquoted)."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Partially fixes: #1670915"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: If1af43485b4708cab6c4b5d7f6f0a334d8752518"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1a1ced50_1822d5b9","line":12,"updated":"2017-03-20 15:48:41.000000000","message":"Partial-Fix gets the bug linked","commit_id":"7a175439aad37fc55234cfd78d3e4727747c200c"}],"api-ref/source/storage-object-services.inc":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f3ca249148b6a620ab22486e93924e9e2987985","unresolved":false,"context_lines":[{"line_number":168,"context_line":"Note that the provider may have limited the characters which are allowed"},{"line_number":169,"context_line":"in an object name. Any name limits are exposed under the ``name_check`` key"},{"line_number":170,"context_line":"in the ``/info`` discoverability response. Regardless of ``name_check``"},{"line_number":171,"context_line":"limitations, names must be URL quoted UTF-8."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"To create custom metadata, use the"},{"line_number":174,"context_line":"``X-Object-Meta-name`` header, where ``name`` is the name of the metadata"}],"source_content_type":"text/x-c++src","patch_set":5,"id":"1a1ced50_86f2f5d0","line":171,"updated":"2017-03-20 15:48:41.000000000","message":"A similar statement (at least the UTF8 requirement) should probably go here\n\nhttps://github.com/openstack/swift/blob/51727c531a865e3b5b1a316baf66a69dd9855df0/api-ref/source/parameters.yaml#L930-L935\n\nso that is appears in the \"definitive\" list of parameters below the example.","commit_id":"7a175439aad37fc55234cfd78d3e4727747c200c"}],"swift/common/middleware/name_check.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":41,"context_line":"\u0027\u0027\u0027"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"from six.moves.urllib.parse import unquote"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"import re"},{"line_number":46,"context_line":"from swift.common.utils import get_logger"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_d84db973","side":"PARENT","line":44,"updated":"2017-03-08 01:33:34.000000000","message":"so I agree PATH_INFO should be unquoted - but I\u0027m sure how you demonstrate that in a unittest\n\nIf we had some functional testing... or maybe spawned a wsgi.server inprocess we could prove it by...\n\n... configuring \"%\" as a invalid character and proving a client request to \u0027a%25b\u0027 fails but \u0027a%20b\u0027 works?","commit_id":"d621277feb235e8da2a1e155a21e80f5daf6d892"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d5c4b61b7c24335e745501b477d20943c887b28c","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def __init__(self, app, conf, forbidden_chars, maximum_length,"},{"line_number":57,"context_line":"                 forbidden_regexp):"},{"line_number":58,"context_line":"        self.app \u003d app"},{"line_number":59,"context_line":"        self.conf \u003d conf"},{"line_number":60,"context_line":"        self.forbidden_chars \u003d forbidden_chars"},{"line_number":61,"context_line":"        self.maximum_length \u003d maximum_length"},{"line_number":62,"context_line":"        self.forbidden_regexp \u003d forbidden_regexp"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_0f10ed00","line":59,"updated":"2017-03-07 23:56:09.000000000","message":"Do we still need self.conf? We use it to get self.logger, but we could just use conf there instead.","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def __init__(self, app, conf, forbidden_chars, maximum_length,"},{"line_number":57,"context_line":"                 forbidden_regexp):"},{"line_number":58,"context_line":"        self.app \u003d app"},{"line_number":59,"context_line":"        self.conf \u003d conf"},{"line_number":60,"context_line":"        self.forbidden_chars \u003d forbidden_chars"},{"line_number":61,"context_line":"        self.maximum_length \u003d maximum_length"},{"line_number":62,"context_line":"        self.forbidden_regexp \u003d forbidden_regexp"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_b88c8580","line":59,"in_reply_to":"9a30ddce_0f10ed00","updated":"2017-03-08 01:33:34.000000000","message":"I hate this pattern of parsing the config in the filter_factory and then passing in the named attributes - but we do it lots of places\n\nI think the container sync middleware proves that we can do this better:\n\nhttps://github.com/openstack/swift/blob/d621277feb235e8da2a1e155a21e80f5daf6d892/swift/common/middleware/container_sync.py#L52","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"fed0daf0f1be5f83d18968e63ce57700e3c91254","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    def __init__(self, app, conf, forbidden_chars, maximum_length,"},{"line_number":57,"context_line":"                 forbidden_regexp):"},{"line_number":58,"context_line":"        self.app \u003d app"},{"line_number":59,"context_line":"        self.conf \u003d conf"},{"line_number":60,"context_line":"        self.forbidden_chars \u003d forbidden_chars"},{"line_number":61,"context_line":"        self.maximum_length \u003d maximum_length"},{"line_number":62,"context_line":"        self.forbidden_regexp \u003d forbidden_regexp"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a25e98e_c90b757c","line":59,"in_reply_to":"9a30ddce_b88c8580","updated":"2017-03-13 18:35:48.000000000","message":"nice!","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                        forbidden_chars\u003dforbidden_chars,"},{"line_number":142,"context_line":"                        maximum_length\u003dmaximum_length,"},{"line_number":143,"context_line":"                        forbidden_regexp\u003dforbidden_regexp"},{"line_number":144,"context_line":"                        )"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def name_check_filter(app):"},{"line_number":147,"context_line":"        return NameCheckMiddleware(app, conf, forbidden_chars, maximum_length,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_d531040d","line":144,"updated":"2017-03-08 01:33:34.000000000","message":"I was thinking \"is there any context in which this information would be private?\" \n\nBut it seems like error responses already make it public - so this is better!","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2e1b3fa260ed4359d4c3eb7ef4beecdc9758ba58","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        return (match is not None)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def __call__(self, env, start_response):"},{"line_number":117,"context_line":"        req \u003d Request(env)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        if self.check_character(req):"},{"line_number":120,"context_line":"            return HTTPBadRequest("}],"source_content_type":"text/x-python","patch_set":5,"id":"1a1ced50_d21f1506","line":117,"updated":"2017-03-21 10:55:18.000000000","message":"the removal of the unquoting would have been a lot more obvious had this been Request.blank(env). Nothing in name_check itself unquotes PATH_INFO. As it is I tracked down PATH_INFO unquoting to eventlet wsgi:\n\nhttps://github.com/eventlet/eventlet/blob/master/eventlet/wsgi.py#L585","commit_id":"7a175439aad37fc55234cfd78d3e4727747c200c"}],"test/unit/common/middleware/test_name_check.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d5c4b61b7c24335e745501b477d20943c887b28c","unresolved":false,"context_lines":[{"line_number":21,"context_line":"@author: eamonn-otoole"},{"line_number":22,"context_line":"\u0027\u0027\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import numbers"},{"line_number":25,"context_line":"import unittest"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from swift.common.swob import Request, Response"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_2faf7195","line":24,"updated":"2017-03-07 23:56:09.000000000","message":"TIL","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            self.assertEqual("},{"line_number":62,"context_line":"                resp.body,"},{"line_number":63,"context_line":"                (\"Object/Container/Account name contains forbidden chars \""},{"line_number":64,"context_line":"                 \"from %s\" % self.conf[\u0027forbidden_chars\u0027]))"},{"line_number":65,"context_line":"            self.assertEqual(resp.status_int, 400)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def test_maximum_length_from_config(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_550d143d","line":64,"updated":"2017-03-08 01:33:34.000000000","message":"oic, we expose forbidden_chars at least in the response body!","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.assertEqual("},{"line_number":76,"context_line":"            resp.body,"},{"line_number":77,"context_line":"            (\"Object/Container/Account name longer than the allowed \""},{"line_number":78,"context_line":"             \"maximum 500\"))"},{"line_number":79,"context_line":"        self.assertEqual(resp.status_int, 400)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        # test valid length"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_7508582e","line":78,"updated":"2017-03-08 01:33:34.000000000","message":"and maximum length!","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                resp.body,"},{"line_number":107,"context_line":"                (\"Object/Container/Account name contains a forbidden \""},{"line_number":108,"context_line":"                 \"substring from regular expression %s\""},{"line_number":109,"context_line":"                 % self.conf[\u0027forbidden_regexp\u0027]))"},{"line_number":110,"context_line":"            self.assertEqual(resp.status_int, 400)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def test_valid_regexp(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_95078c1b","line":109,"updated":"2017-03-08 01:33:34.000000000","message":"and regex!","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"c191e1fdd5b775a55655b43ce9463a1f44032794","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.assertTrue(\u0027name_check\u0027 in swift_info)"},{"line_number":130,"context_line":"        self.assertTrue(isinstance("},{"line_number":131,"context_line":"            swift_info[\u0027name_check\u0027].get(\u0027maximum_length\u0027),"},{"line_number":132,"context_line":"            numbers.Integral))"},{"line_number":133,"context_line":"        self.assertTrue(isinstance("},{"line_number":134,"context_line":"            swift_info[\u0027name_check\u0027].get(\u0027forbidden_chars\u0027),"},{"line_number":135,"context_line":"            str))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a30ddce_15d2bcd2","line":132,"updated":"2017-03-08 01:33:34.000000000","message":"wild, same as tim TIL","commit_id":"d234dbc79ecd04559171645de0f75392e07724ab"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f3ca249148b6a620ab22486e93924e9e2987985","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            str))"},{"line_number":136,"context_line":"        self.assertTrue(isinstance("},{"line_number":137,"context_line":"            swift_info[\u0027name_check\u0027].get(\u0027forbidden_regexp\u0027),"},{"line_number":138,"context_line":"            str))"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a1ced50_03434a43","line":138,"updated":"2017-03-20 15:48:41.000000000","message":"maybe check the configured values are reported vs the defaults?","commit_id":"7a175439aad37fc55234cfd78d3e4727747c200c"}]}
