)]}'
{"doc/source/topics/settings.rst":[{"author":{"_account_id":23630,"name":"Tovin Seven","email":"tovin07@gmail.com","username":"tovin07"},"change_message_id":"0fcfd6bd0fc9bce151fd486f192362a7c1bfedf1","unresolved":false,"context_lines":[{"line_number":1817,"context_line":"  The fields specified in ``mask_fields`` are logged as ``********``."},{"line_number":1818,"context_line":"* ``target_methods`` is a request method which is logged to a operation log."},{"line_number":1819,"context_line":"  The valid methods are ``POST``, ``GET``, ``PUT``, ``DELETE``."},{"line_number":1820,"context_line":"* ``ignored_urls`` is a list of request URLs to be hidded from a log. "},{"line_number":1821,"context_line":"* ``format`` defines the operation log format."},{"line_number":1822,"context_line":"  Currently you can use the following keywords."},{"line_number":1823,"context_line":"  The default value contains all keywords."}],"source_content_type":"text/x-rst","patch_set":1,"id":"3f044301_7160b033","line":1820,"range":{"start_line":1820,"start_character":69,"end_line":1820,"end_character":70},"updated":"2017-05-04 09:04:20.000000000","message":"white space","commit_id":"61cc36a1290bdb9ce2a9a0da13f18bd4b351c3c9"}],"horizon/middleware/operation_log.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a7b0a0440a4132af31c68f3205f53cc2823045e0","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    return"},{"line_number":121,"context_line":"        for rule in self.ignored_urls:"},{"line_number":122,"context_line":"            if rule in request_url:"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"        return self.format"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _get_parameters_from_request(self, request, exception\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f044301_386d6498","line":123,"updated":"2017-05-04 13:00:00.000000000","message":"It looks like that ignored_urls and static_rule are used for the same purpose. It looks better to merge these two.\n\nIn addition, \u0027rule in request_url\u0027 looks too loose. How about changing it to a prefix match (.startswith() in python)?\n\nHopefully it is nice if we can specify conditions along with ignored_url.","commit_id":"a2e2d443e44ade6a0082002d48e3196d29e55043"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"d3a348ba095996c27c273ccb04d88eb4aed5f8fa","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    return"},{"line_number":121,"context_line":"        for rule in self.ignored_urls:"},{"line_number":122,"context_line":"            if rule in request_url:"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"        return self.format"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _get_parameters_from_request(self, request, exception\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f044301_aa390c42","line":123,"in_reply_to":"3f044301_09c25c34","updated":"2017-05-04 20:17:04.000000000","message":"+1 to Akihiro. Also, both of these checks are similar ant it would be better to move this code to some function to not duplicate","commit_id":"a2e2d443e44ade6a0082002d48e3196d29e55043"},{"author":{"_account_id":23757,"name":"Mateusz Kowalski","email":"mko@redhat.com","username":"makowals"},"change_message_id":"7e5354b0fb6fc4a00663c937a1335889773b87b9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    return"},{"line_number":121,"context_line":"        for rule in self.ignored_urls:"},{"line_number":122,"context_line":"            if rule in request_url:"},{"line_number":123,"context_line":"                return"},{"line_number":124,"context_line":"        return self.format"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    def _get_parameters_from_request(self, request, exception\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f044301_09c25c34","line":123,"in_reply_to":"3f044301_386d6498","updated":"2017-05-04 14:17:21.000000000","message":"All seems reasonable, just a question about the last one - how do you imagine having these? Something like [ ( \u0027/js/\u0027, [\u0027GET\u0027] ), ( \u0027/api/policy/\u0027, [\u0027POST\u0027] ) ] or did I understand it completely wrong?","commit_id":"a2e2d443e44ade6a0082002d48e3196d29e55043"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3b51ceecdde90e8e61fb2c2117a864dfd0cbcdac","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            \" [%(project_id)s] [%(user_name)s] [%(user_id)s]\""},{"line_number":66,"context_line":"            \" [%(request_scheme)s] [%(referer_url)s] [%(request_url)s]\""},{"line_number":67,"context_line":"            \" [%(message)s] [%(method)s] [%(http_status)s] [%(param)s]\")"},{"line_number":68,"context_line":"        _default_ignored_urls \u003d [\u0027/js/\u0027, \u0027/static/\u0027, \u0027/api/policy/\u0027]"},{"line_number":69,"context_line":"        self.target_methods \u003d [x for x in _methods if x in _available_methods]"},{"line_number":70,"context_line":"        self.mask_fields \u003d _log_option.get(\"mask_fields\", [\u0027password\u0027])"},{"line_number":71,"context_line":"        self.format \u003d _log_option.get(\"format\", _default_format)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_35076085","line":68,"range":{"start_line":68,"start_character":53,"end_line":68,"end_character":67},"updated":"2017-05-21 20:58:12.000000000","message":"I wonder other /api/xxxx are also used from angular panels. Are they needed too?","commit_id":"d47e7c57bb108722943356867a942762b2b0fcc5"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3b51ceecdde90e8e61fb2c2117a864dfd0cbcdac","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            return"},{"line_number":118,"context_line":"        request_url \u003d urlparse.unquote(request.path)"},{"line_number":119,"context_line":"        for rule in self.ignored_urls:"},{"line_number":120,"context_line":"            if rule in request_url:"},{"line_number":121,"context_line":"                return"},{"line_number":122,"context_line":"        return self.format"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_b5d130fe","line":120,"range":{"start_line":120,"start_character":12,"end_line":120,"end_character":35},"updated":"2017-05-21 20:58:12.000000000","message":"Isn\u0027t it better to use more strict match like regular expression?\n\nI think we can compile regular expression in __init__\n\n ignore_urls \u003d _log_option.get(\"ignore_urls\", _default_ignored_urls)\n self._ignore_urls \u003d [re.compile(url) for url in ignore_urls]\n\nand here\n\n if rule.search(request_url):\n\nBy doing so, we can use something like \u0027^/api/\u0027","commit_id":"d47e7c57bb108722943356867a942762b2b0fcc5"}]}
