From: Ben Darnell Date: Sun, 20 Jan 2013 20:40:31 +0000 (-0500) Subject: Fix some iter{items,keys,values} calls that slipped through the cracks. X-Git-Tag: v3.0.0~164 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c26f969ab34e7fd6f27a6dc625f8b934f1a990e;p=thirdparty%2Ftornado.git Fix some iter{items,keys,values} calls that slipped through the cracks. Add tests for the functions that were thereby revealed to have none. --- diff --git a/tornado/auth.py b/tornado/auth.py index 861932568..52900cb10 100644 --- a/tornado/auth.py +++ b/tornado/auth.py @@ -165,7 +165,7 @@ class OpenIdMixin(object): # Make sure we got back at least an email from attribute exchange ax_ns = None - for name in self.request.arguments.keys(): + for name in self.request.arguments: if name.startswith("openid.ns.") and \ self.get_argument(name) == u("http://openid.net/srv/ax/1.0"): ax_ns = name[10:] @@ -769,9 +769,9 @@ class GoogleMixin(OpenIdMixin, OAuthMixin): """Fetches the authenticated user data upon redirect.""" # Look to see if we are doing combined OpenID/OAuth oauth_ns = "" - for name, values in self.request.arguments.iteritems(): + for name, values in self.request.arguments.items(): if name.startswith("openid.ns.") and \ - values[-1] == u("http://specs.openid.net/extensions/oauth/1.0"): + values[-1] == b"http://specs.openid.net/extensions/oauth/1.0": oauth_ns = name[10:] break token = self.get_argument("openid." + oauth_ns + ".request_token", "") diff --git a/tornado/curl_httpclient.py b/tornado/curl_httpclient.py index 6fea3253f..3a75a95c0 100644 --- a/tornado/curl_httpclient.py +++ b/tornado/curl_httpclient.py @@ -299,7 +299,7 @@ def _curl_setup_request(curl, request, buffer, headers): [utf8("%s: %s" % i) for i in request.headers.get_all()]) else: curl.setopt(pycurl.HTTPHEADER, - [utf8("%s: %s" % i) for i in request.headers.iteritems()]) + [utf8("%s: %s" % i) for i in request.headers.items()]) if request.header_callback: curl.setopt(pycurl.HEADERFUNCTION, request.header_callback) diff --git a/tornado/httpclient.py b/tornado/httpclient.py index 46184cb0f..6fecdebbe 100644 --- a/tornado/httpclient.py +++ b/tornado/httpclient.py @@ -382,7 +382,7 @@ class HTTPResponse(object): raise self.error def __repr__(self): - args = ",".join("%s=%r" % i for i in self.__dict__.iteritems()) + args = ",".join("%s=%r" % i for i in sorted(self.__dict__.items())) return "%s(%s)" % (self.__class__.__name__, args) diff --git a/tornado/test/auth_test.py b/tornado/test/auth_test.py index 80534a239..4ae1dba59 100644 --- a/tornado/test/auth_test.py +++ b/tornado/test/auth_test.py @@ -5,7 +5,7 @@ from __future__ import absolute_import, division, print_function, with_statement -from tornado.auth import OpenIdMixin, OAuthMixin, OAuth2Mixin, TwitterMixin +from tornado.auth import OpenIdMixin, OAuthMixin, OAuth2Mixin, TwitterMixin, GoogleMixin from tornado.escape import json_decode from tornado.testing import AsyncHTTPTestCase from tornado.util import u @@ -132,6 +132,26 @@ class TwitterServerShowUserHandler(RequestHandler): self.write(dict(screen_name=screen_name, name=screen_name.capitalize())) +class GoogleOpenIdClientLoginHandler(RequestHandler, GoogleMixin): + def initialize(self, test): + self._OPENID_ENDPOINT = test.get_url('/openid/server/authenticate') + + @asynchronous + def get(self): + if self.get_argument("openid.mode", None): + self.get_authenticated_user(self.on_user) + return + self.authenticate_redirect() + + def on_user(self, user): + if user is None: + raise Exception("user is None") + self.finish(user) + + def get_auth_http_client(self): + return self.settings['http_client'] + + class AuthTest(AsyncHTTPTestCase): def get_app(self): return Application( @@ -151,6 +171,7 @@ class AuthTest(AsyncHTTPTestCase): ('/oauth2/client/login', OAuth2ClientLoginHandler, dict(test=self)), ('/twitter/client/login', TwitterClientLoginHandler, dict(test=self)), + ('/google/client/openid_login', GoogleOpenIdClientLoginHandler, dict(test=self)), # simulated servers ('/openid/server/authenticate', OpenIdServerAuthenticateHandler), @@ -261,3 +282,16 @@ class AuthTest(AsyncHTTPTestCase): u('name'): u('Foo'), u('screen_name'): u('foo'), u('username'): u('foo')}) + + def test_google_redirect(self): + # same as test_openid_redirect + response = self.fetch('/google/client/openid_login', follow_redirects=False) + self.assertEqual(response.code, 302) + self.assertTrue( + '/openid/server/authenticate?' in response.headers['Location']) + + def test_google_get_user(self): + response = self.fetch('/google/client/openid_login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo@example.com', follow_redirects=False) + response.rethrow() + parsed = json_decode(response.body) + self.assertEqual(parsed["email"], "foo@example.com") diff --git a/tornado/test/httpclient_test.py b/tornado/test/httpclient_test.py index 99b3a686d..e04f7c451 100644 --- a/tornado/test/httpclient_test.py +++ b/tornado/test/httpclient_test.py @@ -9,7 +9,7 @@ import functools import sys from tornado.escape import utf8 -from tornado.httpclient import HTTPRequest, _RequestProxy +from tornado.httpclient import HTTPRequest, HTTPResponse, _RequestProxy from tornado.iostream import IOStream from tornado import netutil from tornado.stack_context import ExceptionStackContext, NullContext @@ -18,6 +18,10 @@ from tornado.test.util import unittest from tornado.util import u, bytes_type from tornado.web import Application, RequestHandler, url +try: + from io import BytesIO # python 3 +except ImportError: + from cStringIO import StringIO as BytesIO class HelloWorldHandler(RequestHandler): def get(self): @@ -345,3 +349,12 @@ class RequestProxyTest(unittest.TestCase): def test_defaults_none(self): proxy = _RequestProxy(HTTPRequest('http://example.com/'), None) self.assertIs(proxy.auth_username, None) + + +class HTTPResponseTestCase(unittest.TestCase): + def test_str(self): + response = HTTPResponse(HTTPRequest('http://example.com'), + 200, headers={}, buffer=BytesIO()) + s = str(response) + self.assertTrue(s.startswith('HTTPResponse(')) + self.assertIn('code=200', s) diff --git a/tornado/test/twisted_test.py b/tornado/test/twisted_test.py index 197589826..ba00c309d 100644 --- a/tornado/test/twisted_test.py +++ b/tornado/test/twisted_test.py @@ -72,7 +72,7 @@ def save_signal_handlers(): def restore_signal_handlers(saved): - for sig, handler in saved.iteritems(): + for sig, handler in saved.items(): signal.signal(sig, handler) @@ -508,7 +508,7 @@ if have_twisted: ], 'twisted.internet.test.test_unix.UNIXPortTestsBuilder': [], } - for test_name, blacklist in twisted_tests.iteritems(): + for test_name, blacklist in twisted_tests.items(): try: test_class = import_object(test_name) except (ImportError, AttributeError): diff --git a/tornado/test/web_test.py b/tornado/test/web_test.py index 7a3cdc2b4..e9dfb4cff 100644 --- a/tornado/test/web_test.py +++ b/tornado/test/web_test.py @@ -1080,3 +1080,17 @@ class PathArgsInPrepareTest(WebTestCase): response.rethrow() data = json_decode(response.body) self.assertEqual(data, {'args': [], 'kwargs': {'path': 'foo'}}) + + +@wsgi_safe +class ClearAllCookiesTest(SimpleHandlerTestCase): + class Handler(RequestHandler): + def get(self): + self.clear_all_cookies() + self.write('ok') + + def test_clear_all_cookies(self): + response = self.fetch('/', headers={'Cookie': 'foo=bar; baz=xyzzy'}) + set_cookies = sorted(response.headers.get_list('Set-Cookie')) + self.assertTrue(set_cookies[0].startswith('baz=;')) + self.assertTrue(set_cookies[1].startswith('foo=;')) diff --git a/tornado/web.py b/tornado/web.py index 7fd0c208d..05637034c 100644 --- a/tornado/web.py +++ b/tornado/web.py @@ -434,7 +434,7 @@ class RequestHandler(object): def clear_all_cookies(self): """Deletes all the cookies the user sent with this request.""" - for name in self.request.cookies.iterkeys(): + for name in self.request.cookies: self.clear_cookie(name) def set_secure_cookie(self, name, value, expires_days=30, **kwargs):