Exemple #1
0
def connection_handler(socket, address):
    hostname = peek_http_host(socket)
    if not hostname:
        send_http_error(socket, 'No hostname', '400 Bad Request')
        return

    if hostname == Tunnel.domain_suffix:
        meta.server.process_request((socket, address))
        return

    tunnel = Tunnel.get_by_hostname(hostname)
    if not tunnel:
        send_http_error(socket, 'No tunnel for {0}'.format(hostname),
                        '410 Gone')
        return

    conn, proxy_used = tunnel.pop_proxy_conn(timeout=2)
    if not conn:
        send_http_error(socket, 'No proxy connections', '502 Bad Gateway')
        return

    protocol.send_message(conn, protocol.proxy_reply())
    pool = util.join_sockets(conn, socket)
    proxy_used.send(pool)
    logging.debug("popped connection:\"{0}\" for frontend:\"{1}\"".format(
        tunnel.name, hostname))
    pool.waitall()
Exemple #2
0
def connection_handler(socket, address):
    hostname = peek_http_host(socket)
    if not hostname:
        send_http_error(socket, "No hostname", "400 Bad Request")
        return

    if hostname == Tunnel.domain_suffix:
        meta.server.process_request((socket, address))
        return

    tunnel = Tunnel.get_by_hostname(hostname)
    if not tunnel:
        send_http_error(socket, "No tunnel for {0}".format(hostname), "410 Gone")
        return

    conn, proxy_used = tunnel.pop_proxy_conn(timeout=2)
    if not conn:
        send_http_error(socket, "No proxy connections", "502 Bad Gateway")
        return

    protocol.send_message(conn, protocol.proxy_reply())
    pool = util.join_sockets(conn, socket)
    proxy_used.send(pool)
    logging.debug('popped connection:"{0}" for frontend:"{1}"'.format(tunnel.name, hostname))
    pool.waitall()
def connection_handler(socket, address):
    host = peek_http_host(socket)
    hostname = host.split(':')[0]
    if not hostname:
        logging.debug("!no hostname, closing")
        socket.close()
        return

    if hostname.startswith('_version.'):
        send_http_response(socket, __version__)
        socket.close()
        logging.debug("version request from {0}".format(address[0]))
        return

    if hostname.startswith('_backend.'):
        port = os.environ.get('DOTCLOUD_SERVER_BACKEND_PORT',
                              Tunnel.backend_port)
        send_http_response(socket, port)
        socket.close()
        return

    if hostname.startswith('_metrics.'):
        content = json.dumps(metrics.dump_metrics(),
                             sort_keys=True,
                             indent=2,
                             separators=(',', ': '))
        send_http_response(socket, content)
        socket.close()
        logging.debug("metrics request from {0}".format(address[0]))
        return

    tunnel = Tunnel.get_by_hostname(hostname)
    if not tunnel:
        logging.debug("!no tunnel, closing ({0})".format(hostname))
        socket.close()
        return

    conn, proxy_used = tunnel.pop_proxy_conn(timeout=2)
    if not conn:
        logging.debug("!no proxy connection, closing")
        socket.close()
        return

    protocol.send_message(conn, protocol.proxy_reply())
    pool = util.join_sockets(conn, socket)
    proxy_used.send(pool)
    logging.debug("popped connection:\"{0}\" for frontend:\"{1}\"".format(
        tunnel.name, hostname))
    pool.waitall()
