changed session id algo
This commit is contained in:
+47
-9
@@ -1179,11 +1179,11 @@ func TestLLMNonStreamingAndHeaders(t *testing.T) {
|
||||
}
|
||||
// Non-OpenCode endpoints keep the legacy session-affinity headers and must
|
||||
// not receive any x-opencode-* headers.
|
||||
if gotLegacy != opencodeSessionID() {
|
||||
t.Errorf("X-Session-Id = %q, want %q", gotLegacy, opencodeSessionID())
|
||||
if !isOpencodeSessionID(gotLegacy) {
|
||||
t.Errorf("X-Session-Id = %q, want a ses_* id", gotLegacy)
|
||||
}
|
||||
if gotAffinity != opencodeSessionID() {
|
||||
t.Errorf("x-session-affinity = %q, want %q", gotAffinity, opencodeSessionID())
|
||||
if gotAffinity != gotLegacy {
|
||||
t.Errorf("x-session-affinity = %q, want %q", gotAffinity, gotLegacy)
|
||||
}
|
||||
if gotOCClient != "" || gotOCReq != "" {
|
||||
t.Errorf("unexpected x-opencode headers: client=%q request=%q", gotOCClient, gotOCReq)
|
||||
@@ -1257,8 +1257,8 @@ func TestApplyLLMHeadersOpencode(t *testing.T) {
|
||||
if got := req.Header.Get("x-opencode-project"); got != "global" {
|
||||
t.Errorf("x-opencode-project = %q, want global", got)
|
||||
}
|
||||
if got := req.Header.Get("x-opencode-session"); got != opencodeSessionID() {
|
||||
t.Errorf("x-opencode-session = %q, want %q", got, opencodeSessionID())
|
||||
if got := req.Header.Get("x-opencode-session"); !isOpencodeSessionID(got) {
|
||||
t.Errorf("x-opencode-session = %q, want a ses_* id", got)
|
||||
}
|
||||
if got := req.Header.Get("x-opencode-request"); got != "msg_test" {
|
||||
t.Errorf("x-opencode-request = %q, want msg_test", got)
|
||||
@@ -1302,6 +1302,29 @@ func TestApplyLLMHeadersOpencodeAuth(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// isOpencodeSessionID reports whether sid matches the Zen session id shape
|
||||
// emitted by opencodeSessionID: "ses_" + 12 lowercase hex chars (ending in
|
||||
// "ffe") + 14 alphanumeric characters.
|
||||
func isOpencodeSessionID(sid string) bool {
|
||||
if !strings.HasPrefix(sid, "ses_") || len(sid) != 30 {
|
||||
return false
|
||||
}
|
||||
for _, c := range sid[4:16] {
|
||||
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f')) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
if sid[13:16] != "ffe" {
|
||||
return false
|
||||
}
|
||||
for _, c := range sid[16:] {
|
||||
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func TestOpencodeSessionID(t *testing.T) {
|
||||
sid := opencodeSessionID()
|
||||
if !strings.HasPrefix(sid, "ses_") {
|
||||
@@ -1310,11 +1333,26 @@ func TestOpencodeSessionID(t *testing.T) {
|
||||
if len(sid) != 30 {
|
||||
t.Fatalf("session id length = %d, want 30: %q", len(sid), sid)
|
||||
}
|
||||
for _, c := range sid[4:] {
|
||||
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
|
||||
t.Fatalf("invalid character %c in session id %q", c, sid)
|
||||
// The 12 characters after the "ses_" prefix are lowercase hex (the real
|
||||
// OpenCode ids carry a millisecond timestamp there, ending in "ffe").
|
||||
hexPart := sid[4:16]
|
||||
for _, c := range hexPart {
|
||||
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f')) {
|
||||
t.Fatalf("non-hex character %c in session id prefix %q", c, sid)
|
||||
}
|
||||
}
|
||||
if hexPart[9:] != "ffe" {
|
||||
t.Fatalf("session id hex marker = %q, want suffix ffe: %q", hexPart[9:], sid)
|
||||
}
|
||||
// The remaining 14 characters are alphanumeric.
|
||||
for _, c := range sid[16:] {
|
||||
if !((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
|
||||
t.Fatalf("invalid character %c in session id tail %q", c, sid)
|
||||
}
|
||||
}
|
||||
if opencodeSessionID() == sid {
|
||||
t.Fatalf("two consecutive session ids are identical: %q", sid)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLLMNoAuthHeaderWhenNoKey(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user