source: SMSSender/lib/libgateway/src/business/HttpCookieManager.cpp @ 41:680c6a482e9d

3.0
Last change on this file since 41:680c6a482e9d was 41:680c6a482e9d, checked in by Sämy Zehnder <saemy.zehnder@…>, 12 years ago
File size: 3.3 KB
Line 
1#include "HttpCookieManager.h"
2
3#include <QDebug>
4#include <QRegExp>
5
6bool HttpCookie::isApplicable(const QUrl& url) const {
7    // Secure check
8    if ((url.scheme().toLower() != "secure") && secure) {
9        return false;
10    }
11
12    // TODO: check expiry
13
14    // Domain check
15    QString domain_ = domain;
16    if (domain_.startsWith(".")) {
17        domain_ = "*" + domain_; // .example.com -> *.example.com
18    }
19
20    QRegExp rx(domain_, Qt::CaseInsensitive, QRegExp::Wildcard);
21    if (!rx.exactMatch(url.host())) {
22        return false;
23    }
24
25    // Path check
26    if (!url.path().startsWith(path)) {
27        return false;
28    }
29
30    return true;
31}
32
33
34
35HttpCookieManager::HttpCookieManager(QHttp* http)
36    : http_(http)
37{
38    connect(http_, SIGNAL(responseHeaderReceived(const QHttpResponseHeader&)),
39            this, SLOT(parseResponseHeader(const QHttpResponseHeader&)));
40
41}
42
43HttpCookieManager::~HttpCookieManager() {
44    disconnect(http_, SIGNAL(responseHeaderReceived(const QHttpResponseHeader&)),
45               this, SLOT(parseResponseHeader(const QHttpResponseHeader&)));
46}
47
48
49void HttpCookieManager::addCookieToHeader(QHttpRequestHeader* header, const QUrl& url) const {
50    if (isCookieSet()){
51        QString cookieStr;
52        QMapIterator<QString, HttpCookie*> i(cookies_);
53        while (i.hasNext()) {
54            i.next();
55            HttpCookie* cookie = i.value();
56
57            if (cookie->isApplicable(url)){
58                cookieStr += i.key() + "=" + cookie->value + "; ";
59            }
60        }
61        cookieStr.remove(QRegExp("; $")); // Remove last ;
62        //qDebug() << cookieStr;
63
64        header->addValue("Cookie", cookieStr);
65    }
66}
67
68bool HttpCookieManager::isCookieSet() const {
69    return !cookies_.empty();
70}
71
72void HttpCookieManager::clearCookies() {
73    cookies_.clear();
74}
75
76void HttpCookieManager::processResponseHeader(const QHttpResponseHeader& responseHeader) {
77    parseResponseHeader(responseHeader);
78}
79
80void HttpCookieManager::parseResponseHeader(const QHttpResponseHeader& responseHeader) {
81    QStringList cookies = responseHeader.allValues("set-cookie");
82
83    QStringListIterator i(cookies);
84    while (i.hasNext()) {
85        QStringList cookieParts = i.next().split(";", QString::SkipEmptyParts);
86
87        QString key;
88        HttpCookie* cookie= new HttpCookie();
89
90        int x = 0;
91        QStringListIterator i(cookieParts);
92        while (i.hasNext()) {
93            QRegExp rx("^([^=]*)=(.*)$");
94            if (rx.indexIn(i.next().trimmed()) != -1) {
95                //qDebug() << rx.cap(1) << " " << rx.cap(2);
96                if        (rx.cap(1).toLower() == "path") {
97                    cookie->path = rx.cap(2);
98
99                } else if (rx.cap(1).toLower() == "domain") {
100                    cookie->domain = rx.cap(2);
101
102                } else if (rx.cap(1).toLower() == "expires") {
103                        // Fri, 31-Dec-2010 23:59:59 GMT
104                        cookie->expiresOn = QDateTime::fromString(rx.cap(2), "ddd', 'dd'-'MMM'-'yyyy' 'hh':'mm':'ss' GMT'");
105
106                } else if (rx.cap(1).toLower() == "secure") {
107                        cookie->secure = true;
108
109                } else if (x == 0){
110                    key           = rx.cap(1);
111                    cookie->value = rx.cap(2);
112                }
113
114                x++;
115            }
116        }
117
118        cookies_[key] = cookie;
119    }
120}
Note: See TracBrowser for help on using the repository browser.