)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7787969d2f678ab61e3928166f892a3022756c2f","unresolved":false,"context_lines":[{"line_number":7,"context_line":"wsgi: fix base_url finding"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The current wsgi.Application.base_url() function does not work correctly"},{"line_number":10,"context_line":"if Keystone runs on somethig like \"http://1.2.3.4/identity\" which is now"},{"line_number":11,"context_line":"a default in devstack."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patches fixes that by using wsgiref.util to parse environment"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a1a9d01_3bb66df9","line":10,"updated":"2015-09-30 14:56:28.000000000","message":"something*","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"a500f3e08a0feacd89597b3afa544ccb603647b6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"wsgi: fix base_url finding"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The current wsgi.Application.base_url() function does not work correctly"},{"line_number":10,"context_line":"if Keystone runs on somethig like \"http://1.2.3.4/identity\" which is now"},{"line_number":11,"context_line":"a default in devstack."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patches fixes that by using wsgiref.util to parse environment"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a1a9d01_0a99d47b","line":10,"in_reply_to":"9a1a9d01_3bb66df9","updated":"2015-09-30 15:22:14.000000000","message":"Done","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ff5aa8f5b2be7dedcf85bc1124a2c249f27b9354","unresolved":false,"context_lines":[{"line_number":18,"context_line":"have to drop the endpoints config options."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Related-Bug: #1381961"},{"line_number":21,"context_line":"Closes-Bug: #1495664"},{"line_number":22,"context_line":"Change-Id: I111c206a8a751ed117c6869f55f8236b29ab88a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1a26ad4f_060103af","line":21,"updated":"2015-11-02 17:53:41.000000000","message":"please remove this as the patch does not appear to fix 1495664","commit_id":"0c4b3ff645f82a99059a70c1052290bbc4f70a53"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d34aae132287b810e0b7ddb4d9b517afb7485b64","unresolved":false,"context_lines":[{"line_number":15,"context_line":"correct URL."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This also means there is no need to configure anything manually, so we"},{"line_number":18,"context_line":"have to drop the endpoints config options."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Related-Bug: #1381961"},{"line_number":21,"context_line":"Change-Id: I111c206a8a751ed117c6869f55f8236b29ab88a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da85f559_57b1568e","line":18,"updated":"2015-11-09 22:48:39.000000000","message":"I don\u0027t see where config options are removed in the code changes.\n\nAlso, it wouldn\u0027t be backwards compatible to remove the config options.","commit_id":"5b06d66885c3ddbc87567fd62d369d128949abed"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"5a792f07fd940b87a54c006ee80f684150c1fdc5","unresolved":false,"context_lines":[{"line_number":15,"context_line":"correct URL."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This also means there is no need to configure anything manually, so we"},{"line_number":18,"context_line":"have to drop the endpoints config options."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Related-Bug: #1381961"},{"line_number":21,"context_line":"Change-Id: I111c206a8a751ed117c6869f55f8236b29ab88a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"da85f559_c529ff38","line":18,"in_reply_to":"da85f559_57b1568e","updated":"2015-11-10 08:14:41.000000000","message":"Right, that was part of a previous version of the patch!","commit_id":"5b06d66885c3ddbc87567fd62d369d128949abed"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"932a8464a7b56b8cfefa4beac34409dcabb19cb3","unresolved":false,"context_lines":[{"line_number":10,"context_line":"if Keystone runs on something like \"http://1.2.3.4/identity\" which is now"},{"line_number":11,"context_line":"a default in devstack."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patches fixes that by using wsgiref.util to parse environment"},{"line_number":14,"context_line":"variable set in WSGI mode to find the real base url and returns the"},{"line_number":15,"context_line":"correct URL."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"da85f559_97f75558","line":13,"updated":"2015-11-16 21:06:35.000000000","message":"change \"patches\" to \"patch\"","commit_id":"b3ecac634b10958401c10f68c282c58b3822eb61"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"653f25efd395db7b20193b62ae7e56bf69f497e7","unresolved":false,"context_lines":[{"line_number":10,"context_line":"if Keystone runs on something like \"http://1.2.3.4/identity\" which is now"},{"line_number":11,"context_line":"a default in devstack."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patches fixes that by using wsgiref.util to parse environment"},{"line_number":14,"context_line":"variable set in WSGI mode to find the real base url and returns the"},{"line_number":15,"context_line":"correct URL."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"ba8a016a_05eb9db1","line":13,"in_reply_to":"da85f559_97f75558","updated":"2015-11-17 13:05:34.000000000","message":"Done","commit_id":"b3ecac634b10958401c10f68c282c58b3822eb61"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"09af2f376dfa0c3e55c16cca798194b1542409a9","unresolved":false,"context_lines":[{"line_number":10,"context_line":"if Keystone runs on something like \"http://1.2.3.4/identity\" which is now"},{"line_number":11,"context_line":"a default in devstack."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch fixes that by using wsgiref.util to parse environment"},{"line_number":14,"context_line":"variable set in WSGI mode to find the real base url and returns the"},{"line_number":15,"context_line":"correct URL."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"7a5de9d1_719fe3b4","line":13,"range":{"start_line":13,"start_character":47,"end_line":13,"end_character":64},"updated":"2016-02-02 21:05:57.000000000","message":"parse an environment\n\nThe commit message should say what the env var is so we\u0027re not left guessing.","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6663a6a6b752280434394906559dd6f13b39f07","unresolved":false,"context_lines":[{"line_number":10,"context_line":"if Keystone runs on something like \"http://1.2.3.4/identity\" which is now"},{"line_number":11,"context_line":"a default in devstack."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch fixes that by using wsgiref.util to parse environment"},{"line_number":14,"context_line":"variable set in WSGI mode to find the real base url and returns the"},{"line_number":15,"context_line":"correct URL."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"5a5ae5dd_4ed8221e","line":13,"range":{"start_line":13,"start_character":47,"end_line":13,"end_character":64},"in_reply_to":"7a5de9d1_719fe3b4","updated":"2016-02-03 03:57:15.000000000","message":"according to the code, it will use either HTTP_HOST or SERVER_NAME and SERVER_PORT. SCRIPT_NAME is added at the end","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"}],"keystone/assignment/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d34aae132287b810e0b7ddb4d9b517afb7485b64","unresolved":false,"context_lines":[{"line_number":531,"context_line":""},{"line_number":532,"context_line":"            if \u0027group_id\u0027 in entity.get(\u0027indirect\u0027, {}):"},{"line_number":533,"context_line":"                membership_url \u003d ("},{"line_number":534,"context_line":"                    self.base_url(context[\u0027environment\u0027],"},{"line_number":535,"context_line":"                                  \u0027/groups/%s/users/%s\u0027 % ("},{"line_number":536,"context_line":"                        entity[\u0027indirect\u0027][\u0027group_id\u0027], entity[\u0027user_id\u0027])))"},{"line_number":537,"context_line":"                formatted_entity[\u0027links\u0027][\u0027membership\u0027] \u003d membership_url"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_d4dc9c48","line":534,"updated":"2015-11-09 22:48:39.000000000","message":"these changes seem unnecessary -- self.base_url can continue to take a context and use the environment in it.","commit_id":"5b06d66885c3ddbc87567fd62d369d128949abed"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"5a792f07fd940b87a54c006ee80f684150c1fdc5","unresolved":false,"context_lines":[{"line_number":531,"context_line":""},{"line_number":532,"context_line":"            if \u0027group_id\u0027 in entity.get(\u0027indirect\u0027, {}):"},{"line_number":533,"context_line":"                membership_url \u003d ("},{"line_number":534,"context_line":"                    self.base_url(context[\u0027environment\u0027],"},{"line_number":535,"context_line":"                                  \u0027/groups/%s/users/%s\u0027 % ("},{"line_number":536,"context_line":"                        entity[\u0027indirect\u0027][\u0027group_id\u0027], entity[\u0027user_id\u0027])))"},{"line_number":537,"context_line":"                formatted_entity[\u0027links\u0027][\u0027membership\u0027] \u003d membership_url"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_459bcf72","line":534,"in_reply_to":"da85f559_d4dc9c48","updated":"2015-11-10 08:14:41.000000000","message":"It\u0027s not strictly necessary indeed, but it\u0027s good programming practice.","commit_id":"5b06d66885c3ddbc87567fd62d369d128949abed"}],"keystone/common/utils.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1d09c5e9d99e469cd7bb0ade92f0cd9fa5de5429","unresolved":false,"context_lines":[{"line_number":579,"context_line":"    return moves.urllib.parse.urlunparse(replaced)"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"def remove_standard_port(url):"},{"line_number":583,"context_line":"    # remove the default ports specified in RFC2616 and 2818"},{"line_number":584,"context_line":"    o \u003d moves.urllib.parse.urlparse(url)"},{"line_number":585,"context_line":"    separator \u003d \u0027:\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"dae33548_d27800c7","line":582,"updated":"2016-02-16 21:19:38.000000000","message":"There should be simple unit tests specifically for this function in keystone/tests/unit/common/test_utils.py","commit_id":"223e5818e7eda13fc3b18af666583eed8fe5582f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1d09c5e9d99e469cd7bb0ade92f0cd9fa5de5429","unresolved":false,"context_lines":[{"line_number":582,"context_line":"def remove_standard_port(url):"},{"line_number":583,"context_line":"    # remove the default ports specified in RFC2616 and 2818"},{"line_number":584,"context_line":"    o \u003d moves.urllib.parse.urlparse(url)"},{"line_number":585,"context_line":"    separator \u003d \u0027:\u0027"},{"line_number":586,"context_line":"    (host, separator, port) \u003d o.netloc.partition(\u0027:\u0027)"},{"line_number":587,"context_line":"    if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":588,"context_line":"        # NOTE(gyee): _replace() is not a private method. It has an"}],"source_content_type":"text/x-python","patch_set":23,"id":"dae33548_d2b12091","line":585,"updated":"2016-02-16 21:19:38.000000000","message":"remove this line.","commit_id":"223e5818e7eda13fc3b18af666583eed8fe5582f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1d09c5e9d99e469cd7bb0ade92f0cd9fa5de5429","unresolved":false,"context_lines":[{"line_number":590,"context_line":"        # See https://docs.python.org/2/library/collections.html#"},{"line_number":591,"context_line":"        # collections.namedtuple"},{"line_number":592,"context_line":"        o \u003d o._replace(netloc\u003dhost)"},{"line_number":593,"context_line":"    if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"},{"line_number":594,"context_line":"        o \u003d o._replace(netloc\u003dhost)"},{"line_number":595,"context_line":""},{"line_number":596,"context_line":"    return moves.urllib.parse.urlunparse(o)"}],"source_content_type":"text/x-python","patch_set":23,"id":"dae33548_32c04ce0","line":593,"updated":"2016-02-16 21:19:38.000000000","message":"this should be elif, no need to lowercase the schema again.","commit_id":"223e5818e7eda13fc3b18af666583eed8fe5582f"}],"keystone/common/wsgi.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"a596b3ab0f8288a24038ab046bfe3d97ce8a1c06","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    @staticmethod"},{"line_number":373,"context_line":"    def base_url(environment):"},{"line_number":374,"context_line":"        return wsgiref.util.application_uri(environment).rstrip(\u0027/\u0027)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class Middleware(Application):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_822c504b","line":374,"updated":"2015-09-22 18:54:06.000000000","message":"this may break existing deployments where Keystone is sitting behind an SSL proxy","commit_id":"d51ea2daa719fbd20839bd1dc6dde29482353616"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"901208eee4c3552e8456845f24b9b848c05bbe13","unresolved":false,"context_lines":[{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    @staticmethod"},{"line_number":373,"context_line":"    def base_url(environment):"},{"line_number":374,"context_line":"        return wsgiref.util.application_uri(environment).rstrip(\u0027/\u0027)"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":""},{"line_number":377,"context_line":"class Middleware(Application):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_a234f4fa","line":374,"in_reply_to":"ba15a1d1_822c504b","updated":"2015-09-22 19:06:06.000000000","message":"It would be cool to not score patches if you are not sure then. :)","commit_id":"d51ea2daa719fbd20839bd1dc6dde29482353616"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7787969d2f678ab61e3928166f892a3022756c2f","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        token_ref \u003d utils.get_token_ref(context)"},{"line_number":370,"context_line":"        return token_ref.trust_id"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    @staticmethod"},{"line_number":373,"context_line":"    def base_url(environment, endpoint_type):"},{"line_number":374,"context_line":"        url \u003d CONF[\u0027%s_endpoint\u0027 % endpoint_type]"},{"line_number":375,"context_line":"        if url:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_5b07a181","line":372,"updated":"2015-09-30 14:56:28.000000000","message":"just curious; but why change this?","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"a500f3e08a0feacd89597b3afa544ccb603647b6","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        token_ref \u003d utils.get_token_ref(context)"},{"line_number":370,"context_line":"        return token_ref.trust_id"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    @staticmethod"},{"line_number":373,"context_line":"    def base_url(environment, endpoint_type):"},{"line_number":374,"context_line":"        url \u003d CONF[\u0027%s_endpoint\u0027 % endpoint_type]"},{"line_number":375,"context_line":"        if url:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_8a8ba41e","line":372,"in_reply_to":"9a1a9d01_5b07a181","updated":"2015-09-30 15:22:14.000000000","message":"There\u0027s no reason to not have it static since it does not depend on the object itself, it never uses \u0027self\u0027.","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"932a8464a7b56b8cfefa4beac34409dcabb19cb3","unresolved":false,"context_lines":[{"line_number":776,"context_line":"    if isinstance(error, exception.AuthPluginException):"},{"line_number":777,"context_line":"        body[\u0027error\u0027][\u0027identity\u0027] \u003d error.authentication"},{"line_number":778,"context_line":"    elif isinstance(error, exception.Unauthorized):"},{"line_number":779,"context_line":"        if request:"},{"line_number":780,"context_line":"            url \u003d Application.base_url(request.environ, \u0027public\u0027)"},{"line_number":781,"context_line":"        else:"},{"line_number":782,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_bbc8d775","line":779,"updated":"2015-11-16 21:06:35.000000000","message":"If the deployer sets public_endpoint then that needs to take precendence over anything the environment or request is providing. That\u0027s the point of the public_endpoint option.","commit_id":"b3ecac634b10958401c10f68c282c58b3822eb61"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"653f25efd395db7b20193b62ae7e56bf69f497e7","unresolved":false,"context_lines":[{"line_number":776,"context_line":"    if isinstance(error, exception.AuthPluginException):"},{"line_number":777,"context_line":"        body[\u0027error\u0027][\u0027identity\u0027] \u003d error.authentication"},{"line_number":778,"context_line":"    elif isinstance(error, exception.Unauthorized):"},{"line_number":779,"context_line":"        if request:"},{"line_number":780,"context_line":"            url \u003d Application.base_url(request.environ, \u0027public\u0027)"},{"line_number":781,"context_line":"        else:"},{"line_number":782,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_a54091a6","line":779,"in_reply_to":"ba8a016a_bbc8d775","updated":"2015-11-17 13:05:34.000000000","message":"Yeah this is what base_url() is doing.","commit_id":"b3ecac634b10958401c10f68c282c58b3822eb61"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c5d5690424242aa53d0dab6a2b4f1d3b24b9fbed","unresolved":false,"context_lines":[{"line_number":374,"context_line":"            substitutions \u003d dict("},{"line_number":375,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":376,"context_line":"            url \u003d url % substitutions"},{"line_number":377,"context_line":"            url +\u003d environment[\u0027SCRIPT_NAME\u0027]"},{"line_number":378,"context_line":"        else:"},{"line_number":379,"context_line":"            url \u003d wsgiref.util.application_uri(environment)"},{"line_number":380,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_4ed423bc","line":377,"range":{"start_line":377,"start_character":43,"end_line":377,"end_character":45},"updated":"2016-01-04 23:56:13.000000000","message":"If we back out this line the patch is working as designed. If deployments intentionally set ADMIN_ENDPOINT and PUBLIC_ENDPOINT in keystone.conf, we leave them alone because we can\u0027t assume what they are. If they are not set, then we can use whatever request URL that is passed down from the environment. If we want to take it a step further, we can submit another patch to deprecate ADMIN_ENDPOINT and PUBLIC_ENDPOINT.","commit_id":"06d55bf4086f0ea2287ec462c5e86e645b4b7cba"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c33ad282d112f2f1cf9d0d72d1e2bd1df038839b","unresolved":false,"context_lines":[{"line_number":23,"context_line":"try:"},{"line_number":24,"context_line":"    import urlparse"},{"line_number":25,"context_line":"except ImportError:"},{"line_number":26,"context_line":"    import urllib.parse as urlparse"},{"line_number":27,"context_line":"import wsgiref.util"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba63e191_0899751f","line":26,"updated":"2016-01-19 21:46:04.000000000","message":"Use six.moves for that.","commit_id":"88f2f5746758dccc3106642b86434663e412675a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9b99970f7d306c82305b52c0b4b8f1010b84ba4d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"try:"},{"line_number":24,"context_line":"    import urlparse"},{"line_number":25,"context_line":"except ImportError:"},{"line_number":26,"context_line":"    import urllib.parse as urlparse"},{"line_number":27,"context_line":"import wsgiref.util"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_66ce0a5c","line":26,"in_reply_to":"ba63e191_0899751f","updated":"2016-01-28 21:36:45.000000000","message":"Done","commit_id":"88f2f5746758dccc3106642b86434663e412675a"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"c33ad282d112f2f1cf9d0d72d1e2bd1df038839b","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                url \u003d url[:-3]"},{"line_number":388,"context_line":"            elif url.endswith(\u0027/v2.0\u0027):"},{"line_number":389,"context_line":"                url \u003d url[:-4]"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        # now remove the default ports specified in RFC2616 and 2818"},{"line_number":392,"context_line":"        o \u003d urlparse.urlparse(url)"},{"line_number":393,"context_line":"        netloc \u003d o.netloc"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba63e191_68b1118f","line":390,"updated":"2016-01-19 21:46:04.000000000","message":"O_O","commit_id":"88f2f5746758dccc3106642b86434663e412675a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9b99970f7d306c82305b52c0b4b8f1010b84ba4d","unresolved":false,"context_lines":[{"line_number":387,"context_line":"                url \u003d url[:-3]"},{"line_number":388,"context_line":"            elif url.endswith(\u0027/v2.0\u0027):"},{"line_number":389,"context_line":"                url \u003d url[:-4]"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"        # now remove the default ports specified in RFC2616 and 2818"},{"line_number":392,"context_line":"        o \u003d urlparse.urlparse(url)"},{"line_number":393,"context_line":"        netloc \u003d o.netloc"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_a602c26d","line":390,"in_reply_to":"ba63e191_68b1118f","updated":"2016-01-28 21:36:45.000000000","message":"^-^","commit_id":"88f2f5746758dccc3106642b86434663e412675a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"09af2f376dfa0c3e55c16cca798194b1542409a9","unresolved":false,"context_lines":[{"line_number":371,"context_line":"    @classmethod"},{"line_number":372,"context_line":"    def base_url(cls, context, endpoint_type):"},{"line_number":373,"context_line":"        url \u003d CONF[\u0027%s_endpoint\u0027 % endpoint_type]"},{"line_number":374,"context_line":"        if url:"},{"line_number":375,"context_line":"            substitutions \u003d dict("},{"line_number":376,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":377,"context_line":"            url \u003d url % substitutions"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_51e8a716","line":374,"updated":"2016-02-02 21:05:57.000000000","message":"revert the unrelated whitespace change on the previous line.","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6663a6a6b752280434394906559dd6f13b39f07","unresolved":false,"context_lines":[{"line_number":371,"context_line":"    @classmethod"},{"line_number":372,"context_line":"    def base_url(cls, context, endpoint_type):"},{"line_number":373,"context_line":"        url \u003d CONF[\u0027%s_endpoint\u0027 % endpoint_type]"},{"line_number":374,"context_line":"        if url:"},{"line_number":375,"context_line":"            substitutions \u003d dict("},{"line_number":376,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":377,"context_line":"            url \u003d url % substitutions"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_ee030e75","line":374,"in_reply_to":"7a5de9d1_51e8a716","updated":"2016-02-03 03:57:15.000000000","message":"Done","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"09af2f376dfa0c3e55c16cca798194b1542409a9","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        if url:"},{"line_number":375,"context_line":"            substitutions \u003d dict("},{"line_number":376,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":377,"context_line":"            url \u003d url % substitutions"},{"line_number":378,"context_line":"        else:"},{"line_number":379,"context_line":"            url \u003d wsgiref.util.application_uri(context[\u0027environment\u0027])"},{"line_number":380,"context_line":"            # remove version from the URL as it may be part of SCRIPT_NAME but"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_71eda324","line":377,"updated":"2016-02-02 21:05:57.000000000","message":"revert the unrelated whitespace change on the previous line.","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6663a6a6b752280434394906559dd6f13b39f07","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        if url:"},{"line_number":375,"context_line":"            substitutions \u003d dict("},{"line_number":376,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":377,"context_line":"            url \u003d url % substitutions"},{"line_number":378,"context_line":"        else:"},{"line_number":379,"context_line":"            url \u003d wsgiref.util.application_uri(context[\u0027environment\u0027])"},{"line_number":380,"context_line":"            # remove version from the URL as it may be part of SCRIPT_NAME but"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_aefd1670","line":377,"in_reply_to":"7a5de9d1_71eda324","updated":"2016-02-03 03:57:15.000000000","message":"Done","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"09af2f376dfa0c3e55c16cca798194b1542409a9","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            # remove version from the URL as it may be part of SCRIPT_NAME but"},{"line_number":381,"context_line":"            # it should not be part of base URL"},{"line_number":382,"context_line":"            url \u003d url.rstrip(\u0027/\u0027)"},{"line_number":383,"context_line":"            if url.endswith(\u0027/v3\u0027):"},{"line_number":384,"context_line":"                url \u003d url[:-3]"},{"line_number":385,"context_line":"            elif url.endswith(\u0027/v2.0\u0027):"},{"line_number":386,"context_line":"                url \u003d url[:-4]"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"        o \u003d urlparse.urlparse(url)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_91029fb3","line":386,"range":{"start_line":383,"start_character":0,"end_line":386,"end_character":30},"updated":"2016-02-02 21:05:57.000000000","message":"suggest do\n\n re.sub(r\u0027/v(3|(2\\.0))$\u0027, \u0027\u0027, url)","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6663a6a6b752280434394906559dd6f13b39f07","unresolved":false,"context_lines":[{"line_number":380,"context_line":"            # remove version from the URL as it may be part of SCRIPT_NAME but"},{"line_number":381,"context_line":"            # it should not be part of base URL"},{"line_number":382,"context_line":"            url \u003d url.rstrip(\u0027/\u0027)"},{"line_number":383,"context_line":"            if url.endswith(\u0027/v3\u0027):"},{"line_number":384,"context_line":"                url \u003d url[:-3]"},{"line_number":385,"context_line":"            elif url.endswith(\u0027/v2.0\u0027):"},{"line_number":386,"context_line":"                url \u003d url[:-4]"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"        o \u003d urlparse.urlparse(url)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_6ef87e7d","line":386,"range":{"start_line":383,"start_character":0,"end_line":386,"end_character":30},"in_reply_to":"7a5de9d1_91029fb3","updated":"2016-02-03 03:57:15.000000000","message":"Done","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"09af2f376dfa0c3e55c16cca798194b1542409a9","unresolved":false,"context_lines":[{"line_number":386,"context_line":"                url \u003d url[:-4]"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"        o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"        netloc \u003d o.netloc"},{"line_number":391,"context_line":"        if \u0027:\u0027 in o.netloc:"},{"line_number":392,"context_line":"            host, port \u003d netloc.split(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_31b88be5","line":389,"updated":"2016-02-02 21:05:57.000000000","message":"this needs to be indented. if the user specifies public_endpoint or admin_endpoint, that\u0027s the value that needs to be used, and it shouldn\u0027t be modified in any way.","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d6663a6a6b752280434394906559dd6f13b39f07","unresolved":false,"context_lines":[{"line_number":386,"context_line":"                url \u003d url[:-4]"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"        o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"        netloc \u003d o.netloc"},{"line_number":391,"context_line":"        if \u0027:\u0027 in o.netloc:"},{"line_number":392,"context_line":"            host, port \u003d netloc.split(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5a5ae5dd_8e3cda30","line":389,"in_reply_to":"7a5de9d1_31b88be5","updated":"2016-02-03 03:57:15.000000000","message":"not sure why you want to keep the default ports as all of the normalization schemes remove them. But sure, I can make this indented.","commit_id":"b4ec0b7f1171520017b6c1ed823012b98b30be5e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4ae8a7550bcf4b7cc54a835441e00466bce38ba8","unresolved":false,"context_lines":[{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"            netloc \u003d o.netloc"},{"line_number":391,"context_line":"            if \u0027:\u0027 in o.netloc:"},{"line_number":392,"context_line":"                host, port \u003d netloc.split(\u0027:\u0027, 1)"},{"line_number":393,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":394,"context_line":"                    netloc \u003d host"},{"line_number":395,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_a08f3522","line":392,"updated":"2016-02-03 21:20:14.000000000","message":"suggest use partition.","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"0413ad16c62826f9e1e411e5718aa8f1469778b9","unresolved":false,"context_lines":[{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"            netloc \u003d o.netloc"},{"line_number":391,"context_line":"            if \u0027:\u0027 in o.netloc:"},{"line_number":392,"context_line":"                host, port \u003d netloc.split(\u0027:\u0027, 1)"},{"line_number":393,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":394,"context_line":"                    netloc \u003d host"},{"line_number":395,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_af4cf042","line":392,"in_reply_to":"5a5ae5dd_a08f3522","updated":"2016-02-04 19:52:09.000000000","message":"Done","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4ae8a7550bcf4b7cc54a835441e00466bce38ba8","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":394,"context_line":"                    netloc \u003d host"},{"line_number":395,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"},{"line_number":396,"context_line":"                    netloc \u003d host"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"            url \u003d urlparse.urlunparse("},{"line_number":399,"context_line":"                (o.scheme, netloc, o.path, o.params, o.query, o.fragment))"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_c0f35172","line":396,"updated":"2016-02-03 21:20:14.000000000","message":"coverage report shows this isn\u0027t tested.","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"0413ad16c62826f9e1e411e5718aa8f1469778b9","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":394,"context_line":"                    netloc \u003d host"},{"line_number":395,"context_line":"                if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"},{"line_number":396,"context_line":"                    netloc \u003d host"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"            url \u003d urlparse.urlunparse("},{"line_number":399,"context_line":"                (o.scheme, netloc, o.path, o.params, o.query, o.fragment))"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_cf47ec1b","line":396,"in_reply_to":"5a5ae5dd_c0f35172","updated":"2016-02-04 19:52:09.000000000","message":"will add test","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4ae8a7550bcf4b7cc54a835441e00466bce38ba8","unresolved":false,"context_lines":[{"line_number":826,"context_line":"    if isinstance(error, exception.AuthPluginException):"},{"line_number":827,"context_line":"        body[\u0027error\u0027][\u0027identity\u0027] \u003d error.authentication"},{"line_number":828,"context_line":"    elif isinstance(error, exception.Unauthorized):"},{"line_number":829,"context_line":"        if request:"},{"line_number":830,"context_line":"            if not context:"},{"line_number":831,"context_line":"                context \u003d {}"},{"line_number":832,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_a09bb5c8","line":829,"updated":"2016-02-03 21:20:14.000000000","message":"The original code used CONF.public_endpoint if it was set by the deployer -- the server should continue to use CONF.public_endpoint if it was set and only use the new code if that\u0027s not set, otherwise this change isn\u0027t backwards-compatible.","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1b8d16bc9d7de270a0b93dbf43173fb57e2a2059","unresolved":false,"context_lines":[{"line_number":823,"context_line":"        else:"},{"line_number":824,"context_line":"            substitutions \u003d dict("},{"line_number":825,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":826,"context_line":"            url \u003d url % substitutions"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        headers.append((\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\"%s\"\u0027 % url))"},{"line_number":829,"context_line":"    return render_response(status\u003d(error.code, error.title),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a5ae5dd_989109f4","side":"PARENT","line":826,"updated":"2016-02-05 02:00:43.000000000","message":"I don\u0027t think Brant\u0027s comment from patch set 18 about backwards compat was addressed here.","commit_id":"399a66f141e2bd7b96f34dc10ecef45bcbbbbf8a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"64b96c52212f2a13ff53465db6d5e05119e3c5ba","unresolved":false,"context_lines":[{"line_number":823,"context_line":"        else:"},{"line_number":824,"context_line":"            substitutions \u003d dict("},{"line_number":825,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":826,"context_line":"            url \u003d url % substitutions"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        headers.append((\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\"%s\"\u0027 % url))"},{"line_number":829,"context_line":"    return render_response(status\u003d(error.code, error.title),"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a57f1b5_21585956","side":"PARENT","line":826,"in_reply_to":"3a57f1b5_ae82f8c6","updated":"2016-02-09 20:53:25.000000000","message":"Yes it does. See line #832 on the right, which passed in \u0027public\u0027 as endpoint_type. Application.base_url() will make use of it. See line #374. It will look to use CONF[\u0027public_endpoint\u0027] first, if configured. Otherwise, it will derive the base url from the request environment.","commit_id":"399a66f141e2bd7b96f34dc10ecef45bcbbbbf8a"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b6d0a5bf452f8880580dfe257fe277c97d84336a","unresolved":false,"context_lines":[{"line_number":823,"context_line":"        else:"},{"line_number":824,"context_line":"            substitutions \u003d dict("},{"line_number":825,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":826,"context_line":"            url \u003d url % substitutions"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        headers.append((\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\"%s\"\u0027 % url))"},{"line_number":829,"context_line":"    return render_response(status\u003d(error.code, error.title),"}],"source_content_type":"text/x-python","patch_set":19,"id":"5a5ae5dd_ded3e902","side":"PARENT","line":826,"in_reply_to":"5a5ae5dd_989109f4","updated":"2016-02-05 03:02:45.000000000","message":"How so? The endpoints are being used in Application.base_url() if they are configured in Keystone. This patch just simplify the code. This only case this will not work is both \u0027request\u0027 and \u0027context\u0027 are None, which is impossible.","commit_id":"399a66f141e2bd7b96f34dc10ecef45bcbbbbf8a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"246e9c7b2cf0f748b4c9453ea7828656c63da9a1","unresolved":false,"context_lines":[{"line_number":823,"context_line":"        else:"},{"line_number":824,"context_line":"            substitutions \u003d dict("},{"line_number":825,"context_line":"                itertools.chain(CONF.items(), CONF.eventlet_server.items()))"},{"line_number":826,"context_line":"            url \u003d url % substitutions"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"        headers.append((\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\"%s\"\u0027 % url))"},{"line_number":829,"context_line":"    return render_response(status\u003d(error.code, error.title),"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a57f1b5_ae82f8c6","side":"PARENT","line":826,"in_reply_to":"5a5ae5dd_ded3e902","updated":"2016-02-09 20:22:24.000000000","message":"I think Brant was saying that this no longer uses CONF.public_endpoint.","commit_id":"399a66f141e2bd7b96f34dc10ecef45bcbbbbf8a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"246e9c7b2cf0f748b4c9453ea7828656c63da9a1","unresolved":false,"context_lines":[{"line_number":828,"context_line":"            if not context:"},{"line_number":829,"context_line":"                context \u003d {}"},{"line_number":830,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":831,"context_line":"        if context and \u0027environment\u0027 in context:"},{"line_number":832,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":833,"context_line":"        else:"},{"line_number":834,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a57f1b5_8e513c65","line":831,"updated":"2016-02-09 20:22:24.000000000","message":"Can\u0027t this be simplified to:\n\n    if \u0027environment\u0027 in context: \n\n?","commit_id":"5aaeeb523399219fbac5dd80a79d7a2e506623a4"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"64b96c52212f2a13ff53465db6d5e05119e3c5ba","unresolved":false,"context_lines":[{"line_number":828,"context_line":"            if not context:"},{"line_number":829,"context_line":"                context \u003d {}"},{"line_number":830,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":831,"context_line":"        if context and \u0027environment\u0027 in context:"},{"line_number":832,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":833,"context_line":"        else:"},{"line_number":834,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"}],"source_content_type":"text/x-python","patch_set":19,"id":"3a57f1b5_01367d03","line":831,"in_reply_to":"3a57f1b5_8e513c65","updated":"2016-02-09 20:53:25.000000000","message":"good suggestion","commit_id":"5aaeeb523399219fbac5dd80a79d7a2e506623a4"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6022d795be71ec5bf2d4004e09a3cc905c16ebbf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import copy"},{"line_number":22,"context_line":"import itertools"},{"line_number":23,"context_line":"import re"},{"line_number":24,"context_line":"from six.moves.urllib import parse as urlparse"},{"line_number":25,"context_line":"import wsgiref.util"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":20,"id":"dae33548_03055cc1","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":46},"updated":"2016-02-15 06:15:16.000000000","message":"this should be with the other 3rd party imports","commit_id":"8a82a7d5eaeb06e265c0f0646bde3c9e1212e1b0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"40bc8fa031f7fa0e882e7665830613d5263c7615","unresolved":false,"context_lines":[{"line_number":21,"context_line":"import copy"},{"line_number":22,"context_line":"import itertools"},{"line_number":23,"context_line":"import re"},{"line_number":24,"context_line":"from six.moves.urllib import parse as urlparse"},{"line_number":25,"context_line":"import wsgiref.util"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":20,"id":"dae33548_084ee76e","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":46},"in_reply_to":"dae33548_03055cc1","updated":"2016-02-16 04:49:55.000000000","message":"Done","commit_id":"8a82a7d5eaeb06e265c0f0646bde3c9e1212e1b0"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6022d795be71ec5bf2d4004e09a3cc905c16ebbf","unresolved":false,"context_lines":[{"line_number":827,"context_line":"        context \u003d context if context else {}"},{"line_number":828,"context_line":"        if request:"},{"line_number":829,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"},{"line_number":833,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"}],"source_content_type":"text/x-python","patch_set":20,"id":"dae33548_e3a5d8b5","line":830,"range":{"start_line":830,"start_character":8,"end_line":830,"end_character":36},"updated":"2016-02-15 06:15:16.000000000","message":"won\u0027t this always be true, cause of line 829?","commit_id":"8a82a7d5eaeb06e265c0f0646bde3c9e1212e1b0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"40bc8fa031f7fa0e882e7665830613d5263c7615","unresolved":false,"context_lines":[{"line_number":827,"context_line":"        context \u003d context if context else {}"},{"line_number":828,"context_line":"        if request:"},{"line_number":829,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"},{"line_number":833,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"}],"source_content_type":"text/x-python","patch_set":20,"id":"dae33548_285beb2f","line":830,"range":{"start_line":830,"start_character":8,"end_line":830,"end_character":36},"in_reply_to":"dae33548_e3a5d8b5","updated":"2016-02-16 04:49:55.000000000","message":"on if \u0027request\u0027 is available, which is not true all the time","commit_id":"8a82a7d5eaeb06e265c0f0646bde3c9e1212e1b0"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6022d795be71ec5bf2d4004e09a3cc905c16ebbf","unresolved":false,"context_lines":[{"line_number":828,"context_line":"        if request:"},{"line_number":829,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"},{"line_number":833,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"},{"line_number":834,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"dae33548_63926859","line":831,"range":{"start_line":831,"start_character":48,"end_line":831,"end_character":56},"updated":"2016-02-15 06:15:16.000000000","message":"took me way too long to figure out that we\u0027re doing the substitutions in base_url still, and handling the else block there.","commit_id":"8a82a7d5eaeb06e265c0f0646bde3c9e1212e1b0"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"40bc8fa031f7fa0e882e7665830613d5263c7615","unresolved":false,"context_lines":[{"line_number":828,"context_line":"        if request:"},{"line_number":829,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"},{"line_number":833,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"},{"line_number":834,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"dae33548_683df3ba","line":831,"range":{"start_line":831,"start_character":48,"end_line":831,"end_character":56},"in_reply_to":"dae33548_63926859","updated":"2016-02-16 04:49:55.000000000","message":"yeah, we simply the code so that we don\u0027t have to maintain multiple code paths for the the same thing","commit_id":"8a82a7d5eaeb06e265c0f0646bde3c9e1212e1b0"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            # remove version from the URL as it may be part of SCRIPT_NAME but"},{"line_number":384,"context_line":"            # it should not be part of base URL"},{"line_number":385,"context_line":"            url \u003d url.rstrip(\u0027/\u0027)"},{"line_number":386,"context_line":"            url \u003d re.sub(r\u0027/v(3|(2\\.0))$\u0027, \u0027\u0027, url)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_e4a0f045","line":386,"updated":"2016-02-16 16:21:23.000000000","message":"you could include the rstrip into this regex -- /*$","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            # remove version from the URL as it may be part of SCRIPT_NAME but"},{"line_number":384,"context_line":"            # it should not be part of base URL"},{"line_number":385,"context_line":"            url \u003d url.rstrip(\u0027/\u0027)"},{"line_number":386,"context_line":"            url \u003d re.sub(r\u0027/v(3|(2\\.0))$\u0027, \u0027\u0027, url)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_123c31c7","line":386,"in_reply_to":"dae33548_e4a0f045","updated":"2016-02-16 19:36:09.000000000","message":"Done","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            url \u003d url.rstrip(\u0027/\u0027)"},{"line_number":386,"context_line":"            url \u003d re.sub(r\u0027/v(3|(2\\.0))$\u0027, \u0027\u0027, url)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"            separator \u003d \u0027:\u0027"},{"line_number":391,"context_line":"            (host, separator, port) \u003d o.netloc.partition(separator)"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_e43c70e4","line":388,"updated":"2016-02-16 16:21:23.000000000","message":"this just seems like a lot of work for almost no gain. This should be handled by wsgiref.util.application_uri and not by all applications.\n\nAlso, this should be pulled out into a function so that it\u0027s easier to test.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            url \u003d url.rstrip(\u0027/\u0027)"},{"line_number":386,"context_line":"            url \u003d re.sub(r\u0027/v(3|(2\\.0))$\u0027, \u0027\u0027, url)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"            # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"            separator \u003d \u0027:\u0027"},{"line_number":391,"context_line":"            (host, separator, port) \u003d o.netloc.partition(separator)"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_7262ddae","line":388,"in_reply_to":"dae33548_e43c70e4","updated":"2016-02-16 19:36:09.000000000","message":"I agree but wsgiref is not handling it right now. All the specs (OAUTH, EC2, S3, etc) which include url in the signature required standard ports to be stripped out. Till wsgiref fixed it, we need to do the normalization ourselves.\n\nI\u0027ll pull this out into a separate utility function.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":388,"context_line":"            # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"            separator \u003d \u0027:\u0027"},{"line_number":391,"context_line":"            (host, separator, port) \u003d o.netloc.partition(separator)"},{"line_number":392,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":393,"context_line":"                o \u003d o._replace(netloc\u003dhost)"},{"line_number":394,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_efa6090f","line":391,"updated":"2016-02-16 16:21:23.000000000","message":"assigning a value to separator on the previous line and then resetting it here is confusing. suggest just pass \u0027:\u0027 to partition.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":388,"context_line":"            # now remove the default ports specified in RFC2616 and 2818"},{"line_number":389,"context_line":"            o \u003d urlparse.urlparse(url)"},{"line_number":390,"context_line":"            separator \u003d \u0027:\u0027"},{"line_number":391,"context_line":"            (host, separator, port) \u003d o.netloc.partition(separator)"},{"line_number":392,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":393,"context_line":"                o \u003d o._replace(netloc\u003dhost)"},{"line_number":394,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_72093ddd","line":391,"in_reply_to":"dae33548_efa6090f","updated":"2016-02-16 19:36:09.000000000","message":"Done","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            separator \u003d \u0027:\u0027"},{"line_number":391,"context_line":"            (host, separator, port) \u003d o.netloc.partition(separator)"},{"line_number":392,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":393,"context_line":"                o \u003d o._replace(netloc\u003dhost)"},{"line_number":394,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"},{"line_number":395,"context_line":"                o \u003d o._replace(netloc\u003dhost)"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_eff449f3","line":393,"updated":"2016-02-16 16:21:23.000000000","message":"_ indicates this is not a public function so we can\u0027t use it in keystone.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            separator \u003d \u0027:\u0027"},{"line_number":391,"context_line":"            (host, separator, port) \u003d o.netloc.partition(separator)"},{"line_number":392,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027http\u0027 and port \u003d\u003d \u002780\u0027:"},{"line_number":393,"context_line":"                o \u003d o._replace(netloc\u003dhost)"},{"line_number":394,"context_line":"            if o.scheme.lower() \u003d\u003d \u0027https\u0027 and port \u003d\u003d \u0027443\u0027:"},{"line_number":395,"context_line":"                o \u003d o._replace(netloc\u003dhost)"},{"line_number":396,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_524b59c9","line":393,"in_reply_to":"dae33548_eff449f3","updated":"2016-02-16 19:36:09.000000000","message":"Per my understanding, _replace() is not actually an internal function. It has an underscore to prevent name collision. See\n\nhttps://docs.python.org/2/library/collections.html#collections.namedtuple","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":826,"context_line":"    elif isinstance(error, exception.Unauthorized):"},{"line_number":827,"context_line":"        context \u003d context if context else {}"},{"line_number":828,"context_line":"        if request:"},{"line_number":829,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_0fe40d0b","line":829,"updated":"2016-02-16 16:21:23.000000000","message":"if context was passed in then this will mutate it, which can make things confusing for functions that don\u0027t expect the context to be modified. Make a copy of the context if it was passed in before modifying it.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":826,"context_line":"    elif isinstance(error, exception.Unauthorized):"},{"line_number":827,"context_line":"        context \u003d context if context else {}"},{"line_number":828,"context_line":"        if request:"},{"line_number":829,"context_line":"            context.setdefault(\u0027environment\u0027, request.environ)"},{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_52acf933","line":829,"in_reply_to":"dae33548_0fe40d0b","updated":"2016-02-16 19:36:09.000000000","message":"Done","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"},{"line_number":833,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"},{"line_number":834,"context_line":""},{"line_number":835,"context_line":"        headers.append((\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\"%s\"\u0027 % url))"},{"line_number":836,"context_line":"    return render_response(status\u003d(error.code, error.title),"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_afdec10e","line":833,"updated":"2016-02-16 16:21:23.000000000","message":"Application.base_url should handle this situation for us, too. Change Application.base_url to work when \u0027environment\u0027 not in context. Then this code can be simpler and also work correctly.\n\nThis should have been using public_endpoint and not localhost:\u003cpublic_port\u003e if public_endpoint is set.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":830,"context_line":"        if \u0027environment\u0027 in context:"},{"line_number":831,"context_line":"            url \u003d Application.base_url(context, \u0027public\u0027)"},{"line_number":832,"context_line":"        else:"},{"line_number":833,"context_line":"            url \u003d \u0027http://localhost:%d\u0027 % CONF.eventlet_server.public_port"},{"line_number":834,"context_line":""},{"line_number":835,"context_line":"        headers.append((\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\"%s\"\u0027 % url))"},{"line_number":836,"context_line":"    return render_response(status\u003d(error.code, error.title),"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_0db25094","line":833,"in_reply_to":"dae33548_afdec10e","updated":"2016-02-16 19:36:09.000000000","message":"good point! I\u0027ll consolidate.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1d09c5e9d99e469cd7bb0ade92f0cd9fa5de5429","unresolved":false,"context_lines":[{"line_number":826,"context_line":"        if request:"},{"line_number":827,"context_line":"            local_context \u003d {\u0027environment\u0027: request.environ}"},{"line_number":828,"context_line":"        elif context and \u0027environment\u0027 in context:"},{"line_number":829,"context_line":"            local_context \u003d {\u0027environment\u0027: context[\u0027environment\u0027]}"},{"line_number":830,"context_line":"        url \u003d Application.base_url(local_context, \u0027public\u0027)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"        headers.append((\u0027WWW-Authenticate\u0027, \u0027Keystone uri\u003d\"%s\"\u0027 % url))"}],"source_content_type":"text/x-python","patch_set":23,"id":"dae33548_7d390541","line":829,"updated":"2016-02-16 21:19:38.000000000","message":"you could avoid some duplication here by doing\n\n env \u003d None\n if request:\n   env \u003d request.environ\n elif context and \u0027environment\u0027 in context:\n   env \u003d context[\u0027environment\u0027]\n local_context \u003d {}\n if env:\n   local_context[\u0027environment\u0027] \u003d env","commit_id":"223e5818e7eda13fc3b18af666583eed8fe5582f"}],"keystone/contrib/federation/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"932a8464a7b56b8cfefa4beac34409dcabb19cb3","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \"\"\"Base behaviors for federation controllers.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def base_url(cls, environment, path\u003dNone):"},{"line_number":46,"context_line":"        \"\"\"Construct a path and pass it to V3Controller.base_url method.\"\"\""},{"line_number":47,"context_line":"        path \u003d \u0027/OS-FEDERATION/\u0027 + cls.collection_name"},{"line_number":48,"context_line":"        return super(_ControllerBase, cls).base_url(environment, path\u003dpath)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba8a016a_3be707e6","line":45,"updated":"2015-11-16 21:06:35.000000000","message":"the fix would be a lot easier to review if the change to base_url to take environment rather than context was a separate commit.","commit_id":"b3ecac634b10958401c10f68c282c58b3822eb61"}],"keystone/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7787969d2f678ab61e3928166f892a3022756c2f","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        \"\"\"Returns a URL to keystone\u0027s own endpoint.\"\"\""},{"line_number":118,"context_line":"        url \u003d self.base_url(environment, self.endpoint_url_type)"},{"line_number":119,"context_line":"        if version:"},{"line_number":120,"context_line":"            # TODO(jd) The version argument is \"bad\" because it does not"},{"line_number":121,"context_line":"            # respect what might be configured into the Paste pipeline; it\u0027d be"},{"line_number":122,"context_line":"            # better to look in the Paste pipeline where is _really_ mapped the"},{"line_number":123,"context_line":"            # WSGI application we are looking for"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_bbdfddd4","line":120,"updated":"2015-09-30 14:56:28.000000000","message":"nit: \n\n    # TODO(jd):","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"a500f3e08a0feacd89597b3afa544ccb603647b6","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        \"\"\"Returns a URL to keystone\u0027s own endpoint.\"\"\""},{"line_number":118,"context_line":"        url \u003d self.base_url(environment, self.endpoint_url_type)"},{"line_number":119,"context_line":"        if version:"},{"line_number":120,"context_line":"            # TODO(jd) The version argument is \"bad\" because it does not"},{"line_number":121,"context_line":"            # respect what might be configured into the Paste pipeline; it\u0027d be"},{"line_number":122,"context_line":"            # better to look in the Paste pipeline where is _really_ mapped the"},{"line_number":123,"context_line":"            # WSGI application we are looking for"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_4a810cfa","line":120,"in_reply_to":"9a1a9d01_bbdfddd4","updated":"2015-09-30 15:22:14.000000000","message":"Done","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7787969d2f678ab61e3928166f892a3022756c2f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if version:"},{"line_number":120,"context_line":"            # TODO(jd) The version argument is \"bad\" because it does not"},{"line_number":121,"context_line":"            # respect what might be configured into the Paste pipeline; it\u0027d be"},{"line_number":122,"context_line":"            # better to look in the Paste pipeline where is _really_ mapped the"},{"line_number":123,"context_line":"            # WSGI application we are looking for"},{"line_number":124,"context_line":"            return \u0027%s/%s/\u0027 % (url, version)"},{"line_number":125,"context_line":"        return url + \"/\""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_3bb8ad74","line":122,"updated":"2015-09-30 14:56:28.000000000","message":"nit: \n\n    # it\u0027d be better to look in the Paste pipeline for the WSGI application \n    # we\u0027re really looking for.","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"a500f3e08a0feacd89597b3afa544ccb603647b6","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if version:"},{"line_number":120,"context_line":"            # TODO(jd) The version argument is \"bad\" because it does not"},{"line_number":121,"context_line":"            # respect what might be configured into the Paste pipeline; it\u0027d be"},{"line_number":122,"context_line":"            # better to look in the Paste pipeline where is _really_ mapped the"},{"line_number":123,"context_line":"            # WSGI application we are looking for"},{"line_number":124,"context_line":"            return \u0027%s/%s/\u0027 % (url, version)"},{"line_number":125,"context_line":"        return url + \"/\""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_8ab964ce","line":122,"in_reply_to":"9a1a9d01_3bb8ad74","updated":"2015-09-30 15:22:14.000000000","message":"Done","commit_id":"5644f1862e6eebdf67feac72159f244c6a496639"}],"keystone/tests/unit/test_auth.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4ae8a7550bcf4b7cc54a835441e00466bce38ba8","unresolved":false,"context_lines":[{"line_number":872,"context_line":"            token_data\u003dself.token_provider_api.validate_token(token_id))"},{"line_number":873,"context_line":"        auth_context \u003d authorization.token_to_auth_context(token_ref)"},{"line_number":874,"context_line":"        return {\u0027environment\u0027: {authorization.AUTH_CONTEXT_ENV: auth_context,"},{"line_number":875,"context_line":"                                \u0027wsgi.url_scheme\u0027: \u0027http\u0027,"},{"line_number":876,"context_line":"                                \u0027SCRIPT_NAME\u0027: \u0027/v3\u0027,"},{"line_number":877,"context_line":"                                \u0027SERVER_PORT\u0027: \u002780\u0027,"},{"line_number":878,"context_line":"                                \u0027SERVER_NAME\u0027: \u0027localhost\u0027},"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_2021054e","line":875,"updated":"2016-02-03 21:20:14.000000000","message":"Add a comment to the code saying why this is being set this way.","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"0413ad16c62826f9e1e411e5718aa8f1469778b9","unresolved":false,"context_lines":[{"line_number":872,"context_line":"            token_data\u003dself.token_provider_api.validate_token(token_id))"},{"line_number":873,"context_line":"        auth_context \u003d authorization.token_to_auth_context(token_ref)"},{"line_number":874,"context_line":"        return {\u0027environment\u0027: {authorization.AUTH_CONTEXT_ENV: auth_context,"},{"line_number":875,"context_line":"                                \u0027wsgi.url_scheme\u0027: \u0027http\u0027,"},{"line_number":876,"context_line":"                                \u0027SCRIPT_NAME\u0027: \u0027/v3\u0027,"},{"line_number":877,"context_line":"                                \u0027SERVER_PORT\u0027: \u002780\u0027,"},{"line_number":878,"context_line":"                                \u0027SERVER_NAME\u0027: \u0027localhost\u0027},"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_b34af6c3","line":875,"in_reply_to":"5a5ae5dd_2021054e","updated":"2016-02-04 19:52:09.000000000","message":"Done","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":41,"context_line":"TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%fZ\u0027"},{"line_number":42,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"HOST_URL \u003d \u0027http://localhost\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _build_user_auth(token\u003dNone, user_id\u003dNone, username\u003dNone,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_4fe295a0","line":44,"updated":"2016-02-16 16:21:23.000000000","message":"can we pick a random string for this? This is dangerous since it\u0027s too easy for the test to pass even when the code is wrong.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":41,"context_line":"TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%fZ\u0027"},{"line_number":42,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"HOST_URL \u003d \u0027http://localhost\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _build_user_auth(token\u003dNone, user_id\u003dNone, username\u003dNone,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_266e5295","line":44,"in_reply_to":"dae33548_4fe295a0","updated":"2016-02-16 19:36:09.000000000","message":"Done","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"616c53aa8cb5d405546ca380f84b12cc6123ad51","unresolved":false,"context_lines":[{"line_number":43,"context_line":"TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%fZ\u0027"},{"line_number":44,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"HOST \u003d \u0027\u0027.join(random.choice(string.lowercase) for x in range("},{"line_number":47,"context_line":"    random.randint(5, 15)))"},{"line_number":48,"context_line":"HOST_URL \u003d \u0027http://%s\u0027 % (HOST)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"dae33548_427a59f2","line":46,"range":{"start_line":46,"start_character":29,"end_line":46,"end_character":45},"updated":"2016-02-16 22:47:49.000000000","message":"looks like this isnt py3 compatible \n\nlet\u0027s use ascii_lowercase","commit_id":"223e5818e7eda13fc3b18af666583eed8fe5582f"}],"keystone/tests/unit/test_v3.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"612872569fd8b1dedcbb3e1e43e7f238ec9b8c4e","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        self.assertIsInstance(resp.json[\u0027links\u0027], dict)"},{"line_number":712,"context_line":"        self.assertEqual([\u0027self\u0027], list(resp.json[\u0027links\u0027].keys()))"},{"line_number":713,"context_line":"        self.assertEqual("},{"line_number":714,"context_line":"            \u0027http://localhost:80/v3/auth/catalog\u0027,"},{"line_number":715,"context_line":"            resp.json[\u0027links\u0027][\u0027self\u0027])"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def assertValidCatalog(self, entity):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a2fa921_b7918d9b","line":714,"updated":"2015-10-07 19:17:48.000000000","message":":80 and :443 should *always* be excluded in favor of http:// and https:// respectively, according to some RFC I read once but will neglect to cite here.","commit_id":"b1e30bdc0b28ff2ef97d07ce37aa32d52e1717b3"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"e5e57560471ceb49cebb3b9867a9983c6e755c8f","unresolved":false,"context_lines":[{"line_number":711,"context_line":"        self.assertIsInstance(resp.json[\u0027links\u0027], dict)"},{"line_number":712,"context_line":"        self.assertEqual([\u0027self\u0027], list(resp.json[\u0027links\u0027].keys()))"},{"line_number":713,"context_line":"        self.assertEqual("},{"line_number":714,"context_line":"            \u0027http://localhost:80/v3/auth/catalog\u0027,"},{"line_number":715,"context_line":"            resp.json[\u0027links\u0027][\u0027self\u0027])"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":"    def assertValidCatalog(self, entity):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a2fa921_29f8a37a","line":714,"in_reply_to":"7a2fa921_b7918d9b","updated":"2015-10-08 11:52:01.000000000","message":"I don\u0027t think there\u0027s any RFC that forbids that, but feel free to prove this otherwise.\n\nThis :80 comes from the HTTP_HOST env var that is set by the testing framework itself. wsgiref.util uses that var to build the app URL, and it\u0027s actually valid since using the host the client gaves in the response make very much sense.\n\nSo if you want to fix that, the way to fix it is to fix the testing framework to not include the port in the HTTP_HOST var. Or to not set this var at all.","commit_id":"b1e30bdc0b28ff2ef97d07ce37aa32d52e1717b3"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b50e2ab429f8f5c4e93909eaf84476f9406e2a45","unresolved":false,"context_lines":[{"line_number":710,"context_line":"        self.assertIsInstance(resp.json[\u0027links\u0027], dict)"},{"line_number":711,"context_line":"        self.assertEqual([\u0027self\u0027], list(resp.json[\u0027links\u0027].keys()))"},{"line_number":712,"context_line":"        self.assertEqual("},{"line_number":713,"context_line":"            \u0027http://localhost:80/v3/auth/catalog\u0027,"},{"line_number":714,"context_line":"            resp.json[\u0027links\u0027][\u0027self\u0027])"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"    def assertValidCatalog(self, entity):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a29b11f_36f61790","line":713,"updated":"2015-10-19 19:07:04.000000000","message":"I thought we don\u0027t have to specify port 80 as it is the default port for HTTP.","commit_id":"669f6b17adfd8b6297a95f4d855f84193f30a950"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"0b65f7ae5c7320575a2f77ae303ecaf3e2c17b9c","unresolved":false,"context_lines":[{"line_number":710,"context_line":"        self.assertIsInstance(resp.json[\u0027links\u0027], dict)"},{"line_number":711,"context_line":"        self.assertEqual([\u0027self\u0027], list(resp.json[\u0027links\u0027].keys()))"},{"line_number":712,"context_line":"        self.assertEqual("},{"line_number":713,"context_line":"            \u0027http://localhost:80/v3/auth/catalog\u0027,"},{"line_number":714,"context_line":"            resp.json[\u0027links\u0027][\u0027self\u0027])"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"    def assertValidCatalog(self, entity):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a29b11f_4d34cffa","line":713,"in_reply_to":"3a29b11f_36f61790","updated":"2015-10-22 14:06:49.000000000","message":"I already replied to this same comment in a previous patchset. This is due to the fact that the HTTP_HOST env var is set and is being used. This is something to be rather fixed in the test framework, but I don\u0027t think it\u0027s worth it.","commit_id":"669f6b17adfd8b6297a95f4d855f84193f30a950"}],"keystone/tests/unit/test_wsgi.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b50e2ab429f8f5c4e93909eaf84476f9406e2a45","unresolved":false,"context_lines":[{"line_number":256,"context_line":"            \u0027REQUEST_SCHEME\u0027: \u0027http\u0027,"},{"line_number":257,"context_line":"        })"},{"line_number":258,"context_line":"        resp \u003d req.get_response(FakeApp())"},{"line_number":259,"context_line":"        self.assertEqual(b\"http://1.2.3.4/identity\", resp.body)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"class ExtensionRouterTest(BaseWSGITest):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a29b11f_7b5f9a72","line":259,"updated":"2015-10-19 19:07:04.000000000","message":"use single quote for strings?\n\nAlso, add one more test with \u0027REQUEST_SCHEME\u0027: \u0027https\u0027 would be awsomer.","commit_id":"669f6b17adfd8b6297a95f4d855f84193f30a950"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4ae8a7550bcf4b7cc54a835441e00466bce38ba8","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                return self.base_url(context, \u0027public\u0027)"},{"line_number":247,"context_line":"        req \u003d self._make_request(url\u003d\u0027/\u0027)"},{"line_number":248,"context_line":"        req.environ.update({"},{"line_number":249,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027/identity\u0027,"},{"line_number":250,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":251,"context_line":"            \u0027PATH_INFO\u0027: \u0027/\u0027,"},{"line_number":252,"context_line":"            \u0027SERVER_PROTOCOL\u0027: \u0027HTTP/1.1\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_20e825e2","line":249,"updated":"2016-02-03 21:20:14.000000000","message":"a comment where these are coming from would make this easier to maintain.","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"0413ad16c62826f9e1e411e5718aa8f1469778b9","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                return self.base_url(context, \u0027public\u0027)"},{"line_number":247,"context_line":"        req \u003d self._make_request(url\u003d\u0027/\u0027)"},{"line_number":248,"context_line":"        req.environ.update({"},{"line_number":249,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027/identity\u0027,"},{"line_number":250,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":251,"context_line":"            \u0027PATH_INFO\u0027: \u0027/\u0027,"},{"line_number":252,"context_line":"            \u0027SERVER_PROTOCOL\u0027: \u0027HTTP/1.1\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a5ae5dd_53486287","line":249,"in_reply_to":"5a5ae5dd_20e825e2","updated":"2016-02-04 19:52:09.000000000","message":"Done","commit_id":"e9bac19e351118c938c79e97fb9046718762d56f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        # NOTE(gyee): according to wsgiref, if HTTP_HOST is present in the"},{"line_number":249,"context_line":"        # request environment, it will be used to construct the base url."},{"line_number":250,"context_line":"        # SERVER_NAME and SERVER_PORT will be ignored. These are standard"},{"line_number":251,"context_line":"        # WSGI environment variables populated by the webserver."},{"line_number":252,"context_line":"        req.environ.update({"},{"line_number":253,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027/identity\u0027,"},{"line_number":254,"context_line":"            \u0027SERVER_NAME\u0027: \u00271.2.3.4\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_8a300ba0","line":251,"updated":"2016-02-16 16:21:23.000000000","message":"I wonder if we need to test this -- we don\u0027t need to have tests in keystone that verify that wsgiref.util.application_uri() works as designed, only that we\u0027re calling it correctly.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        # NOTE(gyee): according to wsgiref, if HTTP_HOST is present in the"},{"line_number":249,"context_line":"        # request environment, it will be used to construct the base url."},{"line_number":250,"context_line":"        # SERVER_NAME and SERVER_PORT will be ignored. These are standard"},{"line_number":251,"context_line":"        # WSGI environment variables populated by the webserver."},{"line_number":252,"context_line":"        req.environ.update({"},{"line_number":253,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027/identity\u0027,"},{"line_number":254,"context_line":"            \u0027SERVER_NAME\u0027: \u00271.2.3.4\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_c90fb72c","line":251,"in_reply_to":"dae33548_8a300ba0","updated":"2016-02-16 19:36:09.000000000","message":"We are. See line 263 below.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        # SERVER_NAME and SERVER_PORT will be ignored. These are standard"},{"line_number":251,"context_line":"        # WSGI environment variables populated by the webserver."},{"line_number":252,"context_line":"        req.environ.update({"},{"line_number":253,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027/identity\u0027,"},{"line_number":254,"context_line":"            \u0027SERVER_NAME\u0027: \u00271.2.3.4\u0027,"},{"line_number":255,"context_line":"            \u0027wsgi.url_scheme\u0027: \u0027http\u0027,"},{"line_number":256,"context_line":"            \u0027SERVER_PORT\u0027: \u002780\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_0a487b2c","line":253,"updated":"2016-02-16 16:21:23.000000000","message":"would we ever see a SCRIPT_NAME of /identity? Shouldn\u0027t it always be /v2.0 or /v3? If this isn\u0027t realistic, change it to be what we\u0027d expect.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        # SERVER_NAME and SERVER_PORT will be ignored. These are standard"},{"line_number":251,"context_line":"        # WSGI environment variables populated by the webserver."},{"line_number":252,"context_line":"        req.environ.update({"},{"line_number":253,"context_line":"            \u0027SCRIPT_NAME\u0027: \u0027/identity\u0027,"},{"line_number":254,"context_line":"            \u0027SERVER_NAME\u0027: \u00271.2.3.4\u0027,"},{"line_number":255,"context_line":"            \u0027wsgi.url_scheme\u0027: \u0027http\u0027,"},{"line_number":256,"context_line":"            \u0027SERVER_PORT\u0027: \u002780\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_062ceea9","line":253,"in_reply_to":"dae33548_0a487b2c","updated":"2016-02-16 19:36:09.000000000","message":"Yes, that\u0027s how it is being setup in devstack right now. You can either use the legacy URL or\n\n/identity/v3\n/identity/v2.0\n/identity_admin/v3\n/identity_admin/v2.0\n\nSee\n\nhttps://github.com/openstack-dev/devstack/blob/master/files/apache-keystone.template#L38\n\nIn fact, that\u0027s the direction we are heading, that we are using the standard HTTP/S ports and namespace each service in the SCRIPT_NAME. That way, we don\u0027t have to worry non-standard ports in production deployment. Much easier to deal with the networking and security folks.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"94a4e373734c7bfd4d9c735573f294c500381bee","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        resp \u003d req.get_response(FakeApp())"},{"line_number":272,"context_line":"        self.assertEqual(b\"http://1.1.1.1:1234/identity\", resp.body)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        # make sure it normalize the standard HTTP port 80 by stripping"},{"line_number":275,"context_line":"        # it"},{"line_number":276,"context_line":"        req \u003d self._make_request(url\u003d\u0027/\u0027)"},{"line_number":277,"context_line":"        req.environ.update({\u0027HTTP_HOST\u0027: \u0027foo:80\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_cab853e8","line":274,"range":{"start_line":274,"start_character":20,"end_line":274,"end_character":22},"updated":"2016-02-16 16:21:23.000000000","message":"this needs to be clear what \"it\" is. This applies to the other places \"it\" is used.","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"2d0231f2998e8523102b00a6e7ba42956c9c98ac","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        resp \u003d req.get_response(FakeApp())"},{"line_number":272,"context_line":"        self.assertEqual(b\"http://1.1.1.1:1234/identity\", resp.body)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        # make sure it normalize the standard HTTP port 80 by stripping"},{"line_number":275,"context_line":"        # it"},{"line_number":276,"context_line":"        req \u003d self._make_request(url\u003d\u0027/\u0027)"},{"line_number":277,"context_line":"        req.environ.update({\u0027HTTP_HOST\u0027: \u0027foo:80\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"dae33548_a92193a1","line":274,"range":{"start_line":274,"start_character":20,"end_line":274,"end_character":22},"in_reply_to":"dae33548_cab853e8","updated":"2016-02-16 19:36:09.000000000","message":"Done","commit_id":"1b29e3fb59ecf8574451e5a985cb687eb24faf5b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1d09c5e9d99e469cd7bb0ade92f0cd9fa5de5429","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        self.assertEqual(b\"http://1.1.1.1:1234/identity\", resp.body)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"        # make sure keystone normalize the standard HTTP port 80 by stripping"},{"line_number":275,"context_line":"        # it"},{"line_number":276,"context_line":"        req \u003d self._make_request(url\u003d\u0027/\u0027)"},{"line_number":277,"context_line":"        req.environ.update({\u0027HTTP_HOST\u0027: \u0027foo:80\u0027,"},{"line_number":278,"context_line":"                            \u0027SCRIPT_NAME\u0027: \u0027/identity\u0027})"}],"source_content_type":"text/x-python","patch_set":23,"id":"dae33548_1d839999","line":275,"updated":"2016-02-16 21:19:38.000000000","message":"the comment should say why this is important to do.","commit_id":"223e5818e7eda13fc3b18af666583eed8fe5582f"}]}
