1

我正在使用铁。大多数时候像 99.* % 都很好。但有时我会收到错误,例如 Error is: ErrorImpl { code: EofWhileParsingString/List/Object, line: 1, column: 8186 } 或 InvalidUnicodeCodePoint。我正在日志中打印请求,当我尝试该请求时,一切都很顺利。我也有用 Golang 编写的服务器接收相同的请求,他们从来没有解析或 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")))
}

需要帮助来确定如何识别问题。在这里发帖的目的是看看是否有人有同样的问题,或者可以看到明显的问题。感谢大家的时间不要期望构建和运行示例,因为由于隐私而无法提供它们。

4

0 回答 0