mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 04:01:32 -06:00
WebHost: fix missing timezone in tracker if-modified-since handling (#4125)
* WebHost: fix missing timezone in tracker if-modified-since handling and add a test for it * WebHost, Test: fix running test_tracker in parallel
This commit is contained in:
@@ -5,7 +5,7 @@ from typing import Any, Callable, Dict, List, Optional, Set, Tuple, NamedTuple,
|
||||
from uuid import UUID
|
||||
from email.utils import parsedate_to_datetime
|
||||
|
||||
from flask import render_template, make_response, Response, request
|
||||
from flask import make_response, render_template, request, Request, Response
|
||||
from werkzeug.exceptions import abort
|
||||
|
||||
from MultiServer import Context, get_saving_second
|
||||
@@ -298,17 +298,25 @@ class TrackerData:
|
||||
return self._multidata.get("spheres", [])
|
||||
|
||||
|
||||
def _process_if_request_valid(incoming_request, room: Optional[Room]) -> Optional[Response]:
|
||||
def _process_if_request_valid(incoming_request: Request, room: Optional[Room]) -> Optional[Response]:
|
||||
if not room:
|
||||
abort(404)
|
||||
|
||||
if_modified = incoming_request.headers.get("If-Modified-Since", None)
|
||||
if if_modified:
|
||||
if_modified = parsedate_to_datetime(if_modified)
|
||||
if_modified_str: Optional[str] = incoming_request.headers.get("If-Modified-Since", None)
|
||||
if if_modified_str:
|
||||
if_modified = parsedate_to_datetime(if_modified_str)
|
||||
if if_modified.tzinfo is None:
|
||||
abort(400) # standard requires "GMT" timezone
|
||||
# database may use datetime.utcnow(), which is timezone-naive. convert to timezone-aware.
|
||||
last_activity = room.last_activity
|
||||
if last_activity.tzinfo is None:
|
||||
last_activity = room.last_activity.replace(tzinfo=datetime.timezone.utc)
|
||||
# if_modified has less precision than last_activity, so we bring them to same precision
|
||||
if if_modified >= room.last_activity.replace(microsecond=0):
|
||||
if if_modified >= last_activity.replace(microsecond=0):
|
||||
return make_response("", 304)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
@app.route("/tracker/<suuid:tracker>/<int:tracked_team>/<int:tracked_player>")
|
||||
def get_player_tracker(tracker: UUID, tracked_team: int, tracked_player: int, generic: bool = False) -> Response:
|
||||
|
Reference in New Issue
Block a user