Skip to content
Draft
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
16 changes: 15 additions & 1 deletion src/asap/server.c
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,25 @@ static int fill_response_envelope(asap_envelope_t *out, const asap_envelope_t *i
return 0;
}

const char *asap_resolve_task_session_id(const char *ctx_session_id, const char *sender,
char *buf, size_t buf_size)
{
if (ctx_session_id && ctx_session_id[0] != '\0')
return ctx_session_id;
if (sender && sender[0] != '\0' && buf != NULL && buf_size > 0) {
snprintf(buf, buf_size, "asap:%s", sender);
buf[buf_size - 1] = '\0';
return buf;
}
return "asap:inbound";
}

static int handle_task_request(const asap_envelope_t *in, asap_envelope_t *out,
asap_server_ctx_t *ctx, char *err_message, size_t err_message_size)
{
char *prompt;
char *resp_buf;
char sid_buf[256];
const char *sid;
int ar;
cJSON *pl;
Expand All @@ -134,7 +148,7 @@ static int handle_task_request(const asap_envelope_t *in, asap_envelope_t *out,
return -32603;
}
resp_buf[0] = '\0';
sid = ctx->session_id ? ctx->session_id : "asap:inbound";
sid = asap_resolve_task_session_id(ctx->session_id, in->sender, sid_buf, sizeof sid_buf);
if (ctx->task_request_hook)
ar = ctx->task_request_hook(ctx, in, resp_buf, (size_t)ASAP_SERVER_AGENT_RESPONSE_CAP);
else {
Expand Down
7 changes: 7 additions & 0 deletions src/asap/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,13 @@ typedef struct asap_server_ctx {
int asap_server_handle(const asap_envelope_t *in, asap_envelope_t *out,
asap_server_ctx_t *ctx, char *err_message, size_t err_message_size);

/**
* Resolve the agent session id for inbound task.request.
* Explicit @p ctx_session_id wins; otherwise derives from @p sender URN.
*/
const char *asap_resolve_task_session_id(const char *ctx_session_id, const char *sender,
char *buf, size_t buf_size);

#ifdef __cplusplus
}
#endif
Expand Down
23 changes: 23 additions & 0 deletions tests/test_asap_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -720,9 +720,32 @@ static int test_trust_sender_rejects_blank_sender_when_list_nonempty(void)
return 0;
}

static int test_resolve_task_session_id(void)
{
char buf[128];
const char *sid;

sid = asap_resolve_task_session_id("cli:override", "urn:alice", buf, sizeof buf);
ASSERT(sid != NULL && strcmp(sid, "cli:override") == 0);

sid = asap_resolve_task_session_id(NULL, "urn:alice", buf, sizeof buf);
ASSERT(sid == buf);
ASSERT(strcmp(sid, "asap:urn:alice") == 0);

sid = asap_resolve_task_session_id("", "urn:bob", buf, sizeof buf);
ASSERT(sid == buf);
ASSERT(strcmp(sid, "asap:urn:bob") == 0);

sid = asap_resolve_task_session_id(NULL, NULL, buf, sizeof buf);
ASSERT(sid != NULL && strcmp(sid, "asap:inbound") == 0);

return 0;
}

int main(void)
{
int r = 0;
r |= test_resolve_task_session_id();
r |= test_task_request_hook();
r |= test_task_cancel_stub();
r |= test_state_query_hook();
Expand Down
Loading