Ошибка выполнения Actix-Web: поток «actix-rt: worker: 2» запаниковал, увидев «AuthenticationMiddleware уже был вызван» - PullRequest
0 голосов
/ 06 мая 2020

У меня есть сервер 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 имени пользователя и пароля аутентификации, отправленных в запросе. Насколько я понимаю, это должно заключать каждую конечную точку на сервере и разрешать только аутентифицированные запросы через .

Я не понимаю, почему я получаю эту ошибку времени выполнения. Есть ли у кого-нибудь идеи относительно того, почему это происходит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...