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
*.pyc
._*

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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 )

View File

@ -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: