Esempio n. 1
0
    public void processResponseOk(GcmAsyncParameters asyncParam)
    {
        var result = new GcmMessageTransportResponse()
        {
            ResponseCode = GcmMessageTransportResponseCode.Ok,
            Message      = asyncParam.Message
        };

        var json = new JObject();
        var str  = string.Empty;

        try { str = (new StreamReader(asyncParam.WebResponse.GetResponseStream())).ReadToEnd(); }
        catch { }
        try { json = JObject.Parse(str); }
        catch { }
        result.NumberOfCanonicalIds = json.Value <long>("canonical_ids");
        result.NumberOfFailures     = json.Value <long>("failure");
        result.NumberOfSuccesses    = json.Value <long>("success");

        var jsonResults = json["results"] as JArray;

        if (jsonResults == null)
        {
            jsonResults = new JArray();
        }
        foreach (var r in jsonResults)
        {
            var msgResult = new GcmMessageResult();

            msgResult.MessageId = r.Value <string>("message_id");
            msgResult.CanonicalRegistrationId = r.Value <string>("registration_id");
            msgResult.ResponseStatus          = GcmMessageTransportResponseStatus.Ok;

            if (!string.IsNullOrEmpty(msgResult.CanonicalRegistrationId))
            {
                msgResult.ResponseStatus = GcmMessageTransportResponseStatus.CanonicalRegistrationId;
            }
            else if (r["error"] != null)
            {
                var err = r.Value <string>("error") ?? "";
                switch (err.ToLowerInvariant().Trim())
                {
                case "ok":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Ok;
                    break;

                case "missingregistration":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MissingRegistrationId;
                    break;

                case "unavailable":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Unavailable;
                    break;

                case "notregistered":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.NotRegistered;
                    break;

                case "invalidregistration":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidRegistration;
                    break;

                case "mismatchsenderid":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MismatchSenderId;
                    break;

                case "messagetoobig":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MessageTooBig;
                    break;

                case "invaliddatakey":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidDataKey;
                    break;

                case "invalidttl":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidTtl;
                    break;

                case "internalservererror":
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InternalServerError;
                    break;

                default:
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Error;
                    break;
                }
            }
            result.Results.Add(msgResult);
        }
        asyncParam.WebResponse.Close();
        int index    = 0;
        var response = result;

        foreach (var r in response.Results)
        {
            var singleResultNotification = GcmNotification.ForSingleResult(response, index);
            if (r.ResponseStatus == GcmMessageTransportResponseStatus.Ok)
            {
                asyncParam.Callback(this, new SendNotificationResult(singleResultNotification));
            }
            else if (r.ResponseStatus == GcmMessageTransportResponseStatus.CanonicalRegistrationId)
            {
                var newRegistrationId = r.CanonicalRegistrationId;
                var oldRegistrationId = string.Empty;
                if (singleResultNotification.RegistrationIds != null && singleResultNotification.RegistrationIds.Count > 0)
                {
                    oldRegistrationId = singleResultNotification.RegistrationIds[0];
                }
                asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new DeviceSubscriptonExpiredException())
                {
                    OldSubscriptionId = oldRegistrationId, NewSubscriptionId = newRegistrationId, IsSubscriptionExpired = true
                });
            }
            else if (r.ResponseStatus == GcmMessageTransportResponseStatus.Unavailable)
            {
                asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, true, new Exception("Unavailable Response Status")));
            }
            else if (r.ResponseStatus == GcmMessageTransportResponseStatus.NotRegistered)
            {
                var oldRegistrationId = string.Empty;

                if (singleResultNotification.RegistrationIds != null && singleResultNotification.RegistrationIds.Count > 0)
                {
                    oldRegistrationId = singleResultNotification.RegistrationIds[0];
                }

                asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new DeviceSubscriptonExpiredException())
                {
                    OldSubscriptionId = oldRegistrationId, IsSubscriptionExpired = true, SubscriptionExpiryUtc = DateTime.UtcNow
                });
            }
            else
            {
                asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new GcmMessageTransportException(r.ResponseStatus.ToString(), response)));
            }
            index++;
        }
        Interlocked.Decrement(ref waitCounter);
    }
