Я использую webRequest-API в WebExtension для отслеживания запросов, сделанных клиентом. Это работает довольно хорошо, однако API ведет себя не так, как ожидалось, в случае перенаправления:
В этом случае выдается POST
, на который отвечает 302 FOUND
и новое местоположение. Мой браузер (Firefox 57, другие версии и другие браузеры — например, Chrome — действуют таким же образом) следует этому перенаправлению и теперь выдает GET
на новое место.
К сожалению, webRequest-API ведет себя иначе: он отслеживает первый POST
(что правильно), но затем обрабатывает второй запрос также как POST
, тогда как он должен быть GET
. Это серьезная проблема, поскольку API отслеживает то, что предположительно сделал мой браузер, что на самом деле он сделал другим способом...
Этот сценарий (часть браузера) можно воспроизвести, следуя ссылка на веб-сайт surfnet.nl и выбор IDP из списка (например, Academisch Medisch Centrum).
Итак, короче говоря: почему поведение webRequest-API отличается от того, как ведут себя браузеры? И есть ли способ позволить ему точно отслеживать действия браузера?
Интересно, что webRequest-API может сделать это правильно, относительно документации< /а>:
Даже если спецификация требует, чтобы метод и тело не изменялись при выполнении перенаправления, не все пользовательские агенты соответствуют этому [браузеры, очевидно, меняются метод!], и вы все еще можете найти там программное обеспечение с ошибками. Поэтому рекомендуется устанавливать код 302 только в качестве ответа для методов GET или HEAD и вместо этого использовать временное перенаправление 307, так как изменение метода в этом случае явно запрещено. В тех случаях, когда вы хотите, чтобы используемый метод был изменен на GET, вместо этого используйте 303 See Other.
EDIT: кажется, что браузер изменил метод на 302
по историческим причинам, хотя это противоречит RFC 2616...
- https://stackoverflow.com/a/8139246/594832
- https://trac.ietf.org/trac/httpbis/ticket/160
- https://stackoverflow.com/a/8138447/594832
В любом случае... остается вопрос: как я могу заставить webRequest-API действовать таким же образом?