diff --git a/jserrors.go b/jserrors.go index 4fe5bc930..1806f93ff 100644 --- a/jserrors.go +++ b/jserrors.go @@ -80,10 +80,10 @@ var ( // ErrNotJSMessage is returned when attempting to get metadata from non JetStream message . ErrNotJSMessage JetStreamError = &jsError{message: "not a jetstream message"} - // ErrInvalidStreamName is returned when the provided stream name is invalid (contains '.'). + // ErrInvalidStreamName is returned when the provided stream name is invalid (contains '.' or ' '). ErrInvalidStreamName JetStreamError = &jsError{message: "invalid stream name"} - // ErrInvalidConsumerName is returned when the provided consumer name is invalid (contains '.'). + // ErrInvalidConsumerName is returned when the provided consumer name is invalid (contains '.' or ' '). ErrInvalidConsumerName JetStreamError = &jsError{message: "invalid consumer name"} // ErrNoMatchingStream is returned when stream lookup by subject is unsuccessful. diff --git a/jsm.go b/jsm.go index c02e757a7..af4d31fe0 100644 --- a/jsm.go +++ b/jsm.go @@ -421,19 +421,20 @@ func checkStreamName(stream string) error { if stream == _EMPTY_ { return ErrStreamNameRequired } - if strings.Contains(stream, ".") { + if strings.ContainsAny(stream, ". ") { return ErrInvalidStreamName } return nil } -// Check that the durable name exists and is valid, that is, that it does not contain any "." +// Check that the consumer name is not empty and is valid (does not contain "." and " "). +// Additional consumer name validation is done in nats-server. // Returns ErrConsumerNameRequired if consumer name is empty, ErrInvalidConsumerName is invalid, otherwise nil func checkConsumerName(consumer string) error { if consumer == _EMPTY_ { return ErrConsumerNameRequired } - if strings.Contains(consumer, ".") { + if strings.ContainsAny(consumer, ". ") { return ErrInvalidConsumerName } return nil diff --git a/test/js_test.go b/test/js_test.go index 879b8bc09..deb2c0dd7 100644 --- a/test/js_test.go +++ b/test/js_test.go @@ -1781,6 +1781,9 @@ func TestJetStreamManagement(t *testing.T) { if _, err := js.AddStream(&nats.StreamConfig{Name: "bad.stream.name"}); err != nats.ErrInvalidStreamName { t.Fatalf("Expected %v, got %v", nats.ErrInvalidStreamName, err) } + if _, err := js.AddStream(&nats.StreamConfig{Name: "bad stream name"}); err != nats.ErrInvalidStreamName { + t.Fatalf("Expected %v, got %v", nats.ErrInvalidStreamName, err) + } }) t.Run("bad stream info", func(t *testing.T) { @@ -1956,6 +1959,9 @@ func TestJetStreamManagement(t *testing.T) { if _, err = js.AddConsumer("foo", &nats.ConsumerConfig{Durable: "test.durable"}); err != nats.ErrInvalidConsumerName { t.Fatalf("Expected: %v; got: %v", nats.ErrInvalidConsumerName, err) } + if _, err = js.AddConsumer("foo", &nats.ConsumerConfig{Durable: "test durable"}); err != nats.ErrInvalidConsumerName { + t.Fatalf("Expected: %v; got: %v", nats.ErrInvalidConsumerName, err) + } }) t.Run("consumer with given name already exists, configs do not match", func(t *testing.T) {