FSharpData Http.RequestString не обрабатывает "Set-Cookie" в заголовке ответа?
Обновление: я обнаружил, что проблема вызвана строкой 810 в Http.fs.
let cookies = Map.ofList [ for cookie in cookieContainer.GetCookies uri |> Seq.cast<Cookie> -> cookie.Name, cookie.Value ]
Ури начинается с https
, Однако печенье ObFormLoginCookie
был добавлен с доменом, запущенным с http
потому что нет secure
в печенье. Если запросы https не должны использовать все файлы cookie (включая те, домен которых не https
)?
Ниже приведен тестируемый код для двух запросов на веб-сайте.
open FSharp.Data.HttpRequestHeaders
open System.Configuration
open System.Net
open FSharp.Data
open System
open System.Web
open System.Reflection
let headers = [
UserAgent ConfigurationManager.AppSettings.["UserAgent"]
Accept "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
KeepAlive "true"
]
let customized (req : HttpWebRequest) =
//req.Proxy <- WebProxy(ConfigurationManager.AppSettings.["Proxy"], true)
req.AllowAutoRedirect <- false
req
let cc = CookieContainer()
let printCc (cc:CookieContainer) =
let cs = cc.GetType().InvokeMember("m_domainTable", BindingFlags.NonPublic ||| BindingFlags.GetField ||| BindingFlags.Instance, null, cc, [||]) :?> System.Collections.Hashtable
for x in cs.Keys do
let s = string x
let x = if s.StartsWith(".") then s.Substring(1, s.Length - 1) else s
let cookie = cc.GetCookies(new Uri(sprintf "https://%s/" x))
printfn "%s:" s
for y in cookie do
printfn "Name=%s; Value=%s; Domain=%s" y.Name (sprintf "%s..." (y.Value.Substring(0, 7))) y.Domain
printfn ""
printfn "-------------"
let url = "https://usbtrustgateway.usbank.com/portal/login.do"
let h1 = Http.RequestString(url, httpMethod = "GET", cookieContainer = cc, headers = headers, customizeHttpRequest = customized)
printfn "Url: %s\n" url
printCc cc
let url = "https://usbtrustgateway.usbank.com/portal/"
let h2 = Http.RequestString(url, httpMethod = "GET", cookieContainer = cc, headers = headers, customizeHttpRequest = customized)
printfn "Url: %s\n" url
printCc cc
Ниже показаны действительные исходные тела ответов, если вы используете fiddler или настроили system.diagnostics в файле конфигурации.
Первый запрос:
{ Прагма: приватная, без кеша Язык контента: en-US Длина контента: 0 Cache-Control: приватный, без кеша, без хранилища, max-age = 0 Тип контента: текст / HTML Истекает: четверг, 01 января 1970 года, 00:00:00 по Гринвичу Расположение: https://usbtrustgateway.usbank.com/portal/ Сервер: X-Powered-By: Servlet/3.0,ASP.NET X-Frame-Options: SAMEORIGIN Дата: пт, 29 мая 2015 22:05:40 GMT Подключение: keep-alive Set-Cookie: ObSSOCookie= J%2BD73a9JpTHVgo%2FmepgXoObiJZQjqGiFvHhl6Iak9Khzk64RVjXFMDKvqo3wVbKV2MFOs2iHKTy5RxfoSKt4P3OpO8UIM8j6XLZZeKKLUjtL%2FlbKNj%2FwJx13pBBDKwe9X2pU%2FtSjY%2BcfnUy%2B%2B6gJ%2Bab1XW%2B9mQrcw%2FycBNa8kaTYPgU1isboEuSLh3DL6UBTjQbQhEBAvAFr9LlIF46kmzsHXQJFVvb2XsqKsaVIRNJ14EY%2BQgh3vgIEzYV8qW%2FjoidjR7S2tthfn%2BOlKli3w3owoQfcLGKj03H%2FHco6qBtoy8gGJambhE0HMGbuBsQvsNuUftwvYqeKzkUaHIiAm%2FUZh2KppsSvDtk3zdlwJS7Y%2FT1m9t7cj6nUv7Ld%2Bllp; обеспечение; HttpOnly; Путь =/; домен =.usbank.com,JSESSIONID_TGP=0000_qOg8VF7q5KeUVSHce9FCPX:-1; Path=/; HttpOnly,AidLoginSetup=readyToLogin,usbtrustgateway=!PZhxyd/9XT6sqGcZkYV27O1F5Kg1NlFKahd7AKax4J5mzSI...}
Второй запрос (обратите внимание, что Set-Cookie: ObFormLoginCookie
возвращается):
{ X-Frame-Options: SAMEORIGIN Подключение: keep-alive Длина контента: 0 Дата: пт, 29 мая 2015 22:05:40 GMT Расположение: /portal/login.do Набор файлов cookie: ObFormLoginCookie=wh%3Dusbtrustgateway.usbank.com%20wu%3D%2Fportal%2F%20wo%3D1%20rh%3Dhttps%3A%2F%2Fusbtrustgateway.usbank.com%20ru%3D%252Fportal%252F; путь = / доступ / Oblix/ приложение / WebGate/ бен /webgate.dll Сервер: X-Powered-By: ASP.NET }
Однако вывод программы отображается следующим образом. Это показывает, что Set-Cookie ObFormLoginCookie не был сохранен в контейнере cookie?
URL: https://usbtrustgateway.usbank.com/portal/login.do .usbank.com: Имя =ObSSOCookie; Значение =RzHAZfS...; Домен =.usbank.com.usbtrustgateway.usbank.com: Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя =AidLoginSetup; Значение =readyTo...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =ObSSOCookie; Значение =RzHAZfS...; Домен =.usbank.com usbtrustgateway.usbank.com: Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя =AidLoginSetup; Значение =readyTo...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =ObSSOCookie; Значение =RzHAZfS...; Домен =.usbank.com ------------- URL: https://usbtrustgateway.usbank.com/portal/ .usbank.com: Имя =ObSSOCookie; Значение =RzHAZfS...; Домен =.usbank.com.usbtrustgateway.usbank.com: Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя =AidLoginSetup; Значение =readyTo...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =ObSSOCookie; Значение =RzHAZfS...; Домен =.usbank.com usbtrustgateway.usbank.com: Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =JSESSIONID_TGP; Значение = 0000yOl...; Домен = usbtrustgateway.usbank.com Имя =AidLoginSetup; Значение =readyTo...; Домен = usbtrustgateway.usbank.com Имя = usbtrustgateway; Значение = 4iZ5aX...!; Домен = usbtrustgateway.usbank.com Имя =ObSSOCookie; Значение =RzHAZfS...; Домен =.usbank.com -------------