httpd.py.bak
1 """ 2 src/network/httpd.py 3 ======================= 4 """ 5 import asyncore 6 import socket 7 8 from tls import TLSHandshake 9 10 11 class HTTPRequestHandler(asyncore.dispatcher): 12 """Handling HTTP request""" 13 response = """HTTP/1.0 200 OK\r 14 Date: Sun, 23 Oct 2016 18:02:00 GMT\r 15 Content-Type: text/html; charset=UTF-8\r 16 Content-Encoding: UTF-8\r 17 Content-Length: 136\r 18 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT\r 19 Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)\r 20 ETag: "3f80f-1b6-3e1cb03b"\r 21 Accept-Ranges: bytes\r 22 Connection: close\r 23 \r 24 <html> 25 <head> 26 <title>An Example Page</title> 27 </head> 28 <body> 29 Hello World, this is a very simple HTML document. 30 </body> 31 </html>""" 32 33 def __init__(self, sock): 34 if not hasattr(self, '_map'): 35 asyncore.dispatcher.__init__(self, sock) 36 self.inbuf = "" 37 self.ready = True 38 self.busy = False 39 self.respos = 0 40 41 def handle_close(self): 42 self.close() 43 44 def readable(self): 45 return self.ready 46 47 def writable(self): 48 return self.busy 49 50 def handle_read(self): 51 self.inbuf += self.recv(8192) 52 if self.inbuf[-4:] == "\r\n\r\n": 53 self.busy = True 54 self.ready = False 55 self.inbuf = "" 56 elif self.inbuf == "": 57 pass 58 59 def handle_write(self): 60 if self.busy and self.respos < len(HTTPRequestHandler.response): 61 written = 0 62 written = self.send(HTTPRequestHandler.response[self.respos:65536]) 63 self.respos += written 64 elif self.busy: 65 self.busy = False 66 self.ready = True 67 self.close() 68 69 70 class HTTPSRequestHandler(HTTPRequestHandler, TLSHandshake): 71 """Handling HTTPS request""" 72 def __init__(self, sock): 73 if not hasattr(self, '_map'): 74 asyncore.dispatcher.__init__(self, sock) # pylint: disable=non-parent-init-called 75 # self.tlsDone = False 76 TLSHandshake.__init__( 77 self, 78 sock=sock, 79 certfile='/home/shurdeek/src/PyBitmessage/src/sslkeys/cert.pem', 80 keyfile='/home/shurdeek/src/PyBitmessage/src/sslkeys/key.pem', 81 server_side=True) 82 HTTPRequestHandler.__init__(self, sock) 83 84 def handle_connect(self): 85 TLSHandshake.handle_connect(self) 86 87 def handle_close(self): 88 if self.tlsDone: 89 HTTPRequestHandler.close(self) 90 else: 91 TLSHandshake.close(self) 92 93 def readable(self): 94 if self.tlsDone: 95 return HTTPRequestHandler.readable(self) 96 return TLSHandshake.readable(self) 97 98 def handle_read(self): 99 if self.tlsDone: 100 HTTPRequestHandler.handle_read(self) 101 else: 102 TLSHandshake.handle_read(self) 103 104 def writable(self): 105 if self.tlsDone: 106 return HTTPRequestHandler.writable(self) 107 return TLSHandshake.writable(self) 108 109 def handle_write(self): 110 if self.tlsDone: 111 HTTPRequestHandler.handle_write(self) 112 else: 113 TLSHandshake.handle_write(self) 114 115 116 class HTTPServer(asyncore.dispatcher): 117 """Handling HTTP Server""" 118 port = 12345 119 120 def __init__(self): 121 if not hasattr(self, '_map'): 122 asyncore.dispatcher.__init__(self) 123 self.create_socket(socket.AF_INET, socket.SOCK_STREAM) 124 self.set_reuse_addr() 125 self.bind(('127.0.0.1', HTTPServer.port)) 126 self.connections = 0 127 self.listen(5) 128 129 def handle_accept(self): 130 pair = self.accept() 131 if pair is not None: 132 sock, addr = pair 133 # print 'Incoming connection from %s' % repr(addr) 134 self.connections += 1 135 # if self.connections % 1000 == 0: 136 # print "Processed %i connections, active %i" % (self.connections, len(asyncore.socket_map)) 137 HTTPRequestHandler(sock) 138 139 140 class HTTPSServer(HTTPServer): 141 """Handling HTTPS Server""" 142 port = 12345 143 144 def __init__(self): 145 if not hasattr(self, '_map'): 146 HTTPServer.__init__(self) 147 148 def handle_accept(self): 149 pair = self.accept() 150 if pair is not None: 151 sock, addr = pair 152 # print 'Incoming connection from %s' % repr(addr) 153 self.connections += 1 154 # if self.connections % 1000 == 0: 155 # print "Processed %i connections, active %i" % (self.connections, len(asyncore.socket_map)) 156 HTTPSRequestHandler(sock) 157 158 159 if __name__ == "__main__": 160 client = HTTPSServer() 161 asyncore.loop()