123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- # coding: utf-8
- u"""
- GIS failu web serveris
- """
- prog = "web-server"
- version="%(prog)s v0.1"
- epilog = "(c)Ivars 2017"
-
- import sys, os, os.path, argparse
- import re,cgi, urllib, json
- import datetime,time
-
- from zope.interface import implements
- from twisted.internet import reactor,defer, threads, task
- from twisted.web import server, resource, http, error, util
- from twisted.python import log,logfile
- from twisted.web import static
-
- xset = lambda x,y: x if x else y
-
- options = []
-
- class ResponseFile(static.File):
-
- def __init__(self, path):
- static.File.__init__(self, path)
-
- def render_GET(self, request):
- #request.setHeader('Content-Disposition', ['attachment ; filename="tick_db_export.csv"'])
- return static.File.render_GET(self, request)
-
- def parse_arguments(argv):
- "Parse command line arguments"
- parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter, description =__doc__,epilog=epilog, version=version, prog=prog)
- parser.add_argument("-p", "--port", type=int, help="web server port")
- parser.add_argument("--debug", action="store_true", dest="debug", default=False, help="print debug info")
- return parser.parse_args(argv), parser
-
- #import config # get parameters from ini file
- def main(argv):
-
- # get global parameters from command line arguments and ini file
- global options
- options,parser = parse_arguments(argv[1:])
-
- #log.startLogging(logfile.DailyLogFile.fromFullPath("logs\\gis-faili.log"))
- log.startLogging(sys.stdout)
-
- # root = MyFile(base) # no directory browsing
- #root = Root()
- #root = static.File("/")
- #root = ResponseFile(".")
- root = urlproxy.URLProxy()
-
- # Start web server
- reactor.listenTCP(8000, server.Site(root))
- reactor.run()
-
-
- class ResourceThread(resource.Resource):
- "Resource subclass, which renders request in thread. Redefine 'process' "
- def render_GET(self, request):
- d = threads.deferToThread(self.process,request)
- d.addCallback(self._cb,request)
- d.addErrback(self._eb,request)
- request.notifyFinish().addErrback(self._connection_lost, d)
- return server.NOT_DONE_YET
-
- def render_POST(self, request):
- d = threads.deferToThread(self.process,request)
- d.addCallback(self._cb,request)
- d.addErrback(self._eb,request)
- request.notifyFinish().addErrback(self._connection_lost, d)
- return server.NOT_DONE_YET
-
- def _cb(self, result, request):
- "Callback function"
- request.write(result)
- request.finish()
-
- def _eb(self, failure, request):
- "Errorback function"
- #err = failure.trap(defer.CancelledError)
- if failure == defer.CancelledError:
- log.msg("Connection canceled")
- return None
- else:
- #log.err(failure)
- failure.printTraceback()
- body = resource.ErrorPage(http.INTERNAL_SERVER_ERROR,
- "Internal errror, see log file for details","").render(request)
- request.write(body)
- request.finish()
-
- def _connection_lost(self,err,d):
- d.cancel()
-
- def process(self,request):
- "Process request. Shoud be redefined"
- return "No process method defined"
-
- def get_req(self,request,exclude=[]):
- "Return request parameters as Rec() object in utf8, add user. Exclude parameters listed in exclude"
- req = Rec()
- for k,v in request.args.iteritems():
- if k in exclude:
- continue
- req[k] = ",".join(v)
- req[k] = req[k].decode("utf8")
- req.user = request.getUser()
- return req
-
-
- ######### http commands handlers ####################
- class Root(ResourceThread):
- "Server root"
- isLeaf = True
-
- def process(self,request):
- "Apstrada pieprasijumu"
- req = self.get_req(request)
- request.responseHeaders.setRawHeaders("Content-type",['text/html; charset=utf-8'])
- html = u"Response text".encode("utf8")
- return html
- #self.file = static.File("./aaa.mp4")
- #request.uri = "/aaa.mp4"
- #return self.file.render_GET(request)
-
-
- import UserDict
- class Rec(UserDict.DictMixin):
- "Dict like class allowing a.x instead of a['x']"
- def __init__(self, dict=None, **kwargs):
- self.__dict__ = {}
- if dict is not None:
- self.update(dict)
- if len(kwargs):
- self.update(kwargs)
- def __setitem__(self, name, value): setattr(self, name, value)
- def __getitem__(self, name): return getattr(self,name,None)
- def __getattr__(self,key): return None
- def has_key(self,key): return True if self.__dict__.has_key(key) else False
- def keys(self): return list(self.__dict__)
-
- if __name__ == "__main__":
- sys.exit(main(sys.argv))
|