WIP
parent
9af5bd2229
commit
6df4f4c624
|
@ -1,2 +1,3 @@
|
|||
.DS_Store
|
||||
*.pyc
|
||||
._*
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
|||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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 )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue