master
root 2018-05-06 21:29:15 +02:00
parent 9af5bd2229
commit 6df4f4c624
6 changed files with 95 additions and 29 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.DS_Store .DS_Store
*.pyc *.pyc
._*

View File

@ -23,10 +23,11 @@ class WebObject(WebCallableObject,FormApplyable,Aquisition):
return self._aq_parent.wo_accepts() return self._aq_parent.wo_accepts()
return woa return woa
def __init__(self): def __init__(self, templates = None):
self.__default = None self.__default = None
self.__sessionhandlers = [] self.__sessionhandlers = []
self.title = "No Title yet" self.title = "No Title yet"
self.__templates = templates
def __getitem__(self,name): def __getitem__(self,name):
try: try:
@ -51,6 +52,16 @@ class WebObject(WebCallableObject,FormApplyable,Aquisition):
o = getattr(self,name,None) o = getattr(self,name,None)
return not o is 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): def default(self):
return self.__default return self.__default

View File

@ -19,7 +19,11 @@ class FormValue:
if (not pp is None) and ("filename" in pp.keys()): if (not pp is None) and ("filename" in pp.keys()):
return pp["filename"] return pp["filename"]
return None return None
def save(self, filename):
f = open( filename, "wb" )
f.write( self.__value )
f.close()
class FormData: class FormData:

View File

@ -2,7 +2,10 @@ import http.server
import hserver import hserver
from hserver.formdata import FormData 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 import io
class PathWalker: class PathWalker:
@ -14,8 +17,8 @@ class PathWalker:
def len(self): def len(self):
return len(self.__walk) return len(self.__walk)
def next(self): def next(self, i = 0):
return self.__walk[0] return self.__walk[i]
def walk(self): def walk(self):
n = self.__walk[0] n = self.__walk[0]
@ -40,15 +43,17 @@ class PathWalker:
class Request: 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.reset()
self.__mime = MIME self.__mime = MIME
self.__client = client
self.__headers = self.__mime.headers() self.__headers = self.__mime.headers()
self.__vars = vars self.__vars = vars
self.__form = None self.__form = None
self.__read = read self.__read = read
self.__cookies = {}
self.__messages = []
self.set("REQUEST_URI", URI) self.set("REQUEST_URI", URI)
self.set("REQUEST_METHOD", method) self.set("REQUEST_METHOD", method)
@ -77,6 +82,20 @@ class Request:
def getContent(self): def getContent(self):
return self.__bcontent.getvalue() 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): def __getattr__(self,name):
if name in self.__vars.keys(): if name in self.__vars.keys():
@ -102,7 +121,7 @@ class Request:
def setResponseHeader(self,name,value): def setResponseHeader(self,name,value):
name = name.upper() name = name.upper()
self.__rheaders[ name ] = value self.__rheaders[ name ] = str(value)
def addResponseHeader(self,name,value): def addResponseHeader(self,name,value):
name = name.upper() name = name.upper()
@ -148,7 +167,7 @@ class Request:
l = int( self.__headers.value("Content-Length",0) ) 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("CONTENT_TYPE", self.__headers.value("Content-Type", ""))
self.set("REFERER", self.__headers.value("Referer", "")) self.set("REFERER", self.__headers.value("Referer", ""))
@ -156,8 +175,21 @@ class Request:
self.__construct_path_info() self.__construct_path_info()
self.__form = FormData(self) self.__form = FormData(self)
self.__pathwalker = PathWalker(self.__path_info) 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): def __construct_path_info(self):
path_info = self.PATH_INFO.split("/") path_info = self.PATH_INFO.split("/")
@ -207,4 +239,3 @@ class Request:

View File

@ -64,7 +64,7 @@ class HServerRequestHandler(socketserver.StreamRequestHandler):
log("MIMEing...") log("MIMEing...")
mime = MIME(self.rfile, defaultlength=0) 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: try:
self.server.hserver.handle(r) 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 = self.server.hserver.packagemanager().hcore.Templates.provide("%s.html" % (ex.status,))
t.run( ex, outfile=r.getContentFile() ) t.run( ex, outfile=r.getContentFile() )
except Exception as ex: except Exception as ex:
traceback.print_exception(type(ex),ex,ex.__traceback__) traceback.print_exception(type(ex),ex,ex.__traceback__)
r.reset() r.reset()
r.setResponseHeader("Content-Type","text/html") r.setResponseHeader("Content-Type","text/html")
self.templ_exception = hserver.Template(source=hserver.systemplates.tmpl_exception, disable_sandbox=True) self.templ_exception = hserver.Template(source=hserver.systemplates.tmpl_exception, disable_sandbox=True)
self.templ_exception.run( ex, globals(), outfile=r.getContentFile() ) self.templ_exception.run( ex, globals(), outfile=r.getContentFile() )
print("handle_request(): reply")
log("handle_request(): reply") log("handle_request(): reply")
@ -119,26 +121,26 @@ class HServerRequestHandler(socketserver.StreamRequestHandler):
class HServer: 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.__listen = (listen[0],listen[1])
self.__disksync = objectbroker.DiscObjectStore("./DiskSync") self.__disksync = object_store
self.__broker = objectbroker.ObjectBroker( self.__disksync ) self.__broker = object_broker
self.__packages = packagemanager
self.__packages = PackageManager("./packages") if (root_object is None):
#self.__packages.loadPackageFromPath( "{0}/../hcore".format( os.path.dirname(__file__) ) ) if (not (self.__disksync is None)) and ("ROOT" in self.__disksync):
self.__root = self.__broker.load( self.__disksync["ROOT"].decode("UTF-8") )
if "ROOT" in self.__disksync: else:
self.__root = self.__broker.load( self.__disksync["ROOT"].decode("UTF-8") ) self.__root = hserver.manage.RootFolder()
else: else:
self.__root = hserver.manage.RootFolder() self.__root = root_object
if not self.__broker is None:
persistence_id = self.__broker.save( self.__root ) persistence_id = self.__broker.save( self.__root )
log("Created new RootFolder {0}".format(persistence_id)) log("Created new RootFolder {0}".format(persistence_id))
self.__disksync["ROOT"] = persistence_id.encode("UTF-8") self.__disksync["ROOT"] = persistence_id.encode("UTF-8")
#self.__packages.hcore.module().core.init(self)
def _shutdown(self): def _shutdown(self):
self.__http.shutdown() self.__http.shutdown()
@ -162,7 +164,16 @@ class HServer:
self.__http.hserver = self self.__http.hserver = self
self.__http.serve_forever() 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): def handle(self,request):
log("Hserver.handle(%s)" % (request,)) log("Hserver.handle(%s)" % (request,))
@ -173,10 +184,10 @@ class HServer:
root( request ) root( request )
else: else:
root.walk( request ) root.walk( request )
self.__broker.save( self.__root ) if not self.__broker is None:
self.__broker.save( self.__root )

View File

@ -67,6 +67,14 @@ class TemplateModule:
raise IndexError("%s not found in %s" % (name,self)) 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): def provide(self,name):
s = name.split("/") s = name.split("/")
if len(s) > 1: if len(s) > 1: