Skip to content

Commit e9c6bcc

Browse files
committed
Improve message parsing
1 parent bd36b7d commit e9c6bcc

File tree

1 file changed

+44
-26
lines changed

1 file changed

+44
-26
lines changed

Parse/Platform/LiveQueries/ParseLiveQueryController.cs

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,23 @@ private void ProcessMessage(IDictionary<string, object> message)
166166
}
167167
}
168168

169+
private bool ValidateClientMessage(IDictionary<string, object> message, out int requestId)
170+
{
171+
requestId = 0;
172+
173+
if (!(message.TryGetValue("clientId", out object clientIdObj) &&
174+
clientIdObj is string clientId && clientId == ClientId))
175+
return false;
176+
177+
return message.TryGetValue("requestId", out object requestIdObj) &&
178+
Int32.TryParse(requestIdObj?.ToString(), out requestId);
179+
}
180+
169181
void ProcessDeleteEventMessage(IDictionary<string, object> message)
170182
{
171-
string clientId = message["clientId"] as string;
172-
if (clientId != ClientId)
183+
if (!ValidateClientMessage(message, out int requestId))
173184
return;
174-
int requestId = Convert.ToInt32(message["requestId"]);
185+
175186
if (Subscriptions.TryGetValue(requestId, out IParseLiveQuerySubscription subscription))
176187
{
177188
subscription.OnDelete(ParseObjectCoder.Instance.Decode(
@@ -183,10 +194,9 @@ void ProcessDeleteEventMessage(IDictionary<string, object> message)
183194

184195
void ProcessLeaveEventMessage(IDictionary<string, object> message)
185196
{
186-
string clientId = message["clientId"] as string;
187-
if (clientId != ClientId)
197+
if (!ValidateClientMessage(message, out int requestId))
188198
return;
189-
int requestId = Convert.ToInt32(message["requestId"]);
199+
190200
if (Subscriptions.TryGetValue(requestId, out IParseLiveQuerySubscription subscription))
191201
{
192202
subscription.OnLeave(
@@ -203,10 +213,9 @@ void ProcessLeaveEventMessage(IDictionary<string, object> message)
203213

204214
void ProcessUpdateEventMessage(IDictionary<string, object> message)
205215
{
206-
string clientId = message["clientId"] as string;
207-
if (clientId != ClientId)
216+
if (!ValidateClientMessage(message, out int requestId))
208217
return;
209-
int requestId = Convert.ToInt32(message["requestId"]);
218+
210219
if (Subscriptions.TryGetValue(requestId, out IParseLiveQuerySubscription subscription))
211220
{
212221
subscription.OnUpdate(
@@ -223,10 +232,9 @@ void ProcessUpdateEventMessage(IDictionary<string, object> message)
223232

224233
void ProcessEnterEventMessage(IDictionary<string, object> message)
225234
{
226-
string clientId = message["clientId"] as string;
227-
if (clientId != ClientId)
235+
if (!ValidateClientMessage(message, out int requestId))
228236
return;
229-
int requestId = Convert.ToInt32(message["requestId"]);
237+
230238
if (Subscriptions.TryGetValue(requestId, out IParseLiveQuerySubscription subscription))
231239
{
232240
subscription.OnEnter(
@@ -243,10 +251,9 @@ void ProcessEnterEventMessage(IDictionary<string, object> message)
243251

244252
void ProcessCreateEventMessage(IDictionary<string, object> message)
245253
{
246-
string clientId = message["clientId"] as string;
247-
if (clientId != ClientId)
254+
if (!ValidateClientMessage(message, out int requestId))
248255
return;
249-
int requestId = Convert.ToInt32(message["requestId"]);
256+
250257
if (Subscriptions.TryGetValue(requestId, out IParseLiveQuerySubscription subscription))
251258
{
252259
subscription.OnCreate(ParseObjectCoder.Instance.Decode(
@@ -258,19 +265,27 @@ void ProcessCreateEventMessage(IDictionary<string, object> message)
258265

259266
void ProcessErrorMessage(IDictionary<string, object> message)
260267
{
261-
ParseLiveQueryErrorEventArgs errorArgs = new ParseLiveQueryErrorEventArgs(
262-
Convert.ToInt32(message["code"]),
263-
message["error"] as string,
264-
Convert.ToBoolean(message["reconnect"]));
268+
if (!(message.TryGetValue("code", out object codeObj) &&
269+
Int32.TryParse(codeObj?.ToString(), out int code)))
270+
return;
271+
272+
if (!(message.TryGetValue("error", out object errorObj) &&
273+
errorObj is string error))
274+
return;
275+
276+
if (!(message.TryGetValue("reconnect", out object reconnectObj) &&
277+
Boolean.TryParse(reconnectObj?.ToString(), out bool reconnect)))
278+
return;
279+
280+
ParseLiveQueryErrorEventArgs errorArgs = new ParseLiveQueryErrorEventArgs(code, error, reconnect);
265281
Error?.Invoke(this, errorArgs);
266282
}
267283

268284
void ProcessUnsubscriptionMessage(IDictionary<string, object> message)
269285
{
270-
string clientId = message["clientId"] as string;
271-
if (clientId != ClientId)
286+
if (!ValidateClientMessage(message, out int requestId))
272287
return;
273-
int requestId = Convert.ToInt32(message["requestId"]);
288+
274289
if (UnsubscriptionSignals.TryGetValue(requestId, out TaskCompletionSource unsubscriptionSign))
275290
{
276291
unsubscriptionSign?.TrySetResult();
@@ -279,10 +294,9 @@ void ProcessUnsubscriptionMessage(IDictionary<string, object> message)
279294

280295
void ProcessSubscriptionMessage(IDictionary<string, object> message)
281296
{
282-
string clientId = message["clientId"] as string;
283-
if (clientId != ClientId)
297+
if (!ValidateClientMessage(message, out int requestId))
284298
return;
285-
int requestId = Convert.ToInt32(message["requestId"]);
299+
286300
if (SubscriptionSignals.TryGetValue(requestId, out TaskCompletionSource subscriptionSignal))
287301
{
288302
subscriptionSignal?.TrySetResult();
@@ -291,8 +305,12 @@ void ProcessSubscriptionMessage(IDictionary<string, object> message)
291305

292306
void ProcessConnectionMessage(IDictionary<string, object> message)
293307
{
308+
if (!(message.TryGetValue("clientId", out object clientIdObj) &&
309+
clientIdObj is string clientId))
310+
return;
311+
312+
ClientId = clientId;
294313
_state = ParseLiveQueryState.Connected;
295-
ClientId = message["clientId"] as string;
296314
ConnectionSignal.TrySetResult();
297315
}
298316

0 commit comments

Comments
 (0)