This is a small python script that runs forever, listening for HTTP connections and redirecting them to a specified URL. This was written for the express purpose of redirecting an HTTP connection to an HTTPS server, but will happily redirect to any URL. If the client application does not accept the redirection error code a basic HTML page is delivered which includes directions on how to reach the intended target.
#!/usr/bin/python from socket import * from select import * HOST = '' PORT = 80 TARGET = "https://www.yourserver.here" class Connection: """ An accepted connection. """ def __init__(self, socket, address): self.socket = socket self.ip = address[0] def sendline(self, data): self.socket.send(data + "\r\n") def fileno(self): return self.socket.fileno() class ConnectionHandler: """ Maintains all connections. """ def __init__(self): self.listener = socket(AF_INET, SOCK_STREAM) self.listener.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) self.listener.bind((HOST, PORT)) self.listener.listen(32) print "HTTP 302 Redirector is active and listening on port " + `PORT` + "." def run(self): """ Listen for incoming connections on PORT. When a connection is recieved, send a 302 redirect and then close the socket. """ # Accept an incoming connection. conn = select( [self.listener], [], [], 0.1)[0] if conn: socket, address = self.listener.accept() conn = Connection(socket, address) # burn some time so that the client and server don't have a timing error trash = conn.socket.recv(1024) # send our https redirect conn.sendline("HTTP/1.1 302 Encryption Required") conn.sendline("Location: " + TARGET) conn.sendline("Connection: close") conn.sendline("Cache-control: private") conn.sendline("") conn.sendline("<html><body>Encryption Required. Please go to <a href='" + TARGET + "'>" + TARGET + "</a> for this service.</body></html>") conn.sendline("") # kick em out conn.socket.close connections = ConnectionHandler() while 1: connections.run()