HTTP POST запрос зависает навсегда? - PullRequest
0 голосов
/ 02 ноября 2019

Почему мой HTTP-запрос не возвращается? Он просто висит навсегда, пока я не остановлю свой веб-сервер. Мой стек вызовов - это apache2 + пассажирский фьюжн + Flask.

Некоторый контекст: я собираюсь использовать модуль apache2 mod_auth_form со встроенным сохранением тела для аутентификации пользователя, используя сценарий WSGI и настройкисоответствующие сессионные куки с Apache с mod_auth_session . Это довольно стандартный материал для обычных HTML-страниц. Я хотел добавить некоторые украшения на страницу входа в систему с помощью веб-сервера. И по большей части это работает - за исключением случаев, когда пользователь вводит неверные учетные данные.

Вот соответствующая конфигурация сайтов apache2:

    Session on
    SessionCryptoPassphrase it_is_a_secure_passphrase
    SessionCookieName session path=/;httponly;secure;

    PassengerPython /usr/bin/python3
    PassengerBaseURI /
    PassengerErrorOverride on
    PassengerAppGroupName flask
    PassengerAppRoot /home/devuser/Desktop/FlaskProject
    PassengerStartupFile webapp.wsgi
    PassengerAppType wsgi
    PassengerEnabled on
    PassengerLogLevel 4


    <Location "/static">
        PassengerEnabled off
    </Location>

    <Location "/secure">
        Require valid-user
        AuthName "top secret"
        AuthFormProvider wsgi
        AuthType form
        WSGIAuthUserScript /home/devuser/Desktop/FlaskProject/webapp/secure/authenticator.py
        ErrorDocument 401 "/index"
        AuthFormMethod form_method
        AuthFormBody form_body
        AuthFormMimetype form_mimetype
        AuthFormUsername form_username
        AuthFormPassword form_passwd
    </Location>

    <Location "/tester">
        PassengerEnabled off
        Require valid-user
        AuthName "top secret"
        AuthFormProvider wsgi
        WSGIAuthUserScript /home/devuser/Desktop/FlaskProject/webapp/secure/authenticator.py
        AuthType form
        ErrorDocument 401 "/login.html"
        AuthFormMethod form_method
        AuthFormBody form_body
        AuthFormMimetype form_mimetype
        AuthFormUsername form_username
        AuthFormPassword form_passwd
    </Location>

    <Location "/login.html">
        PassengerEnabled off
    </Location>

Намерение здесь, если пользователь посещает / безопасный/ some_secure_url / sample_file, когда еще не аутентифицировано, страница встроенного входа в систему (в данном случае маршрут для "/ index") будет обслуживаться из веб-приложения, и в случае успеха запрос будет перенаправлен на исходный URLотсюда и термин «встроенный вход в систему».

Это прекрасно работает, когда учетные данные верны, но зависает, когда учетные данные неверны и документ об ошибке 401 обслуживается пассажиром phusion,Если я заменю веб-сервер phusion обычным вызовом WSGI cgi / script , все будет работать отлично. Если я использую apache, но не использую вход в систему в виде встроенной формы, он работает нормально. И если я использую тот же HTML-файл без веб-сервера, такого как Phusion / flask, он работает нормально. Проблема возникает только в том случае, если я ввожу неверные учетные данные и только в том случае, если она обслуживается phusion / flaskТак что это не проблема со скриптом аутентификации, который очень прост.

Так почему же apache / phusion / flask никогда не отправляет ответ? Я проверил журналы ошибок, и я точно знаю, что скрипт аутентификации вызывается с переданными данными. Это похоже на то, как если бы браузер открыл соединение, а сокет остается открытым после того, как mod_auth_form вызывает скрипт аутентификации WSGI. Даже если я попытаюсь эмулировать почтовый запрос с помощью JQuery $ .post ('/ secure / blah', {...}) с соответствующими данными, он тоже не вернется ... если учетные данные не верны, в которыхесли он ведет себя так, как я ожидал.

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