Skip to content

Commit 39c8c19

Browse files
authored
fix: s3session manager bug (#1915)
1 parent fca208b commit 39c8c19

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

src/strands/session/s3_session_manager.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,10 @@ def _get_session_path(self, session_id: str) -> str:
9595
ValueError: If session id contains a path separator.
9696
"""
9797
session_id = _identifier.validate(session_id, _identifier.Identifier.SESSION)
98-
return f"{self.prefix}/{SESSION_PREFIX}{session_id}/"
98+
prefix = self.prefix.strip("/")
99+
if prefix:
100+
return f"{prefix}/{SESSION_PREFIX}{session_id}/"
101+
return f"{SESSION_PREFIX}{session_id}/"
99102

100103
def _get_agent_path(self, session_id: str, agent_id: str) -> str:
101104
"""Get agent S3 prefix.

tests/strands/session/test_s3_session_manager.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,17 @@ def test_init_s3_session_manager_with_existing_user_agent(mocked_aws, s3_bucket)
8989
assert "strands-agents" in session_manager.client.meta.config.user_agent_extra
9090

9191

92+
def test_empty_prefix_session_roundtrip(mocked_aws, s3_bucket, sample_session, sample_agent):
93+
"""Test that session data can be written and read back with default empty prefix."""
94+
manager = S3SessionManager(session_id="test", bucket=s3_bucket, prefix="", region_name="us-west-2")
95+
manager.create_session(sample_session)
96+
manager.create_agent(sample_session.session_id, sample_agent)
97+
98+
result = manager.read_agent(sample_session.session_id, sample_agent.agent_id)
99+
assert result is not None
100+
assert result.agent_id == sample_agent.agent_id
101+
102+
92103
def test_create_session(s3_manager, sample_session):
93104
"""Test creating a session in S3."""
94105
result = s3_manager.create_session(sample_session)
@@ -369,6 +380,24 @@ def test_update_nonexistent_message(s3_manager, sample_session, sample_agent, sa
369380
s3_manager.update_message(sample_session.session_id, sample_agent.agent_id, sample_message)
370381

371382

383+
@pytest.mark.parametrize(
384+
"prefix, expected_path",
385+
[
386+
("", "session_test-id/"),
387+
("sessions", "sessions/session_test-id/"),
388+
("sessions/", "sessions/session_test-id/"),
389+
("/sessions", "sessions/session_test-id/"),
390+
("/sessions/", "sessions/session_test-id/"),
391+
("a/b/c", "a/b/c/session_test-id/"),
392+
("a/b/c/", "a/b/c/session_test-id/"),
393+
],
394+
)
395+
def test__get_session_path_prefix_normalization(mocked_aws, s3_bucket, prefix, expected_path):
396+
"""Test that _get_session_path normalizes prefix to avoid leading or double slashes."""
397+
manager = S3SessionManager(session_id="test", bucket=s3_bucket, prefix=prefix, region_name="us-west-2")
398+
assert manager._get_session_path("test-id") == expected_path
399+
400+
372401
@pytest.mark.parametrize(
373402
"session_id",
374403
[

0 commit comments

Comments
 (0)