summaryrefslogtreecommitdiffabout
path: root/lib
authorMichael Krelin <hacker@klever.net>2007-08-09 00:01:12 (UTC)
committer Michael Krelin <hacker@klever.net>2007-08-09 00:01:12 (UTC)
commit94e566c912f97b4c9e47353e10e86649ee8060a4 (patch) (side-by-side diff)
treea11910bf677723a7eabccad161ec0b85426293ff /lib
parent4696aae9da3500f600cedd482501a89d41fd27ec (diff)
downloadlibopkele-94e566c912f97b4c9e47353e10e86649ee8060a4.zip
libopkele-94e566c912f97b4c9e47353e10e86649ee8060a4.tar.gz
libopkele-94e566c912f97b4c9e47353e10e86649ee8060a4.tar.bz2
make canonicalize follow redirects
- renamed old consumer_t::canonicalize to consumer_t::normalize - made the real canonicalize virtual to allow caching layer
Diffstat (limited to 'lib') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/consumer.cc26
1 files changed, 25 insertions, 1 deletions
diff --git a/lib/consumer.cc b/lib/consumer.cc
index 282f0cc..dd8e150 100644
--- a/lib/consumer.cc
+++ b/lib/consumer.cc
@@ -301,25 +301,25 @@ namespace opkele {
if(!server.empty())
break;
}
}
if(server.empty())
throw failed_assertion(OPKELE_CP_ "The location has no openid.server declaration");
}
assoc_t consumer_t::find_assoc(const string& server) {
throw failed_lookup(OPKELE_CP_ "no find_assoc() provided");
}
- string consumer_t::canonicalize(const string& url) {
+ string consumer_t::normalize(const string& url) {
string rv = url;
// strip leading and trailing spaces
string::size_type i = rv.find_first_not_of(" \t\r\n");
if(i==string::npos)
throw bad_input(OPKELE_CP_ "empty URL");
if(i)
rv.erase(0,i);
i = rv.find_last_not_of(" \t\r\n");
assert(i!=string::npos);
if(i<(rv.length()-1))
rv.erase(i+1);
// add missing http://
@@ -333,13 +333,37 @@ namespace opkele {
string::size_type qm = rv.find('?',i);
string::size_type sl = rv.find('/',i);
if(qm!=string::npos) {
if(sl==string::npos || sl>qm)
rv.insert(qm,1,'/');
}else{
if(sl==string::npos)
rv += '/';
}
return rv;
}
+ string consumer_t::canonicalize(const string& url) {
+ string rv = normalize(url);
+ curl_t curl = curl_easy_init();
+ if(!curl)
+ throw exception_curl(OPKELE_CP_ "failed to curl_easy_init()");
+ string html;
+ CURLcode r;
+ (r=curl_misc_sets(curl))
+ || (r=curl_easy_setopt(curl,CURLOPT_URL,rv.c_str()))
+ || (r=curl_easy_setopt(curl,CURLOPT_NOBODY,1))
+ ;
+ if(r)
+ throw exception_curl(OPKELE_CP_ "failed to curl_easy_setopt()",r);
+ r = curl_easy_perform(curl);
+ if(r)
+ throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r);
+ const char *eu = 0;
+ r = curl_easy_getinfo(curl,CURLINFO_EFFECTIVE_URL,&eu);
+ if(r)
+ throw exception_curl(OPKELE_CP_ "failed to curl_easy_getinfo(..CURLINFO_EFFECTIVE_URL..)",r);
+ rv = eu;
+ return normalize(rv);
+ }
+
}