python-hserver/hserver/server.py

183 lines
4.2 KiB
Python
Raw Normal View History

2018-03-09 11:50:31 +01:00
import socketserver
import traceback
import io
import os.path
import hserver
import hserver.systemplates
import threading
import socket
from hserver.mime import MIME
from hserver.packages import PackageManager
2018-03-12 20:38:33 +01:00
import hserver.manage
2018-03-09 11:50:31 +01:00
import objectbroker
from objectbroker import AquisitionProxy
2018-03-12 20:38:33 +01:00
from simplelog import log
2018-03-09 11:50:31 +01:00
class HServerRequestHandler(socketserver.StreamRequestHandler):
""
def handle(self):
self.__keepalive = False
2018-03-13 08:06:50 +01:00
log("handle():")
2018-03-09 11:50:31 +01:00
try:
self.handle_request()
while (self.__keepalive):
self.handle_request()
except:
2018-03-13 08:06:50 +01:00
log("handle(): Exception:")
2018-03-09 11:50:31 +01:00
traceback.print_exc()
# self.rfile.close()
# self.wfile.close()
self.request.close()
2018-03-13 08:06:50 +01:00
log("handle(): finished.")
2018-03-09 11:50:31 +01:00
def handle_request(self):
2018-03-13 08:06:50 +01:00
log("handle_request():")
2018-03-09 11:50:31 +01:00
l = self.rfile.readline()
rline = str(l,"iso-8859-1")
toks = rline.split()
2018-03-13 08:06:50 +01:00
log("handle_request: requestline: %s" % (toks,))
2018-03-09 11:50:31 +01:00
if (len(toks)!=3):
return
method,uri,version = toks
if (not version.startswith("HTTP/")):
2018-03-13 08:06:50 +01:00
log("handle_request: Version String: %s" % (version,))
2018-03-09 11:50:31 +01:00
return
#self.rbfile = self.rfile
#self.rfile = io.TextIOWrapper(self.rbfile, "iso-8859-1")
2018-03-13 08:06:50 +01:00
log("MIMEing...")
2018-03-09 11:50:31 +01:00
mime = MIME(self.rfile, defaultlength=0)
r = hserver.Request( URI=uri, MIME=mime, method=method, read=self.rfile )
try:
self.server.hserver.handle(r)
except hserver.FinishRequestException:
pass
except hserver.HttpException as ex:
r.reset()
r.setResponseHeader("Content-Type","text/html")
t = self.server.hserver.packagemanager().hcore.Templates.provide("%s.html" % (ex.status,))
t.run( ex, outfile=r.getContentFile() )
except Exception as ex:
traceback.print_exception(type(ex),ex,ex.__traceback__)
r.reset()
r.setResponseHeader("Content-Type","text/html")
self.templ_exception = hserver.Template(source=hserver.systemplates.tmpl_exception, disable_sandbox=True)
self.templ_exception.run( ex, globals(), outfile=r.getContentFile() )
2018-03-13 08:06:50 +01:00
log("handle_request(): reply")
2018-03-09 11:50:31 +01:00
r.setResponseHeader("Connection","close")
w = io.TextIOWrapper(self.wfile)
w.write("%s %s %s\r\n" % (version,r.getStatus(),r.getStatus()))
c = r.getContent()
r.getResponseHeaders()['Content-Length'] = str(len(c))
for k in r.getResponseHeaders().keys():
2018-03-13 08:06:50 +01:00
if isinstance(r.getResponseHeaders()[k],list):
for v in r.getResponseHeaders()[k]:
w.write("%s: %s\r\n" % (k, v))
else:
w.write("%s: %s\r\n" % (k, r.getResponseHeaders()[k]))
2018-03-09 11:50:31 +01:00
w.write("\r\n")
w.flush()
2018-03-13 08:06:50 +01:00
log("handle_request(): sending content... (%s Bytes)" % (len(c),))
2018-03-09 11:50:31 +01:00
self.wfile.write( c )
#self.wfile.write( b"\r\n" );
2018-03-13 08:06:50 +01:00
log("handle_request(): finished.")
2018-03-09 11:50:31 +01:00
class HServer:
def __init__(self,listen = ('localhost',8080)):
self.__listen = (listen[0],listen[1])
self.__disksync = objectbroker.DiscObjectStore("./DiskSync")
self.__broker = objectbroker.ObjectBroker( self.__disksync )
self.__packages = PackageManager("./packages")
2018-03-12 20:38:33 +01:00
#self.__packages.loadPackageFromPath( "{0}/../hcore".format( os.path.dirname(__file__) ) )
2018-03-09 11:50:31 +01:00
if "ROOT" in self.__disksync:
self.__root = self.__broker.load( self.__disksync["ROOT"].decode("UTF-8") )
else:
2018-03-12 20:38:33 +01:00
self.__root = hserver.manage.RootFolder()
2018-03-09 11:50:31 +01:00
persistence_id = self.__broker.save( self.__root )
2018-03-12 20:38:33 +01:00
log("Created new RootFolder {0}".format(persistence_id))
2018-03-09 11:50:31 +01:00
self.__disksync["ROOT"] = persistence_id.encode("UTF-8")
2018-03-12 20:38:33 +01:00
#self.__packages.hcore.module().core.init(self)
2018-03-09 11:50:31 +01:00
def _shutdown(self):
self.__http.shutdown()
def shutdown(self):
t = threading.Thread(target=HServer._shutdown,args=(self,))
t.start()
def packagemanager(self):
return self.__packages
def getRoot(self):
return self.__root
def aq_root(self):
return AquisitionProxy( self.__root )
def run(self):
socketserver.TCPServer.allow_reuse_address = True
self.__http = socketserver.TCPServer(self.__listen,HServerRequestHandler)
self.__http.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.__http.hserver = self
self.__http.serve_forever()
def handle(self,request):
2018-03-13 08:06:50 +01:00
log("Hserver.handle(%s)" % (request,))
2018-03-09 11:50:31 +01:00
root = self.aq_root()
if (request.pathwalker().len()==0):
root( request )
else:
root.walk( request )
self.__broker.save( self.__root )