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
1 change: 1 addition & 0 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,4 @@ jobs:
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
timeout_minutes: "60"
allowed_tools: 'Bash(*),Bash(gh *)'
16 changes: 9 additions & 7 deletions servc/svc/com/http/blob.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
import os
from io import BytesIO
from multiprocessing import Process
from typing import Dict, List, Tuple
from typing import Dict, List, Tuple, Optional

from flask import jsonify, request, send_file
from flask import jsonify, request, send_file, Response
from werkzeug.utils import secure_filename

from servc.svc import Middleware
Expand All @@ -19,7 +19,7 @@
from servc.util import findType


def returnError(message: str, error: StatusCode = StatusCode.METHOD_NOT_FOUND):
def returnError(message: str, error: StatusCode = StatusCode.METHOD_NOT_FOUND) -> Response:
return jsonify(getErrorArtifact("", message, error))


Expand Down Expand Up @@ -48,14 +48,16 @@ def __init__(
def get_upload_file_path(self, extra_params: Dict, fname: str) -> Tuple[str, str]:
return self._uploadcontainer, secure_filename(fname)

def _postMessage(self, extra_params: Dict | None = None):
def _postMessage(self, extra_params: Optional[Dict] = None):
Copy link

Copilot AI Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Dict type annotation is incomplete. It should specify the key and value types, e.g., Optional[Dict[str, Any]] or Optional[Dict[Any, Any]] for better type safety.

Suggested change
def _postMessage(self, extra_params: Optional[Dict] = None):
def _postMessage(self, extra_params: Optional[Dict[str, Any]] = None):

Copilot uses AI. Check for mistakes.
if request.method == "POST" and len(list(request.files)) > 0:
if extra_params is None:
extra_params = {}
extra_params["files"] = []

for filekey in list(request.files):
file = request.files[filekey]
if file.filename is None:
Copy link

Copilot AI Jul 31, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider also checking if file.filename is an empty string, as secure_filename('') could still cause issues. The check should be if not file.filename: to handle both None and empty string cases.

Suggested change
if file.filename is None:
if not file.filename:

Copilot uses AI. Check for mistakes.
continue
container, remote_filename = self.get_upload_file_path(
extra_params, file.filename
)
Expand All @@ -68,14 +70,14 @@ def _postMessage(self, extra_params: Dict | None = None):

return super()._postMessage(extra_params)

def _getFile(self, id: str):
def _getFile(self, id: str) -> Response:
try:
response = self._cache.getKey(id)
except json.JSONDecodeError:
return returnError("Bad Response", StatusCode.INVALID_INPUTS)

if isinstance(response, dict):
art: ResponseArtifact = response # type: ignore
art: ResponseArtifact = response # type: ignore
if "file" in art["responseBody"]:
data = self._blobStorage.get_file(
art["responseBody"].get("container", self._uploadcontainer),
Expand All @@ -94,7 +96,7 @@ def _getFile(self, id: str):
)
return returnError("File not found", StatusCode.INVALID_INPUTS)

def bindRoutes(self):
def bindRoutes(self) -> None:
super().bindRoutes()
self._server.add_url_rule(
"/fid/<id>", "_getFile", self._getFile, methods=["GET"]
Expand Down
Loading