Commit cb161095 authored by ibuler's avatar ibuler

[Update] 准备更改http proxy数据结构

parent 50645630
...@@ -46,28 +46,28 @@ class BaseNamespace(Namespace): ...@@ -46,28 +46,28 @@ class BaseNamespace(Namespace):
def close(self): def close(self):
try: try:
self.clients[request.sid]["client"].close() self.clients[request.sid]["client"].close()
except: except IndexError:
pass pass
class ProxyNamespace(BaseNamespace): class ProxyNamespace(BaseNamespace):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.clients = dict() self.connections = dict()
self.rooms = dict() self.rooms = dict()
def new_client(self): def new_connection(self):
room = str(uuid.uuid4()) room_id = str(uuid.uuid4())
client = { connection = {
"cols": int(request.cookies.get('cols', 80)), "cols": int(request.cookies.get('cols', 80)),
"rows": int(request.cookies.get('rows', 24)), "rows": int(request.cookies.get('rows', 24)),
"room": room, "room": room_id,
"proxy": dict(), "proxy": dict(),
"client": dict(), "client": dict(),
"forwarder": dict(), "forwarder": dict(),
"request": self.make_coco_request() "request": self.make_coco_request()
} }
return client return connection
def make_coco_request(self): def make_coco_request(self):
x_forwarded_for = request.headers.get("X-Forwarded-For", '').split(',') x_forwarded_for = request.headers.get("X-Forwarded-For", '').split(',')
...@@ -98,38 +98,24 @@ class ProxyNamespace(BaseNamespace): ...@@ -98,38 +98,24 @@ class ProxyNamespace(BaseNamespace):
def on_connect(self): def on_connect(self):
logger.debug("On connect event trigger") logger.debug("On connect event trigger")
super().on_connect() super().on_connect()
client = self.new_client() connection = self.new_connection()
self.clients[request.sid] = client self.connections[request.sid] = connection
self.rooms[client['room']] = { self.rooms[connection['room']] = {
"admin": request.sid, "admin": request.sid,
"member": [], "member": [],
"rw": [] "rw": []
} }
join_room(client['room']) join_room(connection['room'])
def on_data(self, message):
"""
收到浏览器请求
:param message: {"data": "xxx", "room": "xxx"}
:return:
"""
room = message.get('room')
if not room:
return
room_proxy = self.clients[request.sid]['proxy'].get(room)
if room_proxy:
room_proxy.send({"data": message['data']})
def on_host(self, message): def on_host(self, message):
# 此处获取主机的信息 # 此处获取主机的信息
logger.debug("On host event trigger") logger.debug("On host event trigger")
connection = str(uuid.uuid4()) room_id = str(uuid.uuid4())
asset_id = message.get('uuid', None) asset_id = message.get('uuid', None)
user_id = message.get('userid', None) user_id = message.get('userid', None)
secret = message.get('secret', None) secret = message.get('secret', None)
self.emit('room', {'room': connection, 'secret': secret}) self.emit('room', {'room': room_id, 'secret': secret})
if not asset_id or not user_id: if not asset_id or not user_id:
# self.on_connect() # self.on_connect()
return return
...@@ -142,24 +128,36 @@ class ProxyNamespace(BaseNamespace): ...@@ -142,24 +128,36 @@ class ProxyNamespace(BaseNamespace):
return return
child, parent = socket.socketpair() child, parent = socket.socketpair()
self.clients[request.sid]["client"][connection] = Client( self.connections[request.sid]["client"][room_id] = Client(
parent, self.clients[request.sid]["request"] parent, self.connections[request.sid]["request"]
) )
self.clients[request.sid]["proxy"][connection] = WSProxy( self.connections[request.sid]["proxy"][room_id] = WSProxy(
self, child, self.clients[request.sid]["room"], connection self, child, self.connections[request.sid]["room"], room_id
) )
self.clients[request.sid]["forwarder"][connection] = ProxyServer( self.connections[request.sid]["forwarder"][room_id] = ProxyServer(
self.app, self.clients[request.sid]["client"][connection] self.app, self.connections[request.sid]["client"][room_id]
) )
self.socketio.start_background_task( self.socketio.start_background_task(
self.clients[request.sid]["forwarder"][connection].proxy, self.connections[request.sid]["forwarder"][room_id].proxy,
asset, system_user asset, system_user
) )
def on_data(self, message):
"""
收到浏览器请求
:param message: {"data": "xxx", "room": "xxx"}
:return:
"""
room = message.get('room')
if not room:
return
room_proxy = self.connections[request.sid]['proxy'].get(room)
if room_proxy:
room_proxy.send({"data": message['data']})
def on_token(self, message): def on_token(self, message):
# 此处获取token含有的主机的信息 # 此处获取token含有的主机的信息
logger.debug("On token trigger") logger.debug("On token trigger")
logger.debug(message)
token = message.get('token', None) token = message.get('token', None)
secret = message.get('secret', None) secret = message.get('secret', None)
connection = str(uuid.uuid4()) connection = str(uuid.uuid4())
...@@ -170,51 +168,50 @@ class ProxyNamespace(BaseNamespace): ...@@ -170,51 +168,50 @@ class ProxyNamespace(BaseNamespace):
self.emit('disconnect') self.emit('disconnect')
return None return None
host = self.app.service.get_token_asset(token) info = self.app.service.get_token_asset(token)
logger.debug(host) logger.debug(info)
if not host: if not info:
logger.debug("host is None") logger.debug("host is None")
self.emit('data', {'data': "\nOperation not permitted!", 'room': connection}) self.emit('data', {'data': "\nOperation not permitted!", 'room': connection})
self.emit('disconnect') self.emit('disconnect')
return None return None
user_id = host.get('user', None) user_id = info.get('user', None)
logger.debug("self.current_user") logger.debug("self.current_user")
self.current_user = self.app.service.get_user_profile(user_id) self.current_user = self.app.service.get_user_profile(user_id)
self.clients[request.sid]["request"].user = self.current_user self.connections[request.sid]["request"].user = self.current_user
logger.debug(self.current_user) logger.debug(self.current_user)
self.on_host({'secret': secret, 'uuid': host['asset'], 'userid': host['system_user']}) self.on_host({'secret': secret, 'uuid': info['asset'], 'userid': info['system_user']})
def on_resize(self, message): def on_resize(self, message):
cols = message.get('cols') cols = message.get('cols')
rows = message.get('rows') rows = message.get('rows')
logger.debug("On resize event trigger: {}*{}".format(cols, rows)) logger.debug("On resize event trigger: {}*{}".format(cols, rows))
if cols and rows and self.clients[request.sid]["request"]: if cols and rows and self.connections[request.sid]["request"]:
self.clients[request.sid]["request"].meta['width'] = cols self.connections[request.sid]["request"].meta['width'] = cols
self.clients[request.sid]["request"].meta['height'] = rows self.connections[request.sid]["request"].meta['height'] = rows
self.clients[request.sid]["request"].change_size_event.set() self.connections[request.sid]["request"].change_size_event.set()
def on_room(self, session_id): # def on_room(self, session_id):
logger.debug("On room event trigger") # logger.debug("On room event trigger")
if session_id not in self.clients.keys(): # if session_id not in self.connections.keys():
self.emit( # self.emit(
'error', "no such session", # 'error', "no such session",
room=self.clients[request.sid]["room"] # room=self.connections[request.sid]["room"]
) # )
else: # else:
self.emit( # self.emit(
'room', self.clients[session_id]["room"], # 'room', self.connections[session_id]["room"],
room=self.clients[request.sid]["room"] # room=self.connections[request.sid]["room"]
) # )
#
def on_join(self, room): # def on_join(self, room):
logger.debug("On join room event trigger") # logger.debug("On join room event trigger")
self.on_leave(self.clients[request.id]["room"]) # self.on_leave(self.connections[request.id]["room"])
self.clients[request.sid]["room"] = room # self.connections[request.sid]["room"] = room
self.rooms[room]["member"].append(request.sid) # self.rooms[room]["member"].append(request.sid)
join_room(room=room) # join_room(room=room)
#
def on_leave(self, room): def on_leave(self, room):
logger.debug("On leave room event trigger") logger.debug("On leave room event trigger")
if self.rooms[room]["admin"] == request.sid: if self.rooms[room]["admin"] == request.sid:
...@@ -224,29 +221,20 @@ class ProxyNamespace(BaseNamespace): ...@@ -224,29 +221,20 @@ class ProxyNamespace(BaseNamespace):
def on_disconnect(self): def on_disconnect(self):
logger.debug("On disconnect event trigger") logger.debug("On disconnect event trigger")
self.on_leave(self.clients[request.sid]["room"]) # self.on_leave(self.clients[request.sid]["room"])
print(self.connections[request.sid]["client"])
try: try:
for connection in self.clients[request.sid]["client"]: for connection in self.connections[request.sid]["client"]:
self.on_logout(connection) self.on_logout(connection)
del self.clients[request.sid] del self.connections[request.sid]
except: except IndexError:
pass pass
def on_logout(self, connection): def on_logout(self, connection):
logger.debug("On logout event trigger") logger.debug("On logout event trigger")
if connection: if connection in self.connections[request.sid]["proxy"].keys():
if connection in self.clients[request.sid]["proxy"].keys(): self.connections[request.sid]["proxy"][connection].close()
self.clients[request.sid]["proxy"][connection].close() del self.connections[request.sid]['proxy'][connection]
del self.clients[request.sid]['proxy'][connection]
def logout(self, connection):
if connection and (request.sid in self.clients.keys()):
if connection in self.clients[request.sid]["proxy"].keys():
del self.clients[request.sid]["proxy"][connection]
if connection in self.clients[request.sid]["forwarder"].keys():
del self.clients[request.sid]["forwarder"][connection]
if connection in self.clients[request.sid]["client"].keys():
del self.clients[request.sid]["client"][connection]
class HttpServer: class HttpServer:
...@@ -256,7 +244,11 @@ class HttpServer: ...@@ -256,7 +244,11 @@ class HttpServer:
'coco': None, 'coco': None,
'LOGIN_URL': '/login' 'LOGIN_URL': '/login'
} }
async_mode = "threading" init_kwargs = dict(
async_mode="threading",
ping_timeout=20,
ping_interval=10
)
def __init__(self, coco): def __init__(self, coco):
config = coco.config config = coco.config
...@@ -273,7 +265,10 @@ class HttpServer: ...@@ -273,7 +265,10 @@ class HttpServer:
def run(self): def run(self):
host = self.flask_app.config["BIND_HOST"] host = self.flask_app.config["BIND_HOST"]
port = self.flask_app.config["HTTPD_PORT"] port = self.flask_app.config["HTTPD_PORT"]
self.socket_io.init_app(self.flask_app, async_mode=self.async_mode) self.socket_io.init_app(
self.flask_app,
**self.init_kwargs
)
self.socket_io.run(self.flask_app, port=port, host=host, debug=False) self.socket_io.run(self.flask_app, port=port, host=host, debug=False)
def shutdown(self): def shutdown(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment