Prhub

#45263 Fix relative allowed local media paths

原始 PR 作者 ItsMatti4 合并时间 2026-06-26 11:45 文件变更 2 提交数 1 评论 3 代码增减 +18 / -1

执行摘要

修复 MediaConnector 相对路径解析

用户传递相对路径的 allowed_local_media_path 时,路径保持相对形式,而文件 URL 被解析为绝对路径,导致路径比对失败,合法媒体文件被拒绝。

建议合并。改动小且精确,配套测试充分,是典型的高质量小修复。

讨论亮点

审定过程简单,Reviewer 仅给出 “Thanks for fixing” 的批准意见,无深入讨论。

实现拆解

该 PR 仅涉及一行关键改动和对应的测试补充:

  1. 修正路径解析:在 vllm/multimodal/media/connector.pyMediaConnector.__init__ 中,将 Path(allowed_local_media_path) 改为 Path(allowed_local_media_path).resolve(),确保 allowed_local_media_path_ 在后续路径比对前被解析为绝对路径。
  2. 新增回归测试:在 tests/multimodal/media/test_connector.py 中新增异步测试函数 test_fetch_image_local_files_relative_allowed_path,使用 tmp_pathmonkeypatch.chdir 模拟相对路径场景,验证同步和异步 fetch_image 均能正确加载文件。
文件 模块 状态 重要度
vllm/multimodal/media/connector.py 媒体连接器 modified 4.82
tests/multimodal/media/test_connector.py 媒体连接器 modified 5.4

关键符号

MediaConnector.__init__ test_fetch_image_local_files_relative_allowed_path

关键源码片段

vllm/multimodal/media/connector.py core-logic

核心修复所在文件,仅一行修改,但解决了关键路径比对问题。

# vllm/multimodal/media/connector.py (head)
def __init__(
    self,
    media_io_kwargs: dict[str, dict[str, Any]] | None = None,
    connection: HTTPConnection = global_http_connection,
    *,
    allowed_local_media_path: str = "",
    allowed_media_domains: list[str] | None = None,
) -> None:
    # ... 省略无关代码 ...
    if allowed_local_media_path:
        # 关键修复:使用 .resolve() 将用户指定的相对路径转为绝对路径
        # 这样才能与后面从 file:// URL 解析出的绝对路径正确比对
        allowed_local_media_path_ = Path(allowed_local_media_path).resolve()
​
        if not allowed_local_media_path_.exists():
            raise ValueError(
                "Invalid `--allowed-local-media-path`: The path "
                f"{allowed_local_media_path_} does not exist."
            )
        if not allowed_local_media_path_.is_dir():
            raise ValueError(
                "Invalid `--allowed-local-media-path`: The path "
                f"{allowed_local_media_path_} must be a directory."
            )
    else:
        allowed_local_media_path_ = None
​
    self.allowed_local_media_path = allowed_local_media_path_
    # ...
tests/multimodal/media/test_connector.py test-coverage

新增回归测试,覆盖相对路径场景,确保修复正确性。

# tests/multimodal/media/test_connector.py (head)
@pytest.mark.asyncio
async def test_fetch_image_local_files_relative_allowed_path(tmp_path, monkeypatch):
    """Regression test: ensure relative allowed_local_media_path works."""
    media_dir = tmp_path / "media"
    media_dir.mkdir()
    # 创建一个 1x1 的测试图片
    image_path = media_dir / "image.png"
    Image.new("RGB", (1, 1), color=(255, 0, 0)).save(image_path)
​
    # 将当前工作目录切换到 tmp_path,使得相对路径 "media" 有效
    monkeypatch.chdir(tmp_path)
    # 使用相对路径初始化 MediaConnector
    local_connector = MediaConnector(allowed_local_media_path="media")
​
    # 验证同步和异步 fetch_image 都能正确加载图片
    image_sync = local_connector.fetch_image(image_path.as_uri())
    image_async = await local_connector.fetch_image_async(image_path.as_uri())
​
    assert image_sync.size == (1, 1)
    # 验证两张图片内容一致
    assert not ImageChops.difference(image_sync, image_async).getbbox()

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险极低。改动仅一行,且已有测试覆盖正向用例和边界情况。.resolve() 在 Python 3.6+ 中为稳定行为,不会引入回归。

影响范围限于使用相对路径设置 allowed_local_media_path 的用户,此前功能异常,修复后恢复正常。不改变 API 或行为语义,不影响其他功能。

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论