Explorar el Código

server error messages

Rain hace 10 meses
padre
commit
991f59859c
Se han modificado 3 ficheros con 66 adiciones y 18 borrados
  1. 13 8
      client/src/actions.rs
  2. 45 6
      client/src/ui.rs
  3. 8 4
      server/src/main.rs

+ 13 - 8
client/src/actions.rs

@@ -43,12 +43,13 @@ pub fn on_input_submit(siv: &mut Cursive, input_field_id: &str) {
         // so we don't need to show it again
         let mut error_dialogue_shown = false;
 
-        if send_message(siv, message).is_ok() {
-            clear_input_field(siv);
-        } else {
-            error_dialogue_shown = true;
-            ui::error(siv, ui::Labels::FailedToSendMessage.localize(language));
-        }
+        match send_message(siv, message) {
+            Ok(_) => clear_input_field(siv),
+            Err(e) => {
+                error_dialogue_shown = true;
+                ui::error(siv, ui::Labels::FailedToSendMessage(e).localize(language))
+            }
+        };
 
         let res = load_messages(siv);
         if let Err(e) = res {
@@ -100,13 +101,17 @@ pub fn send_message(siv: &mut Cursive, message: Message) -> Result<(), NetworkEr
     let url = fix_url(&get_appdata(siv).api_endpoint)?;
     let str = utils::binary::bin2hex(message.serialize_checked());
 
-    reqwest::blocking::Client::new()
+    let resp = reqwest::blocking::Client::new()
         .post(format!("{}", url))
         .body(str)
         .send()
         .map_err(|e| NetworkError::ReqwestError(e))?;
 
-    Ok(())
+    if resp.status().is_success() {
+        Ok(())
+    } else {
+        Err(NetworkError::StatusCodeError(resp.status().as_u16()))
+    }
 }
 
 pub fn load_messages(siv: &mut Cursive) -> Result<(), NetworkError> {

+ 45 - 6
client/src/ui.rs

@@ -56,7 +56,7 @@ pub enum Labels {
     InvalidUsernameExplination,
     Username,
     InvalidMessage,
-    FailedToSendMessage,
+    FailedToSendMessage(NetworkError),
     FailedToLoadMessages(NetworkError),
     RefreshButton,
     BlockedWords,
@@ -99,12 +99,51 @@ impl Labels {
             Labels::Send => ["Send", "Verzenden", "送信する"],
             Labels::Clear => ["Clear", "Wissen", "クリア"],
             Labels::Username => ["Username", "Gebruikersnaam", "ユーザー名"],
-            Labels::FailedToSendMessage => [
-                "Failed to send message",
-                "Bericht verzenden mislukt",
-                "メッセージの送信に失敗しました",
-            ],
             Labels::SetLanguage => ["Set language", "Stel taal in", "言語を設定する"],
+            Labels::FailedToSendMessage(e) => {
+                let reason_buf: [String; 3];
+
+                match e {
+                    NetworkError::ReqwestError(_) => {
+                        reason_buf = [
+                            "Connection error.".to_string(),
+                            "Verbindingsfout.".to_string(),
+                            "接続エラー。".to_string(),
+                        ];
+                    }
+                    NetworkError::StatusCodeError(code) => {
+                        // NOTE: Needs to match the server
+                        if *code == 400 {
+                            reason_buf = [
+                                "Message too long.".to_string(),
+                                "Bericht te lang.".to_string(),
+                                "メッセージが長すぎます。".to_string(),
+                            ];
+                        } else {
+                            reason_buf = [
+                                format!("Status code: {code}"),
+                                format!("Statuscode: {code}"),
+                                format!("ステータスコード: {code}"),
+                            ]
+                        }
+                    }
+                    NetworkError::InvalidUrl => {
+                        reason_buf = [
+                            "Invalid URL.".to_string(),
+                            "Ongeldig URL.".to_string(),
+                            "無効なURL。".to_string(),
+                        ];
+                    }
+                };
+
+                buf = [
+                    format!("Failed to send message. {}", reason_buf[0]),
+                    format!("Bericht verzenden mislukt. {}", reason_buf[1]),
+                    format!("メッセージの送信に失敗しました。 {}", reason_buf[2]),
+                ];
+
+                [buf[0].as_str(), buf[1].as_str(), buf[2].as_str()]
+            }
             Labels::FailedToLoadMessages(error) => {
                 let reason_buf: [String; 3];
 

+ 8 - 4
server/src/main.rs

@@ -33,15 +33,17 @@ impl Appdata {
         }
     }
 
-    pub fn insert_message(&self, message: String) {
+    pub fn insert_message(&self, message: String) -> Result<(), ()> {
         if message.len() > MAX_MESSAGE_LENGTH {
-            return;
+            return Err(());
         }
 
         let mut guard = self.inner.lock().unwrap();
         let index = guard.index;
         guard.messages[index] = message.into();
         guard.index = (index + 1) % guard.messages.len();
+
+        Ok(())
     }
 
     pub fn get_messages(&self) -> Vec<String> {
@@ -73,8 +75,10 @@ async fn index_post(body: web::Payload, data: web::Data<Appdata>) -> impl Respon
 
     println!("Received ({}): {:#?}", str.len(), str);
 
-    data.insert_message(str.clone());
-    HttpResponse::Ok().body(str)
+    match data.insert_message(str.clone()) {
+        Ok(()) => HttpResponse::Ok().body(str),
+        Err(()) => HttpResponse::BadRequest().body(""),
+    }
 }
 
 #[actix_web::main]