-rw-r--r-- | lib/consumer.cc | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/lib/consumer.cc b/lib/consumer.cc index 7f31d52..f72ae08 100644 --- a/lib/consumer.cc +++ b/lib/consumer.cc @@ -326,5 +326,5 @@ namespace opkele { static const char *re_bre = "<\\s*body\\b", *re_hdre = "<\\s*head[^>]*>", *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*['\"]"; pcre_matches_t m1(3), m2(3); @@ -337,16 +337,38 @@ namespace opkele { html.erase(0,m1.end(0)+1); 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)); html.erase(0,m1.end(0)+1); if(!( rre.exec(attrs,m1)>=2 && hre.exec(attrs,m2)>=2 )) continue; - string rel(attrs,m1.begin(1),m1.length(1)); + 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()) break; + if(!delegate.empty()) { + gotit = true; + break; + } }else if(rel=="openid.delegate") { delegate.assign(attrs,m2.begin(1),m2.length(1)); - if(!server.empty()) break; + if(!server.empty()) { + gotit = true; + break; + } + } + if(ns==string::npos) break; } } |