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")))
}

Нужна помощь, чтобы выяснить, как определить проблему. Намерение публикации здесь, чтобы видеть, имел ли кто-то ту же самую проблему или может видеть очевидную проблему с этим. Цените все время, не рассчитывайте собирать и запускать примеры, так как не можете их предоставить из-за конфиденциальности.

0 ответов

Другие вопросы по тегам