From: Ben Darnell Date: Sun, 24 Feb 2013 16:47:30 +0000 (-0500) Subject: Move HTTPServer's valid_ip function to netutil. X-Git-Tag: v3.0.0~93 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7069d183756f947a95c0412075b5e379122349de;p=thirdparty%2Ftornado.git Move HTTPServer's valid_ip function to netutil. --- diff --git a/tornado/httpserver.py b/tornado/httpserver.py index 24d5e6b3d..7c255f7a1 100644 --- a/tornado/httpserver.py +++ b/tornado/httpserver.py @@ -34,6 +34,7 @@ from tornado.escape import native_str, parse_qs_bytes from tornado import httputil from tornado import iostream from tornado.log import gen_log +from tornado import netutil from tornado.tcpserver import TCPServer from tornado import stack_context from tornado.util import bytes_type @@ -396,7 +397,7 @@ class HTTPRequest(object): # Squid uses X-Forwarded-For, others use X-Real-Ip self.remote_ip = self.headers.get( "X-Real-Ip", self.headers.get("X-Forwarded-For", remote_ip)) - if not self._valid_ip(self.remote_ip): + if not netutil.is_valid_ip(self.remote_ip): self.remote_ip = remote_ip # AWS uses X-Forwarded-Proto self.protocol = self.headers.get( @@ -491,15 +492,3 @@ class HTTPRequest(object): args = ", ".join(["%s=%r" % (n, getattr(self, n)) for n in attrs]) return "%s(%s, headers=%s)" % ( self.__class__.__name__, args, dict(self.headers)) - - def _valid_ip(self, ip): - try: - res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC, - socket.SOCK_STREAM, - 0, socket.AI_NUMERICHOST) - return bool(res) - except socket.gaierror as e: - if e.args[0] == socket.EAI_NONAME: - return False - raise - return True diff --git a/tornado/netutil.py b/tornado/netutil.py index 4003245e3..576120188 100644 --- a/tornado/netutil.py +++ b/tornado/netutil.py @@ -142,6 +142,23 @@ def add_accept_handler(sock, callback, io_loop=None): io_loop.add_handler(sock.fileno(), accept_handler, IOLoop.READ) +def is_valid_ip(ip): + """Returns true if the given string is a well-formed IP address. + + Supports IPv4 and IPv6. + """ + try: + res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC, + socket.SOCK_STREAM, + 0, socket.AI_NUMERICHOST) + return bool(res) + except socket.gaierror as e: + if e.args[0] == socket.EAI_NONAME: + return False + raise + return True + + class Resolver(Configurable): @classmethod def configurable_base(cls): diff --git a/tornado/test/netutil_test.py b/tornado/test/netutil_test.py index e090d3d9f..2ba5d8abf 100644 --- a/tornado/test/netutil_test.py +++ b/tornado/test/netutil_test.py @@ -2,7 +2,7 @@ from __future__ import absolute_import, division, print_function, with_statement import socket -from tornado.netutil import BlockingResolver, ThreadedResolver +from tornado.netutil import BlockingResolver, ThreadedResolver, is_valid_ip from tornado.testing import AsyncTestCase, gen_test from tornado.test.util import unittest @@ -54,3 +54,15 @@ class ThreadedResolverTest(AsyncTestCase, _ResolverTestMixin): def tearDown(self): self.resolver.executor.shutdown() super(ThreadedResolverTest, self).tearDown() + + +class IsValidIPTest(unittest.TestCase): + def test_is_valid_ip(self): + self.assertTrue(is_valid_ip('127.0.0.1')) + self.assertTrue(is_valid_ip('4.4.4.4')) + self.assertTrue(is_valid_ip('::1')) + self.assertTrue(is_valid_ip('2620:0:1cfe:face:b00c::3')) + self.assertTrue(not is_valid_ip('www.google.com')) + self.assertTrue(not is_valid_ip('localhost')) + self.assertTrue(not is_valid_ip('4.4.4.4<')) + self.assertTrue(not is_valid_ip(' 127.0.0.1'))