Some cleanup of ajax webclient fallback

This commit is contained in:
Griatch 2019-06-16 16:39:26 +02:00
parent 67ef17b3c9
commit c95a3ec2d2
2 changed files with 46 additions and 19 deletions

View file

@ -108,6 +108,18 @@ class AjaxWebClient(resource.Resource):
self.keep_alive.stop() self.keep_alive.stop()
self.keep_alive = None self.keep_alive = None
def get_client_sessid(self, request):
"""
Helper to get the client session id out of the request.
Args:
request (Request): Incoming request object.
Returns:
csessid (int): The client-session id.
"""
return html.escape(request.args[b'csessid'][0].decode("utf-8"))
def at_login(self): def at_login(self):
""" """
Called when this session gets authenticated by the server. Called when this session gets authenticated by the server.
@ -159,7 +171,7 @@ class AjaxWebClient(resource.Resource):
request (Request): Incoming request. request (Request): Incoming request.
""" """
csessid = html.escape(request.args[b'csessid'][0].decode("utf-8")) csessid = self.get_client_sessid(request)
remote_addr = request.getClientIP() remote_addr = request.getClientIP()
host_string = "%s (%s:%s)" % (_SERVERNAME, host_string = "%s (%s:%s)" % (_SERVERNAME,
@ -178,22 +190,25 @@ class AjaxWebClient(resource.Resource):
sess.uid = uid sess.uid = uid
sess.logged_in = True sess.logged_in = True
sess.sessionhandler.connect(sess) # watch for dead links
self.last_alive[csessid] = (time.time(), False) self.last_alive[csessid] = (time.time(), False)
if not self.keep_alive: if not self.keep_alive:
# the keepalive is not running; start it. # the keepalive is not running; start it.
self.keep_alive = LoopingCall(self._keepalive) self.keep_alive = LoopingCall(self._keepalive)
self.keep_alive.start(_KEEPALIVE, now=False) self.keep_alive.start(_KEEPALIVE, now=False)
# actually do the connection
sess.sessionhandler.connect(sess)
return jsonify({'msg': host_string, 'csessid': csessid}) return jsonify({'msg': host_string, 'csessid': csessid})
def mode_keepalive(self, request): def mode_keepalive(self, request):
""" """
This is called by render_POST when the This is called by render_POST when the
client is replying to the keepalive. client is replying to the keepalive.
""" """
csessid = html.escape(request.args[b'csessid'][0].decode("utf-8")) csessid = self.get_client_sessid(request)
self.last_alive[csessid] = (time.time(), False) self.last_alive[csessid] = (time.time(), False)
return b'""' return b'""'
@ -206,13 +221,11 @@ class AjaxWebClient(resource.Resource):
request (Request): Incoming request. request (Request): Incoming request.
""" """
csessid = html.escape(request.args[b'csessid'][0].decode("utf-8")) csessid = self.get_client_sessid(request)
self.last_alive[csessid] = (time.time(), False) self.last_alive[csessid] = (time.time(), False)
sess = self.sessionhandler.sessions_from_csessid(csessid)
if sess:
sess = sess[0]
cmdarray = json.loads(request.args.get(b'data')[0]) cmdarray = json.loads(request.args.get(b'data')[0])
sess.sessionhandler.data_in(sess, **{cmdarray[0]: [cmdarray[1], cmdarray[2]]}) for sess in self.sessionhandler.sessions_from_csessid(csessid):
sess.data_in(**{cmdarray[0]: [cmdarray[1], cmdarray[2]]})
return b'""' return b'""'
def mode_receive(self, request): def mode_receive(self, request):
@ -229,9 +242,14 @@ class AjaxWebClient(resource.Resource):
csessid = html.escape(request.args[b'csessid'][0].decode("utf-8")) csessid = html.escape(request.args[b'csessid'][0].decode("utf-8"))
self.last_alive[csessid] = (time.time(), False) self.last_alive[csessid] = (time.time(), False)
dataentries = self.databuffer.get(csessid, []) dataentries = self.databuffer.get(csessid)
if dataentries: if dataentries:
# we have data that could not be sent earlier (because client was not
# ready to receive it). Return this buffered data immediately
return dataentries.pop(0) return dataentries.pop(0)
else:
# we have no data to send. End the old request and start
# a new long-polling one
request.notifyFinish().addErrback(self._responseFailed, csessid, request) request.notifyFinish().addErrback(self._responseFailed, csessid, request)
if csessid in self.requests: if csessid in self.requests:
self.requests[csessid].finish() # Clear any stale request. self.requests[csessid].finish() # Clear any stale request.
@ -247,7 +265,7 @@ class AjaxWebClient(resource.Resource):
request (Request): Incoming request. request (Request): Incoming request.
""" """
csessid = html.escape(request.args[b'csessid'][0].decode("utf-8")) csessid = self.get_client_sessid(request)
try: try:
sess = self.sessionhandler.sessions_from_csessid(csessid)[0] sess = self.sessionhandler.sessions_from_csessid(csessid)[0]
sess.sessionhandler.disconnect(sess) sess.sessionhandler.disconnect(sess)
@ -339,6 +357,16 @@ class AjaxWebClientSession(session.Session):
csession["webclient_authenticated_uid"] = self.uid csession["webclient_authenticated_uid"] = self.uid
csession.save() csession.save()
def data_in(self, **kwargs):
"""
Data User -> Evennia
Kwargs:
kwargs (any): Incoming data.
"""
self.sessionhandler.data_in(self, **kwargs)
def data_out(self, **kwargs): def data_out(self, **kwargs):
""" """
Data Evennia -> User Data Evennia -> User
@ -415,5 +443,4 @@ class AjaxWebClientSession(session.Session):
""" """
if not cmdname == "options": if not cmdname == "options":
# print "ajax.send_default", cmdname, args, kwargs
self.client.lineSend(self.csessid, [cmdname, args, kwargs]) self.client.lineSend(self.csessid, [cmdname, args, kwargs])

View file

@ -329,7 +329,7 @@ An "emitter" object must have a function
// Send Client -> Evennia. Called by Evennia.msg // Send Client -> Evennia. Called by Evennia.msg
var msg = function(data, inmode) { var msg = function(data, inmode) {
log("ajax.msg:", data, JSON.stringify(data)); // log("ajax.msg:", data, JSON.stringify(data));
$.ajax({type: "POST", url: "/webclientdata", $.ajax({type: "POST", url: "/webclientdata",
async: true, cache: false, timeout: 30000, async: true, cache: false, timeout: 30000,
dataType: "json", dataType: "json",