BUG: AzureBlobStorageTarget returns a URL with // when the container URL ends with a slash

Fermée Adaptée aux débutants
#3,495 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

@ShivamSharma43 y travaille déjà.

Depuis le 26/10/2026.

  • #3497 par @ShivamSharma43 — fusionnée

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
82/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
azure, python
Domaine
backend, cloud

Piste de recherche

Lisez AzureBlobStorageTarget._send_prompt_to_target_async et _parse_url, que l’issue identifie comme les points de construction de l’URL et d’analyse du téléversement. Reproduisez le problème avec les cas fournis pour une URL de conteneur se terminant par / et une URL avec un préfixe de dossier. Le travail est terminé lorsque les noms des blobs téléversés et les URL renvoyées correspondent aux résultats attendus, sans double barre oblique.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Describe the bug

AzureBlobStorageTarget._send_prompt_to_target_async builds the returned URL by appending to the configured container URL:

blob_url = self._container_url + "/" + file_name

When container_url (or AZURE_STORAGE_ACCOUNT_CONTAINER_URL) ends with /, for example https://acct.blob.core.windows.net/xpia/, the URL gets // before the file name. The upload goes through _parse_url, which ignores the empty segment, so the blob is uploaded as doc.txt. The returned URL .../xpia//doc.txt names a blob /doc.txt, which does not exist, so anything that uses the returned URL (for example the XPIA workflows) points at a missing blob.

With a folder prefix and a trailing slash (.../xpia/folder/), _parse_url returns the prefix folder/, so the blob itself is uploaded as folder//doc.txt instead of folder/doc.txt.

Steps/Code to Reproduce
import asyncio
from unittest.mock import AsyncMock, MagicMock, patch

from pyrit.setup import IN_MEMORY, initialize_pyrit_async


async def main():
    await initialize_pyrit_async(memory_db_type=IN_MEMORY)

    from pyrit.models import Message, MessagePiece
    from pyrit.prompt_target import AzureBlobStorageTarget

    for container_url in ["https://acct.blob.core.windows.net/xpia/", "https://acct.blob.core.windows.net/xpia/folder/"]:
        target = AzureBlobStorageTarget(container_url=container_url, sas_token="sv=test")
        client = AsyncMock()
        client.get_blob_client = MagicMock(return_value=AsyncMock(exists=AsyncMock(return_value=False)))
        piece = MessagePiece(role="user", original_value="payload", prompt_metadata={"file_name": "doc.txt"})

        with patch("azure.storage.blob.aio.ContainerClient.from_container_url", return_value=client):
            response = await target.send_prompt_async(message=Message(message_pieces=[piece]))

        print("container_url:", container_url)
        print("  uploaded blob:", client.get_blob_client.call_args.kwargs["blob"])
        print("  returned URL :", response[0].get_value())


asyncio.run(main())
Expected Results

The trailing slash makes no difference:

container_url: https://acct.blob.core.windows.net/xpia/
  uploaded blob: doc.txt
  returned URL : https://acct.blob.core.windows.net/xpia/doc.txt
container_url: https://acct.blob.core.windows.net/xpia/folder/
  uploaded blob: folder/doc.txt
  returned URL : https://acct.blob.core.windows.net/xpia/folder/doc.txt
Actual Results

The returned URL does not match the uploaded blob, and the prefixed blob gets an empty path segment:

container_url: https://acct.blob.core.windows.net/xpia/
  uploaded blob: doc.txt
  returned URL : https://acct.blob.core.windows.net/xpia//doc.txt
container_url: https://acct.blob.core.windows.net/xpia/folder/
  uploaded blob: folder//doc.txt
  returned URL : https://acct.blob.core.windows.net/xpia/folder//doc.txt
Screenshots

N/A

Versions
  • OS: Windows 11
  • Python version: 3.11.9
  • PyRIT version: installed from main (eeb9ba9d) in editable mode
Langage dominant
Python
Étoiles
4.7k
Forks
1k
Merge moyen
2 j 3 h
PR mergées (30 j)
465

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

  • Aucun Dockerfile ni fichier Docker Compose
  • Propose un modèle de pull request
  • Aucun guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de microsoft/PyRIT

Toutes les issues de microsoft/PyRIT

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.