Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F32618957
D5149.1767462736.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D5149.1767462736.diff
View Options
diff --git a/services/tunnelbroker/rust-notifications/src/apns.rs b/services/tunnelbroker/rust-notifications/src/apns.rs
--- a/services/tunnelbroker/rust-notifications/src/apns.rs
+++ b/services/tunnelbroker/rust-notifications/src/apns.rs
@@ -1,8 +1,10 @@
+use crate::ffi::apns_status;
use a2::{
- Client, Endpoint, NotificationBuilder, NotificationOptions,
- PlainNotificationBuilder,
+ Client, Endpoint, Error,
+ ErrorReason::{BadDeviceToken, Unregistered},
+ NotificationBuilder, NotificationOptions, PlainNotificationBuilder,
};
-use anyhow::Result;
+use anyhow::{anyhow, Result};
use std::fs::File;
pub async fn send_by_a2_client(
@@ -12,7 +14,7 @@
topic: &str,
message: &str,
sandbox: bool,
-) -> Result<u16> {
+) -> Result<apns_status> {
let mut certificate = File::open(certificate_path)?;
let endpoint = if sandbox {
Endpoint::Sandbox
@@ -28,6 +30,27 @@
let builder = PlainNotificationBuilder::new(message);
let mut payload = builder.build(device_token, options);
payload.aps.content_available = Some(1);
- let response = client.send(payload).await?;
- Ok(response.code)
+ match client.send(payload).await {
+ Ok(_) => Ok(apns_status::Ok),
+ Err(Error::ResponseError(response)) => {
+ if let Some(error_body) = response.error {
+ match error_body.reason {
+ // We are returning `Ok` with the error types here to distinguish the exact
+ // error type in a C++ side
+ BadDeviceToken => Ok(apns_status::BadDeviceToken),
+ Unregistered => Ok(apns_status::Unregistered),
+ _ => Err(anyhow!(
+ "Notification was not accepted by APNs, reason: {:?}",
+ error_body.reason
+ )),
+ }
+ } else {
+ Err(anyhow!(
+ "Unhandled response error from APNs, response: {:?}",
+ response
+ ))
+ }
+ }
+ Err(error) => Err(anyhow::Error::new(error)),
+ }
}
diff --git a/services/tunnelbroker/rust-notifications/src/lib.rs b/services/tunnelbroker/rust-notifications/src/lib.rs
--- a/services/tunnelbroker/rust-notifications/src/lib.rs
+++ b/services/tunnelbroker/rust-notifications/src/lib.rs
@@ -1,3 +1,4 @@
+use crate::ffi::apns_status;
use anyhow::Result;
use env_logger;
use lazy_static::lazy_static;
@@ -8,6 +9,12 @@
#[cxx::bridge]
mod ffi {
+ #[cxx_name = "apnsReturnStatus"]
+ enum apns_status {
+ Ok,
+ Unregistered,
+ BadDeviceToken,
+ }
extern "Rust" {
#[cxx_name = "sendNotifToAPNS"]
fn send_notif_to_apns(
@@ -17,7 +24,7 @@
topic: &str,
message: &str,
sandbox: bool,
- ) -> Result<u16>;
+ ) -> Result<apns_status>;
#[cxx_name = "sendNotifToFCM"]
fn send_notif_to_fcm(
@@ -44,7 +51,7 @@
topic: &str,
message: &str,
sandbox: bool,
-) -> Result<u16> {
+) -> Result<apns_status> {
RUNTIME.block_on(apns::send_by_a2_client(
certificate_path,
certificate_password,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 3, 5:52 PM (5 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5890035
Default Alt Text
D5149.1767462736.diff (2 KB)
Attached To
Mode
D5149: [services] Tunnelbroker - Update A2 (APNs) library wrapper with return of token-related errors
Attached
Detach File
Event Timeline
Log In to Comment