返回提交历史
Modified
g4f/api/__init__.py
+12
-14
Modified
g4f/gui/server/backend_api.py
+1
-1
XFEstudio/gpt4free
Update headers
53657646
代码差异
2 个文件
+13
-15
@@ -14,7 +14,7 @@ import hashlib
14
14
import asyncio
15
15
from contextlib import asynccontextmanager
16
16
from urllib.parse import quote_plus
17
from fastapi import FastAPI, Response, Request, UploadFile, Form, Depends
17
from fastapi import FastAPI, Response, Request, UploadFile, Form, Depends, Header
18
18
from fastapi.responses import StreamingResponse, RedirectResponse, HTMLResponse, JSONResponse, FileResponse
19
19
from fastapi.exceptions import RequestValidationError
20
20
from fastapi.security import APIKeyHeader
@@ -188,10 +188,12 @@ class AppConfig:
188
188
for key, value in data.items():
189
189
setattr(cls, key, value)
190
190
191
def remove_authorization(request: Request) -> Request:
192
new_header = request.headers.mutablecopy()
193
del new_header["authorization"]
194
request.scope["headers"] = new_header.raw
191
def update_headers(request: Request, user: str) -> Request:
192
new_headers = request.headers.mutablecopy()
193
del new_headers["authorization"]
194
if user:
195
new_headers["x-user"] = user
196
request.scope["headers"] = new_headers.raw
195
197
delattr(request, "_headers")
196
198
return request
197
199
@@ -229,14 +231,12 @@ class Api:
229
231
async def authorization(request: Request, call_next):
230
232
user = None
231
233
if AppConfig.g4f_api_key is not None or AppConfig.demo:
232
is_authorization_header = False
233
234
try:
234
235
user_g4f_api_key = await self.get_g4f_api_key(request)
235
236
except HTTPException:
236
237
user_g4f_api_key = await self.security(request)
237
238
if hasattr(user_g4f_api_key, "credentials"):
238
239
user_g4f_api_key = user_g4f_api_key.credentials
239
is_authorization_header = True
240
240
if AppConfig.g4f_api_key is None or not secrets.compare_digest(AppConfig.g4f_api_key, user_g4f_api_key):
241
241
if has_crypto and user_g4f_api_key:
242
242
try:
@@ -269,12 +269,8 @@ class Api:
269
269
user = await self.get_username(request)
270
270
except HTTPException as e:
271
271
return ErrorResponse.from_message(e.detail, e.status_code, e.headers)
272
if is_authorization_header:
273
request = remove_authorization(request)
274
response = await call_next(request)
275
if user is not None:
276
response.headers["x_user"] = user
277
return response
272
request = update_headers(request, user)
273
return await call_next(request)
278
274
279
275
def register_validation_exception_handler(self):
280
276
@self.app.exception_handler(RequestValidationError)
@@ -386,6 +382,7 @@ class Api:
386
382
credentials: Annotated[HTTPAuthorizationCredentials, Depends(Api.security)] = None,
387
383
provider: str = None,
388
384
conversation_id: str = None,
385
x_user: Annotated[str | None, Header()] = None
389
386
):
390
387
try:
391
388
if config.provider is None:
@@ -430,7 +427,8 @@ class Api:
430
427
**config.dict(exclude_none=True),
431
428
**{
432
429
"conversation_id": None,
433
"conversation": conversation
430
"conversation": conversation,
431
"user": x_user,
434
432
}
435
433
},
436
434
ignored=AppConfig.ignored_providers
@@ -188,7 +188,7 @@ class Backend_Api(Api):
188
188
ip = request.headers.get("X-Forwarded-For", "")
189
189
ip = sha256(ip.encode()).hexdigest()[:4] if ip else ""
190
190
user = request.headers.get("Cf-Ipcountry", "")
191
json_data["user"] = request.headers.get("x_user", f"{user}:{ip}")
191
json_data["user"] = request.headers.get("x-user", f"{user}:{ip}")
192
192
json_data["referer"] = request.headers.get("referer", "")
193
193
json_data["user-agent"] = request.headers.get("user-agent", "")
194
194
kwargs = self._prepare_conversation_kwargs(json_data)