Exemple #4
0
def connection_handler(socket, address):
    host = peek_http_host(socket)
    hostname = host.split(':')[0]
    if not hostname:
        logging.debug("!no hostname, closing")
        socket.close()
        return

    if hostname.startswith('_version.'):
        send_http_response(socket, __version__)
        socket.close()
        logging.debug("version request from {0}".format(address[0]))
        return

    if hostname.startswith('_backend.'):
        port = os.environ.get('DOTCLOUD_SERVER_BACKEND_PORT', 
                    Tunnel.backend_port)
        send_http_response(socket, port)
        socket.close()
        return

    if hostname.startswith('_metrics.'):
        content = json.dumps(metrics.dump_metrics(),
                    sort_keys=True, indent=2, separators=(',', ': '))
        send_http_response(socket, content)
        socket.close()
        logging.debug("metrics request from {0}".format(address[0]))
        return

    tunnel = Tunnel.get_by_hostname(hostname)
    if not tunnel:
        logging.debug("!no tunnel, closing ({0})".format(
            hostname))
        socket.close()
        return

    conn, proxy_used = tunnel.pop_proxy_conn(timeout=2)
    if not conn:
        logging.debug("!no proxy connection, closing")
        socket.close()
        return

    protocol.send_message(conn, protocol.proxy_reply())
    pool = util.join_sockets(conn, socket)
    proxy_used.send(pool)
    logging.debug("popped connection:\"{0}\" for frontend:\"{1}\"".format(
                tunnel.name, hostname))
    pool.waitall()
Exemple #5
0
    def test_get_by_hostname(self):
        Tunnel.domain_suffix = 'bar'
        tunnel = Tunnel.create(dict(name='foo', client='Test-Client'))
        self.assertTrue(Tunnel.get_by_hostname('foo.bar'))
        self.assertTrue(Tunnel.get_by_hostname('xxx.foo.bar'))
        self.assertFalse(Tunnel.get_by_hostname('foo.bar.bar'))
        tunnel.destroy()

        Tunnel.domain_suffix = 'foo.bar'
        tunnel = Tunnel.create(dict(name='hello', client='Test-Client'))
        self.assertTrue(Tunnel.get_by_hostname('hello.foo.bar'))
        self.assertTrue(Tunnel.get_by_hostname('world.hello.foo.bar'))
        self.assertFalse(Tunnel.get_by_hostname('foo.bar'))
        self.assertFalse(Tunnel.get_by_hostname('bar'))
        self.assertFalse(Tunnel.get_by_hostname('hello.world.foo.bar'))
        tunnel.destroy()

        Tunnel.domain_suffix = None
Exemple #6
0
    def test_get_by_hostname(self):
        Tunnel.domain_suffix = 'bar'
        tunnel = Tunnel.create(dict(name='foo', client='Test-Client'))
        self.assertTrue(Tunnel.get_by_hostname('foo.bar'))
        self.assertTrue(Tunnel.get_by_hostname('xxx.foo.bar'))
        self.assertFalse(Tunnel.get_by_hostname('foo.bar.bar'))
        tunnel.destroy()

        Tunnel.domain_suffix = 'foo.bar'
        tunnel = Tunnel.create(dict(name='hello', client='Test-Client'))
        self.assertTrue(Tunnel.get_by_hostname('hello.foo.bar'))
        self.assertTrue(Tunnel.get_by_hostname('world.hello.foo.bar'))
        self.assertFalse(Tunnel.get_by_hostname('foo.bar'))
        self.assertFalse(Tunnel.get_by_hostname('bar'))
        self.assertFalse(Tunnel.get_by_hostname('hello.world.foo.bar'))
        tunnel.destroy()

        Tunnel.domain_suffix = None
Exemple #7
0
    def test_get_by_hostname(self):
        Tunnel.domain_suffix = "bar"
        tunnel = Tunnel.create(dict(name="foo", client="Test-Client"))
        self.assertTrue(Tunnel.get_by_hostname("foo.bar"))
        self.assertTrue(Tunnel.get_by_hostname("xxx.foo.bar"))
        self.assertFalse(Tunnel.get_by_hostname("foo.bar.bar"))
        tunnel.destroy()

        Tunnel.domain_suffix = "foo.bar"
        tunnel = Tunnel.create(dict(name="hello", client="Test-Client"))
        self.assertTrue(Tunnel.get_by_hostname("hello.foo.bar"))
        self.assertTrue(Tunnel.get_by_hostname("world.hello.foo.bar"))
        self.assertFalse(Tunnel.get_by_hostname("foo.bar"))
        self.assertFalse(Tunnel.get_by_hostname("bar"))
        self.assertFalse(Tunnel.get_by_hostname("hello.world.foo.bar"))
        tunnel.destroy()

        Tunnel.domain_suffix = None