summaryrefslogtreecommitdiffabout
path: root/lib/discovery.cc
Unidiff
Diffstat (limited to 'lib/discovery.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/discovery.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/discovery.cc b/lib/discovery.cc
index 6f9926c..b7f2db6 100644
--- a/lib/discovery.cc
+++ b/lib/discovery.cc
@@ -138,49 +138,49 @@ namespace opkele {
138 if((fsc+1)>=lsc) 138 if((fsc+1)>=lsc)
139 throw bad_input(OPKELE_CP_ "not a character of importance in identity"); 139 throw bad_input(OPKELE_CP_ "not a character of importance in identity");
140 string id(identity,fsc,lsc-fsc+1); 140 string id(identity,fsc,lsc-fsc+1);
141 idis.clear(); 141 idis.clear();
142 if(strchr(i_leaders,id[0])) { 142 if(strchr(i_leaders,id[0])) {
143 /* TODO: further normalize xri identity? Like folding case 143 /* TODO: further normalize xri identity? Like folding case
144 * or whatever... */ 144 * or whatever... */
145 rv = id; 145 rv = id;
146 set<string> cids; 146 set<string> cids;
147 for(const struct service_type_t *st=op_service_types; 147 for(const struct service_type_t *st=op_service_types;
148 st<&op_service_types[sizeof(op_service_types)/sizeof(*op_service_types)];++st) { 148 st<&op_service_types[sizeof(op_service_types)/sizeof(*op_service_types)];++st) {
149 idis.clear(); 149 idis.clear();
150 discover_at( idis, 150 discover_at( idis,
151 xri_proxy + util::url_encode(id)+ 151 xri_proxy + util::url_encode(id)+
152 "?_xrd_t="+util::url_encode(st->uri)+ 152 "?_xrd_t="+util::url_encode(st->uri)+
153 "&_xrd_r=application/xrd%2Bxml" 153 "&_xrd_r=application/xrd%2Bxml"
154 ";sep=true;refs=true", 154 ";sep=true;refs=true",
155 xmode_xrd ); 155 xmode_xrd );
156 if(status_code==241) continue; 156 if(status_code==241) continue;
157 if(status_code!=100) 157 if(status_code!=100)
158 throw failed_xri_resolution(OPKELE_CP_ 158 throw failed_xri_resolution(OPKELE_CP_
159 "XRI resolution failed with '"+status_string+"' message" 159 "XRI resolution failed with '"+status_string+"' message"
160 ", while looking for SEP with type '"+st->uri+"'", status_code); 160 ", while looking for SEP with type '"+st->uri+"'", status_code);
161 if(idis.xrd.canonical_ids.empty()) 161 if(idis.xrd.canonical_ids.empty())
162 throw opkele::failed_discovery(OPKELE_CP_ "No CanonicalID found for XRI identity found"); 162 throw opkele::failed_discovery(OPKELE_CP_ "No CanonicalID for XRI identity found");
163 string cid = idis.xrd.canonical_ids.begin()->second; 163 string cid = idis.xrd.canonical_ids.begin()->second;
164 if(cids.find(cid)==cids.end()) { 164 if(cids.find(cid)==cids.end()) {
165 cids.insert(cid); 165 cids.insert(cid);
166 idis.clear(); 166 idis.clear();
167 discover_at( idis, 167 discover_at( idis,
168 xri_proxy + util::url_encode(id)+ 168 xri_proxy + util::url_encode(id)+
169 "?_xrd_t="+util::url_encode(st->uri)+ 169 "?_xrd_t="+util::url_encode(st->uri)+
170 "&_xrd_r=application/xrd%2Bxml" 170 "&_xrd_r=application/xrd%2Bxml"
171 ";sep=true;refs=true", 171 ";sep=true;refs=true",
172 xmode_xrd ); 172 xmode_xrd );
173 if(status_code==241) continue; 173 if(status_code==241) continue;
174 if(status_code!=100) 174 if(status_code!=100)
175 throw failed_xri_resolution(OPKELE_CP_ 175 throw failed_xri_resolution(OPKELE_CP_
176 "XRI resolution failed with '"+status_string+"' message" 176 "XRI resolution failed with '"+status_string+"' message"
177 ", while looking for SEP with type '"+st->uri+"'" 177 ", while looking for SEP with type '"+st->uri+"'"
178 " on canonical id", status_code); 178 " on canonical id", status_code);
179 } 179 }
180 idis.canonicalized_id = cid; 180 idis.canonicalized_id = cid;
181 idis.normalized_id = rv; idis.xri_identity = true; 181 idis.normalized_id = rv; idis.xri_identity = true;
182 queue_endpoints(oi,idis,st); 182 queue_endpoints(oi,idis,st);
183 } 183 }
184 }else{ 184 }else{
185 idis.xri_identity = false; 185 idis.xri_identity = false;
186 if(id.find("://")==string::npos) 186 if(id.find("://")==string::npos)
@@ -220,49 +220,49 @@ namespace opkele {
220 220
221 void discover_at(idiscovery_t& idis,const string& url,int xm) { 221 void discover_at(idiscovery_t& idis,const string& url,int xm) {
222 CURLcode r = easy_setopt(CURLOPT_MAXREDIRS, (xm&xmode_noredirs)?0:5); 222 CURLcode r = easy_setopt(CURLOPT_MAXREDIRS, (xm&xmode_noredirs)?0:5);
223 if(r) 223 if(r)
224 throw exception_curl(OPKELE_CP_ "failed to set curly maxredirs option"); 224 throw exception_curl(OPKELE_CP_ "failed to set curly maxredirs option");
225 if( (r=easy_setopt(CURLOPT_URL,url.c_str())) ) 225 if( (r=easy_setopt(CURLOPT_URL,url.c_str())) )
226 throw exception_curl(OPKELE_CP_ "failed to set curly urlie",r); 226 throw exception_curl(OPKELE_CP_ "failed to set curly urlie",r);
227 227
228 http_content_type.clear(); 228 http_content_type.clear();
229 xmode = xm; 229 xmode = xm;
230 prepare_to_parse(); 230 prepare_to_parse();
231 if(xmode&xmode_html) { 231 if(xmode&xmode_html) {
232 xrds_location.clear(); 232 xrds_location.clear();
233 save_html.clear(); 233 save_html.clear();
234 save_html.reserve(max_html); 234 save_html.reserve(max_html);
235 } 235 }
236 xrd = &idis.xrd; 236 xrd = &idis.xrd;
237 237
238 r = easy_perform(); 238 r = easy_perform();
239 if(r && r!=CURLE_WRITE_ERROR) 239 if(r && r!=CURLE_WRITE_ERROR)
240 throw exception_curl(OPKELE_CP_ "failed to perform curly request",r); 240 throw exception_curl(OPKELE_CP_ "failed to perform curly request",r);
241 241
242 if(!parser_choked) { 242 if(!parser_choked) {
243 parse(0,0,true); 243 parse(0,0,true);
244 }else{ 244 }else if(xmode&xmode_html){
245 /* TODO: do not bother if we've seen xml */ 245 /* TODO: do not bother if we've seen xml */
246 try { 246 try {
247 util::tidy_doc_t td = util::tidy_doc_t::create(); 247 util::tidy_doc_t td = util::tidy_doc_t::create();
248 if(!td) 248 if(!td)
249 throw exception_tidy(OPKELE_CP_ "failed to create htmltidy document"); 249 throw exception_tidy(OPKELE_CP_ "failed to create htmltidy document");
250#ifndef NDEBUG 250#ifndef NDEBUG
251 td.opt_set(TidyQuiet,false); 251 td.opt_set(TidyQuiet,false);
252 td.opt_set(TidyShowWarnings,false); 252 td.opt_set(TidyShowWarnings,false);
253#endif /* NDEBUG */ 253#endif /* NDEBUG */
254 td.opt_set(TidyForceOutput,true); 254 td.opt_set(TidyForceOutput,true);
255 td.opt_set(TidyXhtmlOut,true); 255 td.opt_set(TidyXhtmlOut,true);
256 td.opt_set(TidyDoctypeMode,TidyDoctypeOmit); 256 td.opt_set(TidyDoctypeMode,TidyDoctypeOmit);
257 td.opt_set(TidyMark,false); 257 td.opt_set(TidyMark,false);
258 if(td.parse_string(save_html)<=0) 258 if(td.parse_string(save_html)<=0)
259 throw exception_tidy(OPKELE_CP_ "tidy failed to parse document"); 259 throw exception_tidy(OPKELE_CP_ "tidy failed to parse document");
260 if(td.clean_and_repair()<=0) 260 if(td.clean_and_repair()<=0)
261 throw exception_tidy(OPKELE_CP_ "tidy failed to clean and repair"); 261 throw exception_tidy(OPKELE_CP_ "tidy failed to clean and repair");
262 util::tidy_buf_t tide; 262 util::tidy_buf_t tide;
263 if(td.save_buffer(tide)<=0) 263 if(td.save_buffer(tide)<=0)
264 throw exception_tidy(OPKELE_CP_ "tidy failed to save buffer"); 264 throw exception_tidy(OPKELE_CP_ "tidy failed to save buffer");
265 prepare_to_parse(); 265 prepare_to_parse();
266 parse(tide.c_str(),tide.size(),true); 266 parse(tide.c_str(),tide.size(),true);
267 }catch(exception_tidy& et) { } 267 }catch(exception_tidy& et) { }
268 } 268 }