]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Move HTTPServer's valid_ip function to netutil.
authorBen Darnell <ben@bendarnell.com>
Sun, 24 Feb 2013 16:47:30 +0000 (11:47 -0500)
committerBen Darnell <ben@bendarnell.com>
Sun, 24 Feb 2013 16:47:30 +0000 (11:47 -0500)
tornado/httpserver.py
tornado/netutil.py
tornado/test/netutil_test.py

index 24d5e6b3d0bcaf659ba9b053d508815589c5cf93..7c255f7a156c1bd437038d990ffa6bbf46e7a8a6 100644 (file)
@@ -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
index 4003245e3b93052017cdc251093fd0174be35592..576120188e1e90ac7ccd44aa79cfcf94562b9a5e 100644 (file)
@@ -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):
index e090d3d9f24ed2eb141b0bbab7a4afc941c29270..2ba5d8abf10a8d42ee61da821cb017007b2309b8 100644 (file)
@@ -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'))