author | Michael Krelin <hacker@klever.net> | 2008-01-05 19:39:07 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2008-01-05 22:03:51 (UTC) |
commit | 7bde7f66284b47a75bbceadc360e7f03550ace21 (patch) (side-by-side diff) | |
tree | 401b24fc8b952fee21ad3dce117d4baf99048c9f | |
parent | 8e3f9231383194d94e41032b64d87cc6ef1c2ee8 (diff) | |
download | libopkele-7bde7f66284b47a75bbceadc360e7f03550ace21.zip libopkele-7bde7f66284b47a75bbceadc360e7f03550ace21.tar.gz libopkele-7bde7f66284b47a75bbceadc360e7f03550ace21.tar.bz2 |
discovery: stop parser with XML_StopParser()
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | include/opkele/expat.h | 6 | ||||
-rw-r--r-- | lib/discovery.cc | 18 |
2 files changed, 16 insertions, 8 deletions
diff --git a/include/opkele/expat.h b/include/opkele/expat.h index 60c41ac..97ed61a 100644 --- a/include/opkele/expat.h +++ b/include/opkele/expat.h @@ -20,14 +20,16 @@ namespace opkele { operator const XML_Parser(void) const { return _x; } operator XML_Parser(void) { return _x; } inline bool parse(const char *s,int len,bool final=false) { assert(_x); - return XML_Parse(_x,s,len,final); - } + return XML_Parse(_x,s,len,final); } + enum XML_Status stop_parser(bool resumable=false) { + assert(_x); + return XML_StopParser(_x,resumable); } virtual void start_element(const XML_Char *n,const XML_Char **a) { } virtual void end_element(const XML_Char *n) { } void set_element_handler(); virtual void character_data(const XML_Char *s,int l) { } diff --git a/lib/discovery.cc b/lib/discovery.cc index 81727c0..8729cfb 100644 --- a/lib/discovery.cc +++ b/lib/discovery.cc @@ -2,12 +2,13 @@ #include <opkele/curl.h> #include <opkele/expat.h> #include <opkele/uris.h> #include <opkele/discovery.h> #include <opkele/exception.h> #include <opkele/util.h> +#include <opkele/debug.h> #include "config.h" #define XRDS_HEADER "X-XRDS-Location" #define CT_HEADER "Content-Type" @@ -172,13 +173,17 @@ namespace opkele { } size_t write(void *p,size_t s,size_t nm) { if(skipping<0) return 0; /* TODO: limit total size */ size_t bytes = s*nm; - parse((const char *)p,bytes,false); + bool rp = parse((const char *)p,bytes,false); + if(!rp) { + skipping = -1; + bytes = 0; + } return bytes; } size_t header(void *p,size_t s,size_t nm) { size_t bytes = s*nm; const char *h = (const char*)p; const char *colon = (const char*)memchr(p,':',bytes); @@ -222,13 +227,13 @@ namespace opkele { assert(xrd); xrd->clear(); pt_stack.push_back(n); }else if(xmode&xmode_html) { html_start_element(n,a); }else{ - skipping = -1; + skipping = -1; stop_parser(); } }else{ int pt_s = pt_stack.size(); if(pt_s==1) { if(is_qelement(n,NSURI_XRD "\tCanonicalID")) { assert(xrd); @@ -307,20 +312,21 @@ namespace opkele { xrd_service = 0; }else if(is_qelement(n,NSURI_XRD "\tStatus")) { assert(xrd); if(is_qelement(pt_stack.back().c_str(),n)) { assert(cdata==&status_string); pt_stack.pop_back(); - if(status_code!=100) - skipping = -1; + if(status_code!=100) { + skipping = -1; stop_parser(); + } } }else if(is_qelement(n,NSURI_XRD "\tExpires")) { assert(xrd); xrd->expires = util::w3c_to_time(cdata_buf); }else if((xmode&xmode_html) && is_element(n,"head")) { - skipping = -1; + skipping = -1; stop_parser(); } cdata = 0; } void character_data(const XML_Char *s,int l) { if(skipping) return; if(cdata) cdata->append(s,l); @@ -371,13 +377,13 @@ namespace opkele { else if(rel=="openid2.provider") html_openid2.uris.add(-1,href); else if(rel=="openid2.local_id") html_openid2.local_ids.add(-1,href); } }else if(is_element(n,"body")) { - skipping = -1; + skipping = -1; stop_parser(); } } }; void idiscover(idiscovery_t& result,const string& identity) { |