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
# 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(
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
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):
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
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'))