http-проводник использование браузера - PullRequest
8 голосов
/ 26 февраля 2012

Я пытаюсь очистить данные с сайта, используя HTTPS. Мне удалось выполнить базовые запросы с использованием Network.HTTP.Conduit (отправка учетных данных и т. Д.), Но мне не удалось извлечь информацию о файлах cookie из заголовков ответов (Set-Cookie). Похоже, что http-проводник имеет свой собственный механизм для работы с файлами cookie, который я не смог понять.

Network.HTTP.Conduit.Browser, похоже, автоматически обрабатывает файлы cookie (мне это подходит), но я не могу заставить их работать из-за отсутствия документации .

Может ли кто-нибудь с большим опытом работы с модулем браузера http -роводник показать мне, как:

  1. Разобраться с самозаверяющими сертификатами (мне удалось сделать это с managerCheckCerts в базовом модуле)
  2. Отправить запрос POST с параметрами в кодировке URL в теле, не следуя никаким перенаправлениям (для этого я использовал urlEncodedBody из базового модуля)
  3. Используйте куки из шага 2. в простом запросе GET и прочитайте ответ как (ленивый) ByteString (я бы использовал для этого httpLbs )

Мне кажется, что уровень абстракции Network.HTTP.Conduit.Browser больше подходит для моего приложения, чем Network.HTTP.Conduit, поэтому я бы хотел переключиться, даже если бы я мог вручную обращаться с файлами cookie, используя последний.

1 Ответ

2 голосов
/ 05 января 2013

Я никогда не использовал Браузер, но я использовал http-проводник. Я читаю исходный код, чтобы ответить на эти вопросы, прошу прощения, если я сделаю какие-либо ошибки.

  1. Сделайте то же самое, что и вы. Когда вы создали Manager с правом managerCheckCerts, передайте его browse :: Manager -> BrowserAction a -> ResourceT IO a.

  2. makeRequest :: Request IO -> BrowserAction (Response (Source IO BS.ByteString)) занимает Request IO; используйте urlEncodedBody как прежде, чтобы создать запрос POST с параметрами в теле и передать его makeRequest. Я полагаю, что для redirectCount установлено значение 0, чтобы отключить перенаправление.

  3. Полагаю, вам просто нужно использовать getCookieJar :: BrowserAction CookieJar; BrowserAction происходит от getBrowserState :: BrowserAction BrowserState.

http-проводник управляет файлами cookie вне модуля браузера, а не управляет ими. Cookies возвращаются в ответе HTTP; то, что вы можете сделать, это проанализировать ответ и сохранить куки в банке с печеньем. Это на самом деле все, что браузер действительно делает.

...