Streaming API will keep session alive

This commit is contained in:
Paulus Schoutsen 2015-11-28 22:14:40 -08:00
parent e67732b4f8
commit 733de6b357
2 changed files with 28 additions and 18 deletions

View file

@ -106,6 +106,7 @@ def _handle_get_api_stream(handler, path_match, data):
wfile = handler.wfile
write_lock = threading.Lock()
block = threading.Event()
session_id = None
restrict = data.get('restrict')
if restrict:
@ -119,6 +120,7 @@ def _handle_get_api_stream(handler, path_match, data):
try:
wfile.write(msg.encode("UTF-8"))
wfile.flush()
handler.server.sessions.extend_validation(session_id)
except IOError:
block.set()
@ -138,6 +140,7 @@ def _handle_get_api_stream(handler, path_match, data):
handler.send_response(HTTP_OK)
handler.send_header('Content-type', 'text/event-stream')
session_id = handler.set_session_cookie_header()
handler.end_headers()
hass.bus.listen(MATCH_ALL, forward_events)

View file

@ -337,26 +337,28 @@ class RequestHandler(SimpleHTTPRequestHandler):
def set_cache_header(self):
""" Add cache headers if not in development """
if not self.server.development:
# 1 year in seconds
cache_time = 365 * 86400
if self.server.development:
return
self.send_header(
HTTP_HEADER_CACHE_CONTROL,
"public, max-age={}".format(cache_time))
self.send_header(
HTTP_HEADER_EXPIRES,
self.date_time_string(time.time()+cache_time))
# 1 year in seconds
cache_time = 365 * 86400
self.send_header(
HTTP_HEADER_CACHE_CONTROL,
"public, max-age={}".format(cache_time))
self.send_header(
HTTP_HEADER_EXPIRES,
self.date_time_string(time.time()+cache_time))
def set_session_cookie_header(self):
""" Add the header for the session cookie. """
""" Add the header for the session cookie and return session id. """
if not self.authenticated:
return
current = self.get_cookie_session_id()
session_id = self.get_cookie_session_id()
if current is not None:
self.server.sessions.extend_validation(current)
if session_id is not None:
self.server.sessions.extend_validation(session_id)
return
self.send_header(
@ -364,6 +366,8 @@ class RequestHandler(SimpleHTTPRequestHandler):
'{}={}'.format(SESSION_KEY, self.server.sessions.create())
)
return session_id
def verify_session(self):
""" Verify that we are in a valid session. """
return self.get_cookie_session_id() is not None
@ -387,19 +391,22 @@ class RequestHandler(SimpleHTTPRequestHandler):
if morsel is None:
return None
current = cookie[SESSION_KEY].value
session_id = cookie[SESSION_KEY].value
return current if self.server.sessions.is_valid(current) else None
if self.server.sessions.is_valid(session_id):
return session_id
return None
def destroy_session(self):
""" Destroys session. """
current = self.get_cookie_session_id()
session_id = self.get_cookie_session_id()
if current is None:
if session_id is None:
return
self.send_header('Set-Cookie', '')
self.server.sessions.destroy(current)
self.server.sessions.destroy(session_id)
def session_valid_time():