Friday 15 February 2013

swift - Remembering cookies with Alamofire -



swift - Remembering cookies with Alamofire -

i'm trying create alamofire manager instance automatically remember & set cookies, here unsuccessful effort :

let cfg = nsurlsessionconfiguration.defaultsessionconfiguration() allow cooks = nshttpcookiestorage.sharedhttpcookiestorage() // makes no difference whether it's set or left @ default cfg.httpcookiestorage = cooks cfg.httpcookieacceptpolicy = nshttpcookieacceptpolicy.always allow mgr = alamofire.manager(configuration: cfg) mgr.request(nsurlrequest(url: nsurl(string: "http://httpbin.org/cookies/set?stack=overflow"))).responsestring { (_, _, response, _) in var resp = response // { "cookies": { "stack": "overflow" } } // becomes empty if cfg.httpcookiestorage set nil } mgr.request(nsurlrequest(url: nsurl(string: "http://httpbin.org/cookies"))).responsestring { (_, _, response, _) in var resp = response // { "cookies": {} } // empty no matter } cooks.cookiesforurl(nsurl(string: "http://httpbin.org/cookies")) // 0 elements

the first url sends set-cookie : stack=overflow; path=/ header , redirects (302) /cookies (equivalent of sec url); works fine in browser (once nail first url sec url display cookie) i'd replicate behavior alamofire.

your code working - aren't taking business relationship you're calling asynchronous methods when request. when code executed, happens -- each phone call mgr.request(...) initiates new asynchronous phone call doesn't resolve until after code above has executed:

| configure mgr | | request /cookies/set?... ---- | \ | request /cookies ---- | | \ | | cookiesforurl() | | | | | | [function returns] | | | | ...time passes... | | / | /cookies handler ---- | | ...more time... | / /cookies/set? handler -------

(the order of lastly 2 handlers indeterminate - depends on server / traffic / etc.)

so request "http://httpbin.org/cookies" doesn't include cookies, since request set cookies sent 1 instruction prior. see cookies, you'd need wait until first phone call returns send next request. wrapped things in uiviewcontroller subclass:

class cookieviewcontroller: uiviewcontroller { // mgr needs still exist when response handlers called var mgr: alamofire.manager! allow cookies = nshttpcookiestorage.sharedhttpcookiestorage() func configuremanager() -> alamofire.manager { allow cfg = nsurlsessionconfiguration.defaultsessionconfiguration() cfg.httpcookiestorage = cookies homecoming alamofire.manager(configuration: cfg) } func setcookies() { mgr.request(nsurlrequest(url: nsurl(string: "http://httpbin.org/cookies/set?stack=overflow")!)).responsestring { (_, _, response, _) in var resp = response // { "cookies": { "stack": "overflow" } } println(resp) // cookies part of urlsession - // can inspect them , phone call next url println(self.cookies.cookiesforurl(nsurl(string: "http://httpbin.org/cookies")!)) self.checkcookies() } } func checkcookies() { mgr.request(nsurlrequest(url: nsurl(string: "http://httpbin.org/cookies")!)).responsestring { (_, _, response, _) in var resp = response // { "cookies": { "stack": "overflow" } } println(resp) } } override func viewdidload() { super.viewdidload() mgr = configuremanager() setcookies() } }

swift alamofire

No comments:

Post a Comment