У меня есть сервер actix-web
, использующий промежуточное ПО HttpAuthentication
для аутентификации всех запросов. Сервер работает нормально и правильно отвечает на большинство запросов, но иногда определенные запросы вызывают ошибку:
thread 'actix-rt:worker:2' panicked at 'AuthenticationMiddleware was called already
Запрос к той же конечной точке вызовет только иногда возникает ошибка, поэтому я не уверен, в чем причина root.
Моя main()
функция (включая только соответствующий код:
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
// Some configuration code here
HttpServer::new(move || {
App::new()
.wrap(
HttpAuthentication::basic(validator)
)
// other code here
})
.bind(ip)?
.run()
.await
}
Функция validator
, переданная в качестве аргумента process_fn
в HttpAuthentication::basic
:
async fn validator(
req: ServiceRequest,
credentials: BasicAuth,
) -> Result<ServiceRequest, Error> {
let config = req.app_data::<Config>()
.map(|data| data.get_ref().clone())
.unwrap_or_else(Default::default)
.scope("urn:example:channel=HBO&urn:example:rating=G,PG-13");
let username = env::var("USERNAME")
.expect("USERNAME must be set");
let password = env::var("PASSWORD")
.expect("USERNAME must be set");
if credentials.user_id().deref() == username {
match credentials.password() {
Some(pass) => {
if pass.deref() == password {
Ok(req)
} else {
Err(AuthenticationError::from(config).into())
}
}
None => Err(AuthenticationError::from(config).into())
}
} else {
Err(AuthenticationError::from(config).into())
}
}
Эта функция, по сути, просто проверяет действительность базового c имени пользователя и пароля аутентификации, отправленных в запросе. Насколько я понимаю, это должно заключать каждую конечную точку на сервере и разрешать только аутентифицированные запросы через .
Я не понимаю, почему я получаю эту ошибку времени выполнения. Есть ли у кого-нибудь идеи относительно того, почему это происходит?