/ src / network / httpd.py
httpd.py
  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()