-rw-r--r-- | lib/discovery.cc | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/lib/discovery.cc b/lib/discovery.cc index bd1f917..26f3eed 100644 --- a/lib/discovery.cc +++ b/lib/discovery.cc @@ -283,6 +283,7 @@ namespace opkele { (*(expat_t*)this) = parser_create_ns(); set_user_data(); set_element_handler(); set_character_data_handler(); + set_unknown_encoding_handler(); if(xmode&xmode_html) { html_openid1.clear(); html_openid2.clear(); @@ -453,25 +454,40 @@ namespace opkele { --skipping; return; } if(is_qelement(n,NSURI_XRD "\tType")) { - assert(xrd); assert(xrd_service); assert(cdata==&cdata_buf); + if(xrd && xrd_service) { + assert(cdata==&cdata_buf); xrd_service->types.insert(cdata_buf); + } }else if(is_qelement(n,NSURI_XRD "\tService")) { - assert(xrd); assert(xrd_service); + if(!(xrd && xrd_service)) { + skipping = -1; + }else{ assert(!pt_stack.empty()); assert(pt_stack.back()==(NSURI_XRD "\tService")); pt_stack.pop_back(); xrd_service = 0; + } }else if(is_qelement(n,NSURI_XRD "\tStatus")) { - assert(xrd); + if(!xrd) { + skipping=-1; + }else{ if(is_qelement(pt_stack.back().c_str(),n)) { assert(cdata==&status_string); pt_stack.pop_back(); if(status_code!=100) skipping = -1; } + } }else if(is_qelement(n,NSURI_XRD "\tExpires")) { - assert(xrd); + if(!xrd) { + skipping=-1; + }else{ xrd->expires = util::w3c_to_time(cdata_buf); + } + }else if(is_qelement(n,NSURI_XRD "\tXRD")) { + assert(!pt_stack.empty()); + assert(pt_stack.back()==(NSURI_XRD "\tXRD")); + pt_stack.pop_back(); }else if((xmode&xmode_html) && is_element(n,"head")) { skipping = -1; } @@ -569,6 +585,13 @@ namespace opkele { } } + int unknown_encoding(const XML_Char *n,XML_Encoding *i) { + for(int ii=0;ii < sizeof(i->map)/sizeof(i->map[0]);++ii) + i->map[ii] = ii; + i->convert = 0; i->release = 0; + return XML_STATUS_OK; + } + }; string idiscover(endpoint_discovery_iterator oi,const string& identity) { |