Fix GET querystring and POST body parsing

This commit is contained in:
DarkCat09 2024-06-03 11:26:59 +04:00
parent 2d20c7d87d
commit e95d570709
Signed by: DarkCat09
GPG key ID: 0A26CD5B3345D6E3
3 changed files with 10 additions and 6 deletions

View file

@ -13,6 +13,8 @@ use crate::web_server::old_device_sensor_api::qs_parser::QSParserError;
use rust_decimal::Decimal;
use serde_json::json;
use super::old_device_sensor_api::qs_parser;
/// Главный объект ошибки [std::error::Error] для всего Web API.
///
/// В целом, все Result у Web сервера должны использовать этот Error.
@ -45,7 +47,7 @@ pub enum AppError {
#[display(fmt = "IDK")]
UnknownBody {
json_err: Option<serde_json::Error>,
query_error: Option<serde_qs::Error>,
query_error: Option<qs_parser::QSParserError>,
},
#[display(fmt = "IDK")]

View file

@ -2,9 +2,10 @@
pub mod qs_parser;
use crate::ingest_protocol::{NMDeviceDataPacket, NMJsonPacket};
use crate::ingest_protocol::NMJsonPacket;
use crate::web_server::app_error::AppError;
use bstr::ByteSlice;
use ntex::http::{HttpMessage, StatusCode};
use ntex::util::Bytes;
use ntex::web::types::State;
@ -12,7 +13,6 @@ use ntex::{http, web};
use qs_parser::QSParserError;
use thiserror::Error;
use super::NMAppState;
#[derive(Error, Debug)]
@ -50,7 +50,7 @@ pub async fn device_handler<'a>(
Err(error) => json_error = Some(error),
},
"application/x-www-form-urlencoded" => {
match serde_qs::from_bytes::<NMDeviceDataPacket>(body.as_ref()) {
match qs_parser::parse_nm_qs_format(&body.as_ref().to_str_lossy()).await {
Ok(qs_body) => {
real_body = Some(NMJsonPacket {
devices: Vec::from([qs_body]),
@ -62,7 +62,7 @@ pub async fn device_handler<'a>(
_ => {}
}
} else if request.method() == http::Method::GET {
match serde_qs::from_str::<NMDeviceDataPacket>(request.query_string()) {
match qs_parser::parse_nm_qs_format(request.query_string()).await {
Ok(qs_body) => {
real_body = Some(NMJsonPacket {
devices: Vec::from([qs_body]),

View file

@ -45,7 +45,7 @@ impl From<serde_qs::Error> for QSParserError {
/// [SensorValue].
///
/// Формат: `<SENSOR_MAC>=<SENSOR_VALUE>`.
/// Других данных на подобии названия и времени нет.
/// Других данных наподобие названия и времени нет.
pub fn qs_rest_to_values(
parsed: HashMap<String, String>,
) -> Result<HashSet<SensorValue>, QSParserError> {
@ -96,6 +96,8 @@ pub async fn parse_nm_qs_format(input: &str) -> Result<NMDeviceDataPacket, QSPar
return Err(QSParserError::NoMAC);
};
parsed.remove("ID");
let device_data = NMDeviceDataPacket {
mac: device_mac,
name: parsed.remove("name").map(|v| v.to_owned()),