Esempio n. 2
0
    void processResponseOk(GcmAsyncParameters asyncParam)
    {
        var result = new GcmMessageTransportResponse()
            {
                ResponseCode = GcmMessageTransportResponseCode.Ok,
                Message = asyncParam.Message
            };

            var json = new JObject();
            var str = string.Empty;
            try { str = (new StreamReader(asyncParam.WebResponse.GetResponseStream())).ReadToEnd(); }
            catch { }
            try { json = JObject.Parse(str); }
            catch { }
            result.NumberOfCanonicalIds = json.Value<long>("canonical_ids");
            result.NumberOfFailures = json.Value<long>("failure");
            result.NumberOfSuccesses = json.Value<long>("success");

            var jsonResults = json["results"] as JArray;
            if (jsonResults == null)
                jsonResults = new JArray();
            foreach (var r in jsonResults)
            {
                var msgResult = new GcmMessageResult();

                msgResult.MessageId = r.Value<string>("message_id");
                msgResult.CanonicalRegistrationId = r.Value<string>("registration_id");
                msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Ok;

                if (!string.IsNullOrEmpty(msgResult.CanonicalRegistrationId))
                {
                    msgResult.ResponseStatus = GcmMessageTransportResponseStatus.CanonicalRegistrationId;
                }
                else if (r["error"] != null)
                {
                    var err = r.Value<string>("error") ?? "";
                    switch (err.ToLowerInvariant().Trim())
                    {
                        case "ok":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Ok;
                            break;
                        case "missingregistration":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MissingRegistrationId;
                            break;
                        case "unavailable":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Unavailable;
                            break;
                        case "notregistered":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.NotRegistered;
                            break;
                        case "invalidregistration":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidRegistration;
                            break;
                        case "mismatchsenderid":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MismatchSenderId;
                            break;
                        case "messagetoobig":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.MessageTooBig;
                            break;
                        case "invaliddatakey":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidDataKey;
                            break;
                        case "invalidttl":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InvalidTtl;
                            break;
                        case "internalservererror":
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.InternalServerError;
                            break;
                        default:
                            msgResult.ResponseStatus = GcmMessageTransportResponseStatus.Error;
                            break;
                    }
                }
                result.Results.Add(msgResult);

            }
            asyncParam.WebResponse.Close();
            int index = 0;
            var response = result;

            foreach (var r in response.Results)
            {
                var singleResultNotification = GcmNotification.ForSingleResult(response, index);
                if (r.ResponseStatus == GcmMessageTransportResponseStatus.Ok)
                {
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification));
                }
                else if (r.ResponseStatus == GcmMessageTransportResponseStatus.CanonicalRegistrationId)
                {
                    var newRegistrationId = r.CanonicalRegistrationId;
                    var oldRegistrationId = string.Empty;
                    if (singleResultNotification.RegistrationIds != null && singleResultNotification.RegistrationIds.Count > 0)
                        oldRegistrationId = singleResultNotification.RegistrationIds[0];
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new DeviceSubscriptonExpiredException()) { OldSubscriptionId = oldRegistrationId, NewSubscriptionId = newRegistrationId, IsSubscriptionExpired = true });
                }
                else if (r.ResponseStatus == GcmMessageTransportResponseStatus.Unavailable)
                {
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, true, new Exception("Unavailable Response Status")));
                }
                else if (r.ResponseStatus == GcmMessageTransportResponseStatus.NotRegistered)
                {
                    var oldRegistrationId = string.Empty;

                    if (singleResultNotification.RegistrationIds != null && singleResultNotification.RegistrationIds.Count > 0)
                        oldRegistrationId = singleResultNotification.RegistrationIds[0];

                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new DeviceSubscriptonExpiredException()) { OldSubscriptionId = oldRegistrationId, IsSubscriptionExpired = true, SubscriptionExpiryUtc = DateTime.UtcNow });
                }
                else
                {
                    asyncParam.Callback(this, new SendNotificationResult(singleResultNotification, false, new GcmMessageTransportException(r.ResponseStatus.ToString(), response)));
                }
                index++;
            }
            Interlocked.Decrement(ref waitCounter);
    }
Esempio n. 3
0
        private void ProcessRequest(IAsyncResult result)
        {
            try
            {
                var context = listener.EndGetContext(result);

                var request  = context.Request;
                var response = context.Response;

                var wrd = string.Empty;

                using (var sr = new StreamReader(request.InputStream))
                    wrd = sr.ReadToEnd();


                var gcm = JsonConvert.DeserializeObject <GcmRequest>(wrd);

                var transportResponse = new GcmMessageTransportResponse();

                foreach (var id in gcm.RegistrationIds)
                {
                    GcmMessageResult singleResult  = null;
                    bool             matchedFilter = false;

                    foreach (var filter in this.MessageResponseFilters)
                    {
                        if (filter.IsMatch(gcm, id))
                        {
                            singleResult           = filter.Status;
                            singleResult.MessageId = "1:" + msgId++;
                            transportResponse.Results.Add(singleResult);
                            matchedFilter = true;
                            break;
                        }
                    }

                    if (!matchedFilter)
                    {
                        singleResult = new GcmMessageResult();
                        singleResult.ResponseStatus = GcmMessageTransportResponseStatus.Ok;
                        singleResult.MessageId      = "1:" + msgId++;
                        transportResponse.Results.Add(singleResult);
                    }

                    if (singleResult.ResponseStatus == GcmMessageTransportResponseStatus.Ok)
                    {
                        transportResponse.NumberOfSuccesses++;
                    }
                    else
                    {
                        transportResponse.NumberOfFailures++;
                    }

                    transportResponse.NumberOfCanonicalIds++;
                }

                transportResponse.ResponseCode = GcmMessageTransportResponseCode.Ok;


                foreach (var filter in TransportResponseFilters)
                {
                    if (filter.IsMatch(gcm))
                    {
                        transportResponse.ResponseCode = filter.Code;
                        break;
                    }
                }


                switch (transportResponse.ResponseCode)
                {
                case GcmMessageTransportResponseCode.Ok:
                    response.StatusCode = (int)HttpStatusCode.OK;
                    break;

                case GcmMessageTransportResponseCode.InvalidAuthToken:
                    response.StatusCode = (int)HttpStatusCode.Unauthorized;
                    break;

                case GcmMessageTransportResponseCode.ServiceUnavailable:
                    response.Headers.Add("Retry-After", "120");
                    response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
                    break;

                case GcmMessageTransportResponseCode.InternalServiceError:
                    response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    break;

                case GcmMessageTransportResponseCode.BadRequest:
                    response.StatusCode = (int)HttpStatusCode.BadRequest;
                    break;

                default:
                    response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    break;
                }

                var responseString = JsonConvert.SerializeObject(transportResponse);
                var buffer         = Encoding.UTF8.GetBytes(responseString);
                // Get a response stream and write the response to it.
                response.ContentLength64 = buffer.Length;
                System.IO.Stream output = response.OutputStream;
                output.Write(buffer, 0, buffer.Length);
                // You must close the output stream.
                output.Close();

                notificationReceived(transportResponse);
            }
            catch (Exception)
            {
            }

            if (listener.IsListening && !cancelServer.IsCancellationRequested)
            {
                listener.BeginGetContext(ProcessRequest, listener);
            }
        }