-rw-r--r-- | lib/discovery.cc | 4 |
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 | } |