Skip to content

Commit 0f35ff4

Browse files
committed
chore: merge x-upstream-time into server-timing header
1 parent 06b51cb commit 0f35ff4

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

src/stac_auth_proxy/handlers/reverse_proxy.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from starlette.datastructures import MutableHeaders
1010
from starlette.responses import Response
1111

12+
from stac_auth_proxy.utils.requests import build_server_timing_header
13+
1214
logger = logging.getLogger(__name__)
1315

1416

@@ -86,11 +88,15 @@ async def proxy_request(self, request: Request) -> Response:
8688
start_time = time.perf_counter()
8789
rp_resp = await self.client.send(rp_req, stream=True)
8890
proxy_time = time.perf_counter() - start_time
89-
91+
rp_resp.headers["Server-Timing"] = build_server_timing_header(
92+
rp_resp.headers.get("Server-Timing"),
93+
name="upstream",
94+
dur=proxy_time,
95+
desc="Upstream processing time",
96+
)
9097
logger.debug(
9198
f"Received response status {rp_resp.status_code!r} from {rp_req.url} in {proxy_time:.3f}s"
9299
)
93-
rp_resp.headers["X-Upstream-Time"] = f"{proxy_time:.3f}"
94100

95101
# We read the content here to make use of HTTPX's decompression, ensuring we have
96102
# non-compressed content for the middleware to work with.

src/stac_auth_proxy/middleware/AddProcessTimeHeaderMiddleware.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from fastapi import Request, Response
66
from starlette.middleware.base import BaseHTTPMiddleware
77

8+
from stac_auth_proxy.utils.requests import build_server_timing_header
9+
810

911
class AddProcessTimeHeaderMiddleware(BaseHTTPMiddleware):
1012
"""Middleware to add Server-Timing header with proxy processing time."""
@@ -16,16 +18,11 @@ async def dispatch(self, request: Request, call_next) -> Response:
1618
process_time = time.perf_counter() - start_time
1719

1820
# Add Server-Timing header with proxy processing time
19-
# Format: Server-Timing: proxy;dur=123.456
20-
server_timing_value = f"proxy;dur={process_time:.3f}"
21-
22-
# If there's already a Server-Timing header, append to it
23-
existing_timing = response.headers.get("Server-Timing")
24-
if existing_timing:
25-
response.headers["Server-Timing"] = (
26-
f"{existing_timing}, {server_timing_value}"
27-
)
28-
else:
29-
response.headers["Server-Timing"] = server_timing_value
21+
response.headers["Server-Timing"] = build_server_timing_header(
22+
response.headers.get("Server-Timing"),
23+
name="proxy",
24+
dur=process_time,
25+
desc="Proxy processing time",
26+
)
3027

3128
return response

src/stac_auth_proxy/utils/requests.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import json
44
import re
55
from dataclasses import dataclass, field
6-
from typing import Sequence
6+
from typing import Optional, Sequence
77
from urllib.parse import urlparse
88

99
from ..config import EndpointMethods
@@ -80,3 +80,13 @@ class MatchResult:
8080

8181
is_private: bool
8282
required_scopes: Sequence[str] = field(default_factory=list)
83+
84+
85+
def build_server_timing_header(
86+
current_value: Optional[str] = None, *, name: str, desc: str, dur: float
87+
):
88+
"""Append a timing header to headers."""
89+
metric = f'{name};desc="{desc}";dur={dur:.3f}'
90+
if current_value:
91+
return f"{current_value}, {metric}"
92+
return metric

0 commit comments

Comments
 (0)