private void HandleAsNonMaster(ClientMessage.CreatePersistentSubscription message) { if (_master == null) { DenyRequestBecauseNotReady(message.Envelope, message.CorrelationId); } else { DenyRequestBecauseNotMaster(message.CorrelationId, message.Envelope); } }
private void PutSubscription(HttpEntityManager http, UriTemplateMatch match) { if (_httpForwarder.ForwardRequest(http)) { return; } var groupname = match.BoundVariables["subscription"]; var stream = match.BoundVariables["stream"]; var envelope = new SendToHttpEnvelope( _networkSendQueue, http, (args, message) => http.ResponseCodec.To(message), (args, message) => { int code; var m = message as ClientMessage.CreatePersistentSubscriptionCompleted; if (m == null) { throw new Exception("unexpected message " + message); } switch (m.Result) { case ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult .Success: code = HttpStatusCode.Created; break; case ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult .AlreadyExists: code = HttpStatusCode.Conflict; break; case ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult .AccessDenied: code = HttpStatusCode.Unauthorized; break; default: code = HttpStatusCode.InternalServerError; break; } return(new ResponseConfiguration(code, http.ResponseCodec.ContentType, http.ResponseCodec.Encoding, new KeyValuePair <string, string>("location", MakeUrl(http, "/subscriptions/" + stream + "/" + groupname)))); }); http.ReadTextRequestAsync( (o, s) => { var data = http.RequestCodec.From <SubscriptionConfigData>(s); var config = ParseConfig(data); if (!ValidateConfig(config, http)) { return; } var message = new ClientMessage.CreatePersistentSubscription(Guid.NewGuid(), Guid.NewGuid(), envelope, stream, groupname, config.ResolveLinktos, config.StartFrom, config.MessageTimeoutMilliseconds, config.ExtraStatistics, config.MaxRetryCount, config.BufferSize, config.LiveBufferSize, config.ReadBatchSize, config.CheckPointAfterMilliseconds, config.MinCheckPointCount, config.MaxCheckPointCount, config.MaxSubscriberCount, CalculateNamedConsumerStrategyForOldClients(data), http.User, "", ""); Publish(message); }, x => Log.Debug(x, "Reply Text Content Failed.")); }
public void Handle(ClientMessage.CreatePersistentSubscription message) { if (!_started) { return; } var key = BuildSubscriptionGroupKey(message.EventStreamId, message.GroupName); Log.Debug("Creating persistent subscription {0}", key); //TODO revisit for permissions. maybe make admin only? var streamAccess = _readIndex.CheckStreamAccess(SystemStreams.SettingsStream, StreamAccessType.Write, message.User); if (!streamAccess.Granted) { message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId, ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.AccessDenied, "You do not have permissions to create streams")); return; } if (_subscriptionsById.ContainsKey(key)) { message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId, ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.AlreadyExists, "Group '" + message.GroupName + "' already exists.")); return; } if (message.EventStreamId == null || message.EventStreamId == "" || message.EventStreamId == "$all") { message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId, ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.Fail, "Bad stream name.")); return; } if (!_consumerStrategyRegistry.ValidateStrategy(message.NamedConsumerStrategy)) { message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId, ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.Fail, string.Format("Consumer strategy {0} does not exist.", message.NamedConsumerStrategy))); return; } CreateSubscriptionGroup(message.EventStreamId, message.GroupName, message.ResolveLinkTos, message.StartFrom, message.RecordStatistics, message.MaxRetryCount, message.LiveBufferSize, message.BufferSize, message.ReadBatchSize, ToTimeout(message.CheckPointAfterMilliseconds), message.MinCheckPointCount, message.MaxCheckPointCount, message.MaxSubscriberCount, message.NamedConsumerStrategy, ToTimeout(message.MessageTimeoutMilliseconds) ); Log.Debug("New persistent subscription {0}", key); _config.Updated = DateTime.Now; _config.UpdatedBy = message.User.Identity.Name; _config.Entries.Add(new PersistentSubscriptionEntry { Stream = message.EventStreamId, Group = message.GroupName, ResolveLinkTos = message.ResolveLinkTos, CheckPointAfter = message.CheckPointAfterMilliseconds, ExtraStatistics = message.RecordStatistics, HistoryBufferSize = message.BufferSize, LiveBufferSize = message.LiveBufferSize, MaxCheckPointCount = message.MaxCheckPointCount, MinCheckPointCount = message.MinCheckPointCount, MaxRetryCount = message.MaxRetryCount, ReadBatchSize = message.ReadBatchSize, MaxSubscriberCount = message.MaxSubscriberCount, MessageTimeout = message.MessageTimeoutMilliseconds, NamedConsumerStrategy = message.NamedConsumerStrategy, StartFrom = message.StartFrom }); SaveConfiguration(() => message.Envelope.ReplyWith(new ClientMessage.CreatePersistentSubscriptionCompleted(message.CorrelationId, ClientMessage.CreatePersistentSubscriptionCompleted.CreatePersistentSubscriptionResult.Success, ""))); }