Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions app/server.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import gzip
import json
import logging
import os
import redis
import traceback
import warnings
import zstandard

from fastapi import HTTPException, status, Request
from fastapi.responses import JSONResponse, Response
Expand All @@ -22,10 +22,10 @@

openapi_args = dict(
title="SRI Answer Appraiser",
version="0.7.0",
version="0.8.0",
terms_of_service="",
description="SRI service that provides metrics for scoring and ordering of results",
trapi="1.5.0",
trapi="1.6.0",
biolink_version="4.2.0",
contact={
"name": "Max Wang",
Expand Down Expand Up @@ -155,10 +155,10 @@ async def sync_get_appraisal(request: Request):
logger = get_logger(qid, "INFO")
logger.info("Starting sync appraisal")
compressed = False
if request.headers.get("content-encoding") == "gzip":
if request.headers.get("content-encoding") == "zstd":
try:
raw_body = await request.body()
query = json.loads(gzip.decompress(raw_body))
query = json.loads(zstandard.decompress(raw_body))
compressed = True
except Exception:
return Response("Invalid request. Failed to decompress and ingest.", 400)
Expand All @@ -180,7 +180,7 @@ async def sync_get_appraisal(request: Request):
except Exception:
logger.error(f"Something went wrong while appraising: {traceback.format_exc()}")
if compressed:
query = gzip.compress(json.dumps(query).encode())
query = zstandard.compress(json.dumps(query).encode())
else:
query = json.dumps(query)
logger.info("Done appraising")
Expand Down
2 changes: 1 addition & 1 deletion requirements-lock.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ pydantic==1.10.18
python-dateutil==2.9.0.post0
pytz==2024.2
rdkit==2024.3.5
reasoner-pydantic==5.0.6
redis==5.1.1
scikit-learn==1.5.2
scipy==1.14.1
Expand All @@ -50,3 +49,4 @@ uvicorn==0.31.0
wheel==0.43.0
wrapt==1.16.0
zipp==3.20.2
zstandard==0.23.0
4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ opentelemetry-exporter-jaeger
opentelemetry-instrumentation-httpx
pandas
rdkit
reasoner-pydantic
redis
scipy
scikit-learn
tqdm
uvicorn
uvicorn
zstandard
28 changes: 28 additions & 0 deletions tests/test_server.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import json
import zstandard

from fastapi.testclient import TestClient

from app.server import APP
Expand All @@ -12,3 +15,28 @@ def test_sync_get_appraisal_400():
json={"message": {}},
)
assert response.status_code == 400


def test_zstd_compression():
"""Test that server decompressed zstandard payloads."""
message = {
"message": {
"query_graph": {},
"knowledge_graph": {},
"results": [],
}
}
payload = zstandard.compress(json.dumps(message).encode())
response = testclient.post(
"/get_appraisal",
headers={
"Content-Encoding": "zstd",
"Content-Type": "application/json",
},
data=payload,
)

assert response.status_code == 400
err = response.json()
# we were able to parse the zipped payload and found no results
assert err["description"] == "No Results."
Loading