Source code for core.service.rest
# core/service/http.py
#
#
""" CORE INTERFACE. """
__copyright__ = "Copyright 2015, B.H.J Thate"
## IMPORTS
from core.utils.trace import get_exception
from core.kernel import kernel, cfg
from core.cfg import cfg_show
from core.thing import Thing
from core import __version__
import logging
import time
from http.server import HTTPServer, BaseHTTPRequestHandler
## DEFINES
port = 10102
server = None
## APIServer class
[docs]class REST(HTTPServer, Thing):
""" Tonen server """
allow_reuse_address = True
daemon_thread = True
def __init__(zelf, *args, **kwargs):
""" start the HTTP server. """
HTTPServer.__init__(zelf, *args, **kwargs)
Thing.__init__(zelf)
zelf.host = args[0]
zelf._status = "start"
zelf._last = time.time()
zelf._start = time.time()
[docs] def exit(zelf):
""" shutdown Tonen. """
logging.warn("# ending HTTP.")
zelf._status = ""
time.sleep(0.2)
zelf.shutdown()
[docs] def start(zelf, *args, **kwargs):
""" serving requests. """
logging.warn("# start http://%s:%s" % zelf.host)
zelf._status = "starting"
zelf.ready()
zelf.serve_forever()
[docs] def request(zelf):
zelf._last = time.time()
[docs] def error(zelf, request, addr):
""" log the error """
ex = get_exception()
logging.warn('# %s - %s' % (addr, ex))
## RestReqeustHandler class
[docs]class RESTHandler(BaseHTTPRequestHandler):
""" timeserver request handler class """
[docs] def setup(zelf):
""" called on each incoming request. """
BaseHTTPRequestHandler.setup(zelf)
zelf._ip = zelf.client_address[0]
zelf._size = 0
[docs] def write_header(zelf, type='text/plain'):
""" write headers to the client. """
zelf.send_response(200)
zelf.send_header('Content-type', '%s; charset=%s ' % (type, "utf-8"))
zelf.send_header('Server', __version__)
zelf.end_headers()
[docs] def do_GET(zelf, *args):
""" handle a REST request. """
root = kernel.get_root()
fn = kernel.filename(zelf.path)
try: f = open(fn, "r") ; txt = f.read() ; f.close()
except TypeError: zelf.send_response(404) ; zelf.end_headers() ; return
txt = txt.replace("\\n", "\n")
txt = txt.replace("\\t", "\t")
zelf.write_header()
zelf.wfile.write(bytes(txt, "utf-8"))
zelf.wfile.flush()
[docs] def log(zelf, code):
""" log the request """
try: ua = zelf.headers['user-agent']
except: ua = "-"
try: rf = zelf.headers['referer']
except: rf = "-"
logging.warn('# %s %s %s' % (zelf.address_string(), code, zelf.path))
[docs]def init(*args, **kwargs):
""" initialize the HTTP server. """
server = REST((cfg_show.hostname, int(cfg.port or cfg_show.port)), RESTHandler)
kernel.put(server.start)