82101a36d3
According to the HTTP spec, a HEAD request should return the same status and headers as the GET request (including content-type and content-length). The HEAD request simply strips out the body and returns no body. Any case where HEAD routing returned a different status code than GET, now returns the same status and headers. Any case where HEAD was supported where GET was not supported now supports both GET and HEAD. The wsgi.render_response code now handles HEAD appropriately and will maintain headers while enforcing no body data is returned. The bulk of this change is to support the same behavior between deploying Keystone under eventlet and under HTTPD + mod_wsgi. In the case of deploying under HTTPD + mod_wsgi, there are cases where mod_wsgi will turn a HEAD request into a GET request to ensure that the proper response is rendered. With these changes all HEAD responses will respond in the same manner under either eventlet or mod_wsgi. Change-Id: I13ce159cbe9739d4bf5d321fc4bd069245f32734 Closes-Bug: #1334368
68 lines
2.6 KiB
Python
68 lines
2.6 KiB
Python
# Copyright 2012 OpenStack Foundation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
"""WSGI Routers for the Identity service."""
|
|
from keystone.common import router
|
|
from keystone.common import wsgi
|
|
from keystone.identity import controllers
|
|
|
|
|
|
class Admin(wsgi.ComposableRouter):
|
|
def add_routes(self, mapper):
|
|
# User Operations
|
|
user_controller = controllers.User()
|
|
mapper.connect('/users/{user_id}',
|
|
controller=user_controller,
|
|
action='get_user',
|
|
conditions=dict(method=['GET']))
|
|
|
|
|
|
def append_v3_routers(mapper, routers):
|
|
user_controller = controllers.UserV3()
|
|
routers.append(
|
|
router.Router(user_controller,
|
|
'users', 'user'))
|
|
mapper.connect('/users/{user_id}/password',
|
|
controller=user_controller,
|
|
action='change_password',
|
|
conditions=dict(method=['POST']))
|
|
|
|
mapper.connect('/groups/{group_id}/users',
|
|
controller=user_controller,
|
|
action='list_users_in_group',
|
|
conditions=dict(method=['GET']))
|
|
|
|
mapper.connect('/groups/{group_id}/users/{user_id}',
|
|
controller=user_controller,
|
|
action='add_user_to_group',
|
|
conditions=dict(method=['PUT']))
|
|
|
|
mapper.connect('/groups/{group_id}/users/{user_id}',
|
|
controller=user_controller,
|
|
action='check_user_in_group',
|
|
conditions=dict(method=['GET', 'HEAD']))
|
|
|
|
mapper.connect('/groups/{group_id}/users/{user_id}',
|
|
controller=user_controller,
|
|
action='remove_user_from_group',
|
|
conditions=dict(method=['DELETE']))
|
|
|
|
group_controller = controllers.GroupV3()
|
|
routers.append(
|
|
router.Router(group_controller,
|
|
'groups', 'group'))
|
|
mapper.connect('/users/{user_id}/groups',
|
|
controller=group_controller,
|
|
action='list_groups_for_user',
|
|
conditions=dict(method=['GET']))
|