Skip to content

Commit a027916

Browse files
Handle a missing CountDetails node in the returned responses for Get<Entity>RuntimeProperties. (#18213)
Return an error for a missing CountDetails node in the returned responses for GetRuntimeProperties. This doesn't fix the issue in #17868 but it'll stop the panic, which is infinitely worse.
1 parent ead737b commit a027916

File tree

6 files changed

+41
-12
lines changed

6 files changed

+41
-12
lines changed

sdk/messaging/azservicebus/admin/admin_client_queue.go

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package admin
55

66
import (
77
"context"
8+
"errors"
89
"net/http"
910
"time"
1011

@@ -430,6 +431,10 @@ func newQueueItem(env *atom.QueueEnvelope) (*QueueItem, error) {
430431
func newQueueRuntimePropertiesItem(env *atom.QueueEnvelope) (*QueueRuntimePropertiesItem, error) {
431432
desc := env.Content.QueueDescription
432433

434+
if desc.CountDetails == nil {
435+
return nil, errors.New("invalid queue runtime properties: no CountDetails element")
436+
}
437+
433438
qrt := &QueueRuntimeProperties{
434439
SizeInBytes: int64OrZero(desc.SizeInBytes),
435440
TotalMessageCount: int64OrZero(desc.MessageCount),

sdk/messaging/azservicebus/admin/admin_client_subscription.go

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package admin
55

66
import (
77
"context"
8+
"errors"
89
"fmt"
910
"net/http"
1011
"time"
@@ -415,6 +416,10 @@ func newSubscriptionItem(env *atom.SubscriptionEnvelope, topicName string) (*Sub
415416
func newSubscriptionRuntimePropertiesItem(env *atom.SubscriptionEnvelope, topicName string) (*SubscriptionRuntimePropertiesItem, error) {
416417
desc := env.Content.SubscriptionDescription
417418

419+
if desc.CountDetails == nil {
420+
return nil, errors.New("invalid subscription runtime properties: no CountDetails element")
421+
}
422+
418423
rtp := SubscriptionRuntimeProperties{
419424
TotalMessageCount: *desc.MessageCount,
420425
ActiveMessageCount: *desc.CountDetails.ActiveMessageCount,

sdk/messaging/azservicebus/admin/admin_client_test.go

+14
Original file line numberDiff line numberDiff line change
@@ -1750,3 +1750,17 @@ func createAuthorizationRulesForTest(t *testing.T) []AuthorizationRule {
17501750
},
17511751
}
17521752
}
1753+
1754+
func TestATOMNoCountDetails(t *testing.T) {
1755+
subRP, err := newSubscriptionRuntimePropertiesItem(&atom.SubscriptionEnvelope{Content: &atom.SubscriptionContent{}}, "topic")
1756+
require.Nil(t, subRP)
1757+
require.Error(t, err, "invalid subscription runtime properties: no CountDetails element")
1758+
1759+
qRP, err := newQueueRuntimePropertiesItem(&atom.QueueEnvelope{Content: &atom.QueueContent{}})
1760+
require.Nil(t, qRP)
1761+
require.Error(t, err, "invalid queue runtime properties: no CountDetails element")
1762+
1763+
tRP, err := newTopicRuntimePropertiesItem(&atom.TopicEnvelope{Content: &atom.TopicContent{}})
1764+
require.Nil(t, tRP)
1765+
require.Error(t, err, "invalid topic runtime properties: no CountDetails element")
1766+
}

sdk/messaging/azservicebus/admin/admin_client_topic.go

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package admin
55

66
import (
77
"context"
8+
"errors"
89
"net/http"
910
"time"
1011

@@ -386,6 +387,10 @@ func newTopicItem(te *atom.TopicEnvelope) (*TopicItem, error) {
386387
func newTopicRuntimePropertiesItem(env *atom.TopicEnvelope) (*TopicRuntimePropertiesItem, error) {
387388
desc := env.Content.TopicDescription
388389

390+
if desc.CountDetails == nil {
391+
return nil, errors.New("invalid topic runtime properties: no CountDetails element")
392+
}
393+
389394
props := &TopicRuntimeProperties{
390395
SizeInBytes: int64OrZero(desc.SizeInBytes),
391396
ScheduledMessageCount: int32OrZero(desc.CountDetails.ScheduledMessageCount),

sdk/messaging/azservicebus/internal/atom/converters.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ func WrapWithQueueEnvelope(qd *QueueDescription, tokenProvider auth.TokenProvide
1515
Entry: &Entry{
1616
AtomSchema: atomSchema,
1717
},
18-
Content: &queueContent{
18+
Content: &QueueContent{
1919
Type: applicationXML,
2020
QueueDescription: *qd,
2121
},
@@ -31,7 +31,7 @@ func WrapWithTopicEnvelope(td *TopicDescription) *TopicEnvelope {
3131
Entry: &Entry{
3232
AtomSchema: atomSchema,
3333
},
34-
Content: &topicContent{
34+
Content: &TopicContent{
3535
Type: applicationXML,
3636
TopicDescription: *td,
3737
},
@@ -45,7 +45,7 @@ func WrapWithSubscriptionEnvelope(sd *SubscriptionDescription) *SubscriptionEnve
4545
Entry: &Entry{
4646
AtomSchema: atomSchema,
4747
},
48-
Content: &subscriptionContent{
48+
Content: &SubscriptionContent{
4949
Type: applicationXML,
5050
SubscriptionDescription: *sd,
5151
},

sdk/messaging/azservicebus/internal/atom/models.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ type (
4646
// QueueEnvelope is a specialized Queue feed entry
4747
QueueEnvelope struct {
4848
*Entry
49-
Content *queueContent `xml:"content"`
49+
Content *QueueContent `xml:"content"`
5050
}
5151

52-
// queueContent is a specialized Queue body for an Atom entry
53-
queueContent struct {
52+
// QueueContent is a specialized Queue body for an Atom entry
53+
QueueContent struct {
5454
XMLName xml.Name `xml:"content"`
5555
Type string `xml:"type,attr"`
5656
QueueDescription QueueDescription `xml:"QueueDescription"`
@@ -103,11 +103,11 @@ type (
103103
// TopicEnvelope is a specialized Topic feed entry
104104
TopicEnvelope struct {
105105
*Entry
106-
Content *topicContent `xml:"content"`
106+
Content *TopicContent `xml:"content"`
107107
}
108108

109-
// topicContent is a specialized Topic body for an Atom entry
110-
topicContent struct {
109+
// TopicContent is a specialized Topic body for an Atom entry
110+
TopicContent struct {
111111
XMLName xml.Name `xml:"content"`
112112
Type string `xml:"type,attr"`
113113
TopicDescription TopicDescription `xml:"TopicDescription"`
@@ -296,11 +296,11 @@ type (
296296
// subscriptionEntryContent is a specialized Topic feed Subscription
297297
SubscriptionEnvelope struct {
298298
*Entry
299-
Content *subscriptionContent `xml:"content"`
299+
Content *SubscriptionContent `xml:"content"`
300300
}
301301

302-
// subscriptionContent is a specialized Subscription body for an Atom entry
303-
subscriptionContent struct {
302+
// SubscriptionContent is a specialized Subscription body for an Atom entry
303+
SubscriptionContent struct {
304304
XMLName xml.Name `xml:"content"`
305305
Type string `xml:"type,attr"`
306306
SubscriptionDescription SubscriptionDescription `xml:"SubscriptionDescription"`

0 commit comments

Comments
 (0)