mirror of
https://github.com/gogrlx/nats-server.git
synced 2026-04-02 03:38:42 -07:00
[FIXED] Service import response invoking svc import (#3393)
past processing the import response, c.pa was not reset to the appropriate state, which lead to an unintended recursion Signed-off-by: Matthias Hanel <mh@synadia.com>
This commit is contained in:
@@ -2141,8 +2141,15 @@ func (a *Account) processServiceImportResponse(sub *subscription, c *client, _ *
|
||||
}
|
||||
a.mu.RUnlock()
|
||||
|
||||
old := c.pa.subject
|
||||
if c.kind == CLIENT || c.kind == LEAF {
|
||||
// reset state to prior to service invocation (code to reset c.pa.subject to old may not be necessary)
|
||||
c.pa.subject = []byte(si.to)
|
||||
}
|
||||
|
||||
// Send for normal processing.
|
||||
c.processServiceImport(si, a, msg)
|
||||
c.pa.subject = old
|
||||
}
|
||||
|
||||
// Will create the response prefix for fast generation of responses.
|
||||
|
||||
@@ -3524,3 +3524,56 @@ func TestAccountUserSubPermsWithQueueGroups(t *testing.T) {
|
||||
// Expect no msgs.
|
||||
checkSubsPending(t, qsub, 0)
|
||||
}
|
||||
|
||||
func TestAccountImportCycle(t *testing.T) {
|
||||
cf := createConfFile(t, []byte(`
|
||||
port: -1
|
||||
accounts: {
|
||||
CP: {
|
||||
users: [
|
||||
{user: cp, password: cp},
|
||||
],
|
||||
exports: [
|
||||
{service: "q1.>", response_type: Singleton},
|
||||
{service: "q2.>", response_type: Singleton},
|
||||
],
|
||||
},
|
||||
A: {
|
||||
users: [
|
||||
{user: a, password: a},
|
||||
],
|
||||
imports: [
|
||||
{service: {account: CP, subject: "q1.>"}},
|
||||
{service: {account: CP, subject: "q2.>"}},
|
||||
]
|
||||
},
|
||||
}
|
||||
`))
|
||||
defer removeFile(t, cf)
|
||||
s, _ := RunServerWithConfig(cf)
|
||||
defer s.Shutdown()
|
||||
ncCp, err := nats.Connect(s.ClientURL(), nats.UserInfo("cp", "cp"))
|
||||
require_NoError(t, err)
|
||||
defer ncCp.Close()
|
||||
ncA, err := nats.Connect(s.ClientURL(), nats.UserInfo("a", "a"))
|
||||
require_NoError(t, err)
|
||||
defer ncA.Close()
|
||||
// setup reply
|
||||
subCp, err := ncCp.SubscribeSync("q1.>")
|
||||
require_NoError(t, err)
|
||||
// setup requestor and send reply
|
||||
ib := "q2.inbox"
|
||||
subAResp, err := ncA.SubscribeSync(ib)
|
||||
require_NoError(t, err)
|
||||
// send request
|
||||
err = ncA.PublishRequest("q1.a", ib, []byte("test"))
|
||||
require_NoError(t, err)
|
||||
// reply
|
||||
mReq, err := subCp.NextMsg(time.Second)
|
||||
require_NoError(t, err)
|
||||
err = mReq.Respond([]byte("reply"))
|
||||
require_NoError(t, err)
|
||||
mRep, err := subAResp.NextMsg(time.Second)
|
||||
require_NoError(t, err)
|
||||
require_Contains(t, string(mRep.Data), "reply")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user