void Controller::setStickySessionId(Client *client, Request *req) { if (req->stickySession) { // TODO: This is not entirely correct. Clients MAY send multiple Cookie // headers, although this is in practice extremely rare. // http://stackoverflow.com/questions/16305814/are-multiple-cookie-headers-allowed-in-an-http-request const LString *cookieHeader = req->headers.lookup(HTTP_COOKIE); if (cookieHeader != NULL && cookieHeader->size > 0) { const LString *cookieName = getStickySessionCookieName(req); vector< pair<StaticString, StaticString> > cookies; pair<StaticString, StaticString> cookie; parseCookieHeader(req->pool, cookieHeader, cookies); foreach (cookie, cookies) { if (psg_lstr_cmp(cookieName, cookie.first)) { // This cookie matches the one we're looking for. req->options.stickySessionId = stringToUint(cookie.second); return; } } } } }
/** * parse key-value pairs out of a "Cookie" request header * (i.e. this=that; a=value) * * @param dict dictionary for key-values pairs * @param cookie_header header string to be parsed * @param set_cookie_header set true if parsing Set-Cookie response header * * @return bool true if successful */ static inline bool parseCookieHeader(HTTPTypes::CookieParams& dict, const std::string& cookie_header, bool set_cookie_header) { return parseCookieHeader(dict, cookie_header.c_str(), cookie_header.size(), set_cookie_header); }