diff --git a/.gitignore b/.gitignore index dde3895..db56a7e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store *.pyc +._* \ No newline at end of file diff --git a/hserver/api/WebObject.py b/hserver/api/WebObject.py index 35e2d2a..fd92dbf 100644 --- a/hserver/api/WebObject.py +++ b/hserver/api/WebObject.py @@ -23,10 +23,11 @@ class WebObject(WebCallableObject,FormApplyable,Aquisition): return self._aq_parent.wo_accepts() return woa - def __init__(self): + def __init__(self, templates = None): self.__default = None self.__sessionhandlers = [] self.title = "No Title yet" + self.__templates = templates def __getitem__(self,name): try: @@ -51,6 +52,16 @@ class WebObject(WebCallableObject,FormApplyable,Aquisition): o = getattr(self,name,None) return not o is None + def __getattr__(self,name): + if not (name.startswith("_")): + t = self.__templates + + if (not t is None) and (name in t): + print("-----------################## {0}".format(t)) + return t[ name ] + + raise AttributeError("%s not found in %s" % (name,self)) + def default(self): return self.__default diff --git a/hserver/formdata.py b/hserver/formdata.py index 2c90832..a985ef2 100644 --- a/hserver/formdata.py +++ b/hserver/formdata.py @@ -19,7 +19,11 @@ class FormValue: if (not pp is None) and ("filename" in pp.keys()): return pp["filename"] return None - + + def save(self, filename): + f = open( filename, "wb" ) + f.write( self.__value ) + f.close() class FormData: diff --git a/hserver/request.py b/hserver/request.py index e39c14c..95756cf 100644 --- a/hserver/request.py +++ b/hserver/request.py @@ -2,7 +2,10 @@ import http.server import hserver from hserver.formdata import FormData -from hserver.http import CookieManager,Cookie +from hserver.http.cookie import CookieManager,Cookie + +from simplelog import log,LLDETAIL,LLDEBUG + import io class PathWalker: @@ -14,8 +17,8 @@ class PathWalker: def len(self): return len(self.__walk) - def next(self): - return self.__walk[0] + def next(self, i = 0): + return self.__walk[i] def walk(self): n = self.__walk[0] @@ -40,15 +43,17 @@ class PathWalker: class Request: - def __init__(self, MIME=None, URI = None, vars = {}, method = "", read = None): + def __init__(self, MIME=None, URI = None, vars = {}, method = "", read = None, client = None): self.reset() self.__mime = MIME - + self.__client = client self.__headers = self.__mime.headers() self.__vars = vars self.__form = None self.__read = read + self.__cookies = {} + self.__messages = [] self.set("REQUEST_URI", URI) self.set("REQUEST_METHOD", method) @@ -77,6 +82,20 @@ class Request: def getContent(self): return self.__bcontent.getvalue() + def headers(self): + return self.__headers + + def cookies(self): + return self.__cookies + def client(self): + return self.__client + + def messages(self): + return self.__messages + + def message(self,msg): + self.__messages.append( str( msg ) ) + def __getattr__(self,name): if name in self.__vars.keys(): @@ -102,7 +121,7 @@ class Request: def setResponseHeader(self,name,value): name = name.upper() - self.__rheaders[ name ] = value + self.__rheaders[ name ] = str(value) def addResponseHeader(self,name,value): name = name.upper() @@ -148,7 +167,7 @@ class Request: l = int( self.__headers.value("Content-Length",0) ) - print("Request: Content-Length: %s" % (l,)) + log("Request: Content-Length: %s" % (l,), LLDETAIL) self.set("CONTENT_TYPE", self.__headers.value("Content-Type", "")) self.set("REFERER", self.__headers.value("Referer", "")) @@ -156,8 +175,21 @@ class Request: self.__construct_path_info() self.__form = FormData(self) self.__pathwalker = PathWalker(self.__path_info) - self.__cookies = CookieManager(self.__mime) - self.__session = None + + cookies = self.headers().get("COOKIE") + if (not cookies is None): + for cookie in cookies: + try: + s = cookie.rawvalue().split(";") + for r in s: + n,v = r.split("=") + self.__cookies[ n.strip() ] = v.strip() + except Exception as e: + log("Konnte Cookie nicht interpretieren: %s" % (s,),0) + log("Ausnahme: %s" % (e,),0) + + + def __construct_path_info(self): path_info = self.PATH_INFO.split("/") @@ -207,4 +239,3 @@ class Request: - diff --git a/hserver/server.py b/hserver/server.py index 551dfc7..3f78d85 100644 --- a/hserver/server.py +++ b/hserver/server.py @@ -64,7 +64,7 @@ class HServerRequestHandler(socketserver.StreamRequestHandler): log("MIMEing...") mime = MIME(self.rfile, defaultlength=0) - r = hserver.Request( URI=uri, MIME=mime, method=method, read=self.rfile ) + r = hserver.Request( URI=uri, MIME=mime, method=method, read=self.rfile, client=self.client_address ) try: self.server.hserver.handle(r) @@ -76,15 +76,17 @@ class HServerRequestHandler(socketserver.StreamRequestHandler): 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() ) + + print("handle_request(): reply") log("handle_request(): reply") @@ -119,26 +121,26 @@ class HServerRequestHandler(socketserver.StreamRequestHandler): class HServer: - def __init__(self,listen = ('localhost',8080)): + def __init__(self,listen = ('localhost',8080), object_store = None, object_broker = None,root_object = None, packagemanager = None): self.__listen = (listen[0],listen[1]) - self.__disksync = objectbroker.DiscObjectStore("./DiskSync") - self.__broker = objectbroker.ObjectBroker( self.__disksync ) + self.__disksync = object_store + self.__broker = object_broker + self.__packages = packagemanager - self.__packages = PackageManager("./packages") - #self.__packages.loadPackageFromPath( "{0}/../hcore".format( os.path.dirname(__file__) ) ) - - if "ROOT" in self.__disksync: - self.__root = self.__broker.load( self.__disksync["ROOT"].decode("UTF-8") ) + if (root_object is None): + if (not (self.__disksync is None)) and ("ROOT" in self.__disksync): + self.__root = self.__broker.load( self.__disksync["ROOT"].decode("UTF-8") ) + else: + self.__root = hserver.manage.RootFolder() else: - self.__root = hserver.manage.RootFolder() + self.__root = root_object + + if not self.__broker is None: persistence_id = self.__broker.save( self.__root ) log("Created new RootFolder {0}".format(persistence_id)) self.__disksync["ROOT"] = persistence_id.encode("UTF-8") - #self.__packages.hcore.module().core.init(self) - - def _shutdown(self): self.__http.shutdown() @@ -162,7 +164,16 @@ class HServer: self.__http.hserver = self self.__http.serve_forever() + try: + self.__http.serve_forever() + except Exception as e: + pass + + self.__http.socket.close() + def start(self): + self.thread = threading.Thread( target = self.run, args = () ) + self.thread.start() def handle(self,request): log("Hserver.handle(%s)" % (request,)) @@ -173,10 +184,10 @@ class HServer: root( request ) else: root.walk( request ) - self.__broker.save( self.__root ) + if not self.__broker is None: + self.__broker.save( self.__root ) - diff --git a/hserver/templates/templatemodule.py b/hserver/templates/templatemodule.py index 13fbb12..9d6c1d3 100644 --- a/hserver/templates/templatemodule.py +++ b/hserver/templates/templatemodule.py @@ -67,6 +67,14 @@ class TemplateModule: raise IndexError("%s not found in %s" % (name,self)) + def __contains__(self,name): + if not ((name in self.__children) or (name in self.__altchildren)): + self.__load() + + return (name in self.__children) or (name in self.__altchildren) + + + def provide(self,name): s = name.split("/") if len(s) > 1: