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)