Rust Iron Web Framework выдает некоторую фантомную ошибку
Я использую железо. Большую часть времени, как 99.* % все хорошо. Но иногда я получаю сообщение об ошибке типа "Ошибка была: ErrorImpl { code: EofWhileParsingString/List/Object, строка: 1, столбец: 8186 } или InvalidUnicodeCodePoint. Я печатаю запрос в журнале, и когда я пытаюсь выполнить этот запрос, все идет хорошо. У меня также есть сервер, написанный на Голанге, получающий тот же запрос, и у них никогда не было проблем с анализом или преобразованием json в MyStruct. Обратите внимание, что код не будет компилироваться как есть, пропуская импорт, error::from и определение структуры. Невозможно предоставить воспроизводимые журналы запросов, поскольку это происходит только при обслуживании лотов по параллельному запросу, но если принят один запрос, он работает нормально. Я пробовал serde_json::from_reader, bodyparser crate и у всех такая же проблема.
extern crate serde;
extern crate serde_json;
extern crate iron;
use self::iron;
use self::iron::prelude::*;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MyStruct {
}
struct ResponseTime;
impl typemap::Key for ResponseTime {
type Value = u64;
}
#[derive(Debug)]
struct RequestBody;
impl typemap::Key for RequestBody {
type Value = RefCell<Vec<u8>>;
}
impl BeforeMiddleware for ResponseTime {
fn before(&self, req: &mut Request) -> IronResult<()> {
req.extensions.insert::<RequestBody>(RefCell::new(Vec::new()));
req.extensions.insert::<ResponseTime>(precise_time_ns());
Ok(())
}
}
impl AfterMiddleware for ResponseTime {
fn after(&self, req: &mut Request, res: Response) -> IronResult<Response> {
Ok(res)
}
fn catch(&self, req : &mut Request, err : IronError) -> IronResult<Response> {
let ref byte_req = *req.extensions.get::<RequestBody>()
.unwrap()
.borrow();
//just to make sure uft8 is not causing some issue.
let payload = unsafe {
str::from_utf8_unchecked(&byte_req)
};
//but when i send request body all comes good
error!("Error {} for Body {}", err, payload);
Err(err)
}
}
fn iron_handler(req : &mut Request) -> Result<Response, CustomError>{
let mut buffer = req.extensions.get::<server::RequestBody>()
.unwrap()
.borrow_mut();
req.body.read_to_end(&mut buffer)?;
// not seeing InvalidUnicodeCodePoint after this.
let payload = String::from_utf8_lossy(&buffer);
//some request throw error
let my_struct_obj : MyStruct = serde_json::from_str(&payload)?;
Ok(Response::with((iron::status::Ok, "Final Response")))
}
Нужна помощь, чтобы выяснить, как определить проблему. Намерение публикации здесь, чтобы видеть, имел ли кто-то ту же самую проблему или может видеть очевидную проблему с этим. Цените все время, не рассчитывайте собирать и запускать примеры, так как не можете их предоставить из-за конфиденциальности.