-rw-r--r-- | lib/consumer.cc | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/lib/consumer.cc b/lib/consumer.cc index 7f31d52..f72ae08 100644 --- a/lib/consumer.cc +++ b/lib/consumer.cc @@ -327,3 +327,3 @@ namespace opkele { *re_lre = "<\\s*link\\b([^>]+)>", - *re_rre = "\\brel\\s*=\\s*['\"]\\s*([^'\"\\s]+)\\s*['\"]", + *re_rre = "\\brel\\s*=\\s*['\"]([^'\"]+)['\"]", *re_hre = "\\bhref\\s*=\\s*['\"]\\s*([^'\"\\s]+)\\s*['\"]"; @@ -338,3 +338,5 @@ namespace opkele { pcre_t lre(re_lre,PCRE_CASELESS), rre(re_rre,PCRE_CASELESS), hre(re_hre,PCRE_CASELESS); - while(lre.exec(html,m1)>=2) { + bool gotit = false; + while( (!gotit) && lre.exec(html,m1)>=2 ) { + static const char *whitespace = " \t"; string attrs(html,m1.begin(1),m1.length(1)); @@ -343,9 +345,29 @@ namespace opkele { continue; - string rel(attrs,m1.begin(1),m1.length(1)); - if(rel=="openid.server") { - server.assign(attrs,m2.begin(1),m2.length(1)); - if(!delegate.empty()) break; - }else if(rel=="openid.delegate") { - delegate.assign(attrs,m2.begin(1),m2.length(1)); - if(!server.empty()) break; + string rels(attrs,m1.begin(1),m1.length(1)); + for(string::size_type ns = rels.find_first_not_of(whitespace); + ns!=string::npos; + ns=rels.find_first_not_of(whitespace,ns)) { + string::size_type s = rels.find_first_of(whitespace,ns); + string rel; + if(s==string::npos) { + rel.assign(rels,ns,string::npos); + ns=string::npos; + }else{ + rel.assign(rels,ns,s-ns); + ns=s; + } + if(rel=="openid.server") { + server.assign(attrs,m2.begin(1),m2.length(1)); + if(!delegate.empty()) { + gotit = true; + break; + } + }else if(rel=="openid.delegate") { + delegate.assign(attrs,m2.begin(1),m2.length(1)); + if(!server.empty()) { + gotit = true; + break; + } + } + if(ns==string::npos) break; } |