author | Michael Krelin <hacker@klever.net> | 2007-09-11 22:44:51 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2007-09-11 22:44:51 (UTC) |
commit | 429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3 (patch) (unidiff) | |
tree | 7f314d7f129a60325bf21723ad261570d36220cd /lib | |
parent | 2c6565f363527142928062afe3d3101fdbb3c550 (diff) | |
download | libopkele-429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3.zip libopkele-429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3.tar.gz libopkele-429c48d3d08e6c2f6c385d8975f7b5bf5e67acf3.tar.bz2 |
added support for crappy libpcre c++ bindings
Added optional support for crappy google's c++ bindings. The bindings are
ridiculously googley, so I think, taking into account the amount of pcre
involved, I'll soon drop requirement for any bindings and will use libpcre
directly.
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | lib/consumer.cc | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/lib/consumer.cc b/lib/consumer.cc index 8f66688..299b3bc 100644 --- a/lib/consumer.cc +++ b/lib/consumer.cc | |||
@@ -9,3 +9,2 @@ | |||
9 | #include <curl/curl.h> | 9 | #include <curl/curl.h> |
10 | #include <pcre++.h> | ||
11 | 10 | ||
@@ -15,2 +14,10 @@ | |||
15 | 14 | ||
15 | #if defined(USE_LIBPCRECPP) | ||
16 | # include <pcrecpp.h> | ||
17 | #elif defined(USE_PCREPP) | ||
18 | # include <pcre++.h> | ||
19 | #else | ||
20 | /* internal implementation won't be built */ | ||
21 | #endif | ||
22 | |||
16 | namespace opkele { | 23 | namespace opkele { |
@@ -263,2 +270,3 @@ namespace opkele { | |||
263 | void consumer_t::retrieve_links(const string& url,string& server,string& delegate) { | 270 | void consumer_t::retrieve_links(const string& url,string& server,string& delegate) { |
271 | #if defined(USE_LIBPCRECPP) || defined(USE_PCREPP) | ||
264 | server.erase(); | 272 | server.erase(); |
@@ -280,7 +288,36 @@ namespace opkele { | |||
280 | throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r); | 288 | throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r); |
281 | pcrepp::Pcre bre("<body\\b",PCRE_CASELESS); | ||
282 | // strip out everything past body | 289 | // strip out everything past body |
290 | static const char *re_hdre = "<head[^>]*>", | ||
291 | *re_lre = "<link\\b([^>]+)>", | ||
292 | *re_rre = "\\brel=['\"]([^'\"]+)['\"]", | ||
293 | *re_hre = "\\bhref=['\"]([^'\"]+)['\"]"; | ||
294 | #if defined(USE_LIBPCRECPP) | ||
295 | static pcrecpp::RE_Options ro(PCRE_CASELESS|PCRE_DOTALL); | ||
296 | static pcrecpp::RE | ||
297 | bre("<body\\b.*",ro), hdre(re_hdre,ro), | ||
298 | lre(re_lre,ro), rre(re_rre), hre(re_hre,ro); | ||
299 | bre.Replace("",&html); | ||
300 | pcrecpp::StringPiece hpiece(html); | ||
301 | if(!hdre.FindAndConsume(&hpiece)) | ||
302 | throw bad_input(OPKELE_CP_ "failed to find head"); | ||
303 | string attrs; | ||
304 | while(lre.FindAndConsume(&hpiece,&attrs)) { | ||
305 | pcrecpp::StringPiece rel, href; | ||
306 | if(!(rre.PartialMatch(attrs,&rel) && hre.PartialMatch(attrs,&href))) | ||
307 | continue; | ||
308 | if(rel=="openid.server") { | ||
309 | href.CopyToString(&server); | ||
310 | if(!delegate.empty()) | ||
311 | break; | ||
312 | }else if(rel=="openid.delegate") { | ||
313 | href.CopyToString(&delegate); | ||
314 | if(!server.empty()) | ||
315 | break; | ||
316 | } | ||
317 | } | ||
318 | #elif defined(USE_PCREPP) | ||
319 | pcrepp::Pcre bre("<body\\b",PCRE_CASELESS); | ||
283 | if(bre.search(html)) | 320 | if(bre.search(html)) |
284 | html.erase(bre.get_match_start()); | 321 | html.erase(bre.get_match_start()); |
285 | pcrepp::Pcre hdre("<head[^>]*>",PCRE_CASELESS); | 322 | pcrepp::Pcre hdre(re_hdre,PCRE_CASELESS); |
286 | if(!hdre.search(html)) | 323 | if(!hdre.search(html)) |
@@ -288,5 +325,3 @@ namespace opkele { | |||
288 | html.erase(0,hdre.get_match_end()+1); | 325 | html.erase(0,hdre.get_match_end()+1); |
289 | pcrepp::Pcre lre("<link\\b([^>]+)>",PCRE_CASELESS), | 326 | pcrepp::Pcre lre(re_lre,PCRE_CASELESS), rre(re_rre,PCRE_CASELESS), hre(re_hre,PCRE_CASELESS); |
290 | rre("\\brel=['\"]([^'\"]+)['\"]",PCRE_CASELESS), | ||
291 | hre("\\bhref=['\"]([^'\"]+)['\"]",PCRE_CASELESS); | ||
292 | while(lre.search(html)) { | 327 | while(lre.search(html)) { |
@@ -306,4 +341,10 @@ namespace opkele { | |||
306 | } | 341 | } |
342 | #else | ||
343 | #error "I must have gone crazy" | ||
344 | #endif | ||
307 | if(server.empty()) | 345 | if(server.empty()) |
308 | throw failed_assertion(OPKELE_CP_ "The location has no openid.server declaration"); | 346 | throw failed_assertion(OPKELE_CP_ "The location has no openid.server declaration"); |
347 | #else /* none of the RE bindings enabled */ | ||
348 | throw not_implemented(OPKELE_CP_ "No internal implementation of retrieve_links were provided at compile-time"); | ||
349 | #endif | ||
309 | } | 350 | } |