Skip to content

Commit f64c2c5

Browse files
committed
feat: gzip compression to web request and response
1 parent 8ad3695 commit f64c2c5

File tree

6 files changed

+70
-5
lines changed

6 files changed

+70
-5
lines changed

.github/workflows/dev.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,6 @@ jobs:
4343
- name: Echo Endpoint URL
4444
run: echo $(cat endpoint)
4545
- name: Test Lambda functions
46-
run: "curl -X POST -H 'Content-Type: application/json' -d @text.json $(cat endpoint)v1/embeddings"
46+
run: |
47+
"curl -X POST -H 'Content-Type: application/json' -d @text.json $(cat endpoint)v1/embeddings"
48+
"./test.sh $(cat endpoint)v1/embeddings"

open/text/embeddings/server/app.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import os
1111
import torch
1212

13+
from open.text.embeddings.server.gzip import GZipRequestMiddleware
14+
from fastapi.middleware.gzip import GZipMiddleware
1315
router = APIRouter()
1416

1517
DEFAULT_MODEL_NAME = "intfloat/e5-large-v2"
@@ -23,7 +25,7 @@ def create_app():
2325
initialize_embeddings()
2426
app = FastAPI(
2527
title="Open Text Embeddings API",
26-
version="1.0.0",
28+
version="1.0.2",
2729
)
2830
app.add_middleware(
2931
CORSMiddleware,
@@ -32,6 +34,12 @@ def create_app():
3234
allow_methods=["*"],
3335
allow_headers=["*"],
3436
)
37+
38+
app.add_middleware(GZipRequestMiddleware)
39+
40+
# handling gzip response only
41+
app.add_middleware(GZipMiddleware, minimum_size=1000)
42+
3543
app.include_router(router)
3644

3745
return app
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# Created by ChatGPT (GPT-3.5)
2+
# REF: https://chat.openai.com/share/4ab741e7-8059-4be1-b3da-46b8e78d98cc
3+
# REF: https://gealber.com/gzip-middleware-fastapi
4+
import gzip
5+
import json
6+
from starlette.types import Message
7+
from starlette.requests import Request
8+
from starlette.responses import JSONResponse
9+
from starlette.middleware.base import BaseHTTPMiddleware
10+
11+
12+
class GZipRequestMiddleware(BaseHTTPMiddleware):
13+
async def set_body(self, request: Request):
14+
receive_ = await request._receive()
15+
content_encoding = request.headers.get('Content-Encoding', '').lower()
16+
print("content_encoding", content_encoding)
17+
if 'gzip' in content_encoding:
18+
print("receive_", receive_)
19+
20+
try:
21+
content_length = int(
22+
request.headers.get('Content-Length', '0'))
23+
body = receive_.get('body')
24+
if len(body) != content_length:
25+
return JSONResponse(
26+
content={"error": "Invalid Content-Length header"},
27+
status_code=400,
28+
)
29+
json_byte_string = gzip.decompress(body)
30+
# json_string = json_byte_string.decode('utf-8')
31+
# json_object = json.dumps(json_string)
32+
receive_['body'] = json_byte_string
33+
print("content_length", content_length)
34+
print("body", body)
35+
print("receive_['body']", receive_['body'])
36+
except ValueError:
37+
return JSONResponse(
38+
content={"error": "Invalid Content-Length header"},
39+
status_code=400,
40+
)
41+
except Exception as e:
42+
print(e)
43+
return JSONResponse(
44+
content={"error": "Failed to decompress gzip content"},
45+
status_code=400,
46+
)
47+
48+
async def receive() -> Message:
49+
return receive_
50+
51+
request._receive = receive
52+
53+
async def dispatch(self, request, call_next):
54+
await self.set_body(request)
55+
response = await call_next(request)
56+
return response

server-requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
fastapi
2-
sse-starlette
32
mangum
43
sentence_transformers
54
langchain

setup.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
description="Open Source Text Embedding Models with OpenAI API-Compatible Endpoint",
1212
long_description=long_description,
1313
long_description_content_type="text/markdown",
14-
version="1.0.1",
14+
version="1.0.2",
1515
author="Lim Chee Kin",
1616
author_email="limcheekin@vobject.com",
1717
license="MIT",
@@ -23,7 +23,6 @@
2323
"server": ["uvicorn>=0.22.0",
2424
"fastapi>=0.100.0",
2525
"pydantic-settings>=2.0.1",
26-
"sse-starlette>=1.6.1",
2726
"sentence_transformers>=2.2.2",
2827
],
2928
},

test.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
gzip -c text.json | curl -H "Content-Encoding: gzip" -H "Content-Type: application/json" -X POST --data-binary @- $1

0 commit comments

Comments
 (0)