Files
addon/mediaserver/HTTPAndWSServer.py
2018-07-17 15:55:32 -05:00

168 lines
5.6 KiB
Python

# -*- coding: utf-8 -*-
import random
import re
import threading
import time
import traceback
from BaseHTTPServer import HTTPServer
from HTTPWebSocketsHandler import HTTPWebSocketsHandler
from platformcode import config, logger
from core import jsontools as json
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(HTTPWebSocketsHandler):
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 sendMessage(self, message):
self.send_message(message)
def do_GET_HTTP(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=\"' + config.get_localized_string(70264) + '\"')
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 on_ws_message(self, message):
try:
if message:
json_message = json.load(message)
if "request" in json_message:
t = threading.Thread(target=run, args=[self.controller, json_message["request"].encode("utf8")], name=self.ID)
t.setDaemon(True)
t.start()
elif "data" in json_message:
if type(json_message["data"]["result"]) == unicode:
json_message["data"]["result"] = json_message["data"]["result"].encode("utf8")
self.controller.data = json_message["data"]
except:
logger.error(traceback.format_exc())
show_error_message(traceback.format_exc())
def on_ws_connected(self):
try:
self.ID = "%032x" % (random.getrandbits(128))
from platformcode.controllers.html import html
self.controller = html(self, self.ID)
self.server.fnc_info()
except:
logger.error(traceback.format_exc())
def on_ws_closed(self):
self.controller.__del__()
del self.controller
self.server.fnc_info()
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 run(controller, path):
try:
controller.run(path)
except:
logger.error(traceback.format_exc())
show_error_message(traceback.format_exc())
def show_error_message(err_info):
from core import scrapertools
patron = 'File "' + os.path.join(config.get_runtime_path(), "channels", "").replace("\\", "\\\\") + '([^.]+)\.py"'
canal = scrapertools.find_single_match(err_info, patron)
if canal:
platformtools.dialog_ok(
"Se ha producido un error en el canal " + canal,
"Esto puede ser devido a varias razones: \n \
- El servidor no está disponible, o no esta respondiendo.\n \
- Cambios en el diseño de la web.\n \
- Etc...\n \
Comprueba el log para ver mas detalles del error.")
else:
platformtools.dialog_ok(
"Se ha producido un error en Alfa",
"Comprueba el log para ver mas detalles del error.")
def start(fnc_info):
server.fnc_info = fnc_info
threading.Thread(target=server.serve_forever).start()
def stop():
server.socket.close()
server.shutdown()