private async Task EnqueueTokens(CancellationToken ct, PushRequest request, Dictionary <string, Alert> dicLang, List <PushToken> tokens) { request.Locale = request.Locale.Replace(" ", string.Empty); if (!string.IsNullOrEmpty(request.Locale)) { var localeSet = StringEx.FromStringWithCommaToHashSet <string>(request.Locale); tokens = CheckNightPushTokens(localeSet, tokens); if (!tokens.Any()) { return; } } while (!ct.IsCancellationRequested) { using (await queueLock.LockAsync()) { if (queue.Count < 2000) { foreach (PushToken token in tokens) { if (dicLang.TryGetValue(token.Language, out var alert) == false) { alert = dicLang[DefaultLanguage]; } queue.Enqueue(new TokenAlert { Request = request, Seq = token.Seq, Token = token.DeviceToken, Alert = alert }); } break; } } await Task.Delay(100, ct); } }
public async Task <HttpResponse> RequestAsync(string token, AndroidNotification notification) { using (await _semaphoreLock.LockAsync()) { var now = DateTime.UtcNow; if (_accessToken == null || now > _accessTokenExpireTime) { _accessToken = await _googleCredential.UnderlyingCredential.GetAccessTokenForRequestAsync(); _accessTokenExpireTime = now + _accessTokenLifeTime; var handler = new SocketsHttpHandler { MaxConnectionsPerServer = int.MaxValue, SslOptions = new SslClientAuthenticationOptions { EnabledSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls } }; _client = new HttpClient(handler, true); _client.BaseAddress = _baseUri; _client.DefaultRequestVersion = new System.Version(2, 0); _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken); _client.DefaultRequestHeaders.Connection.Add("keep-alive"); } } var json = FcmMessage.SetTokenAndData(token, notification).ToJson(); using var res = await _client.PostAsync("", new StringContent (json, Encoding.UTF8, "application/json")); return(new HttpResponse { StatusCode = res.StatusCode, Reason = res.ReasonPhrase }); }