Index: net/tools/testserver/testserver.py |
diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py |
index 871e540f8d272e5b69ed949ed0751dcf671a07dc..88ca09d114a726e9e15f2f3ac9c12f40bddf7b67 100755 |
--- a/net/tools/testserver/testserver.py |
+++ b/net/tools/testserver/testserver.py |
@@ -932,15 +932,24 @@ class TestPageHandler(BasePageHandler): |
expected_password = 'secret' |
realm = 'testrealm' |
set_cookie_if_challenged = False |
+ force_auth = False |
_, _, url_path, _, query, _ = urlparse.urlparse(self.path) |
query_params = cgi.parse_qs(query, True) |
+ _, cookies = cgi.parse_header('Dummy; ' + |
+ self.headers.getheader('cookie', '')) |
if 'set-cookie-if-challenged' in query_params: |
set_cookie_if_challenged = True |
if 'password' in query_params: |
expected_password = query_params['password'][0] |
if 'realm' in query_params: |
realm = query_params['realm'][0] |
+ # The 'force' argument forces a single 401 response to a request |
+ # even if it includes an 'Authorization' header. It sets the |
+ # 'got_forced' cookie which prevents any subsequent requests from |
+ # sending a 401. |
+ if 'force' in query_params and 'got_forced' not in cookies: |
+ force_auth = True |
auth = self.headers.getheader('authorization') |
try: |
@@ -951,6 +960,8 @@ class TestPageHandler(BasePageHandler): |
username, password = re.findall(r'([^:]+):(\S+)', userpass)[0] |
if password != expected_password: |
raise Exception('wrong password') |
+ if force_auth: |
+ raise Exception('Correct password. Re-requesting auth') |
except Exception, e: |
# Authentication failed. |
self.send_response(401) |
@@ -958,6 +969,8 @@ class TestPageHandler(BasePageHandler): |
self.send_header('Content-type', 'text/html') |
if set_cookie_if_challenged: |
self.send_header('Set-Cookie', 'got_challenged=true') |
+ if force_auth: |
+ self.send_header('Set-Cookie', 'got_forced=true') |
self.end_headers() |
self.wfile.write('<html><head>') |
self.wfile.write('<title>Denied: %s</title>' % e) |
@@ -1036,8 +1049,11 @@ class TestPageHandler(BasePageHandler): |
if not self._ShouldHandleRequest("/auth-digest"): |
return False |
+ _, cookies = cgi.parse_header('Dummy; ' + |
+ self.headers.getheader('cookie', '')) |
stale = 'stale' in self.path |
- nonce = self.GetNonce(force_reset=stale) |
+ force = ('force' in self.path and 'got_forced' not in cookies) |
+ nonce = self.GetNonce(force_reset=(stale or force)) |
opaque = _new_md5('opaque').hexdigest() |
password = 'secret' |
realm = 'testrealm' |
@@ -1071,6 +1087,8 @@ class TestPageHandler(BasePageHandler): |
if pairs['response'] != response: |
raise Exception('wrong password') |
+ if force: |
+ raise Exception('Forcing') |
except Exception, e: |
# Authentication failed. |
self.send_response(401) |
@@ -1085,6 +1103,8 @@ class TestPageHandler(BasePageHandler): |
hdr += ', stale="TRUE"' |
self.send_header('WWW-Authenticate', hdr) |
self.send_header('Content-type', 'text/html') |
+ if force: |
+ self.send_header('Set-Cookie', 'got_forced=true') |
self.end_headers() |
self.wfile.write('<html><head>') |
self.wfile.write('<title>Denied: %s</title>' % e) |