Files
addon/mediaserver/HTTPServer.py
alfa_addon_10 6318ef0850 - moved elements to compatibility with mediaserver.
- adapted files to mediaserver.
- added mediaserver banner images.
- added mediaserver code.
2017-08-12 23:06:13 +02:00

107 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
import random
import re
import threading
import time
import traceback
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from platformcode import config, logger
class MyHTTPServer(HTTPServer):
daemon_threads = True
def process_request_thread(self, request, client_address):
try:
self.finish_request(request, client_address)
self.shutdown_request(request)
except:
self.handle_error(request, client_address)
self.shutdown_request(request)
def process_request(self, request, client_address):
ID = "%032x" % (random.getrandbits(128))
t = threading.Thread(target=self.process_request_thread,
args=(request, client_address), name=ID)
t.daemon = self.daemon_threads
t.start()
def handle_error(self, request, client_address):
import traceback
if not "socket.py" in traceback.format_exc():
logger.error(traceback.format_exc())
class Handler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
# sys.stderr.write("%s - - [%s] %s\n" %(self.client_address[0], self.log_date_time_string(), format%args))
pass
def do_GET(self):
from platformcode import platformtools
from platformcode import controllers
# Control de accesos
Usuario = "user"
Password = "password"
ControlAcceso = False
import base64
# Comprueba la clave
if ControlAcceso and self.headers.getheader('Authorization') <> "Basic " + base64.b64encode(
Usuario + ":" + Password):
self.send_response(401)
self.send_header('WWW-Authenticate',
'Basic realm=\"Introduce el nombre de usuario y clave para acceder a alfa\"')
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
self.wfile.write('¡Los datos introducidos no son correctos!')
return
data = re.compile('/data/([^/]+)/([^/]+)/([^/]+)', re.DOTALL).findall(self.path)
if data:
data = data[0]
if data[0] in platformtools.requests:
c = platformtools.requests[data[0]]
response = {"id": data[1], "result": data[2]}
print response
c.handler = self
c.set_data(response)
while data[0] in platformtools.requests and not self.wfile.closed:
time.sleep(1)
else:
if self.path == "": self.path = "/"
# Busca el controller para la url
controller = controllers.find_controller(self.path)
if controller:
try:
c = controller(self)
c.run(self.path)
except:
if not "socket.py" in traceback.format_exc():
logger.error(traceback.format_exc())
finally:
c.__del__()
del c
return
def address_string(self):
# Disable reverse name lookups
return self.client_address[:2][0]
PORT = config.get_setting("server.port")
server = MyHTTPServer(('', int(PORT)), Handler)
def start(fnc_info):
server.fnc_info = fnc_info
threading.Thread(target=server.serve_forever).start()
def stop():
server.socket.close()
server.shutdown()