author | Michael Krelin <hacker@klever.net> | 2008-01-06 21:02:45 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2008-01-06 21:04:42 (UTC) |
commit | 6a843bb112988976892058c56d5fe2f24e24300a (patch) (unidiff) | |
tree | 9e3ab16ed4863f9bbbffeded740788e14d5e4501 | |
parent | 6529fa45df73aed1cad363da02386b036798a636 (diff) | |
download | libopkele-6a843bb112988976892058c56d5fe2f24e24300a.zip libopkele-6a843bb112988976892058c56d5fe2f24e24300a.tar.gz libopkele-6a843bb112988976892058c56d5fe2f24e24300a.tar.bz2 |
Fix non-debug tidying.
somehow I've managed to put too many tidying options into conditional.
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | lib/discovery.cc | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/discovery.cc b/lib/discovery.cc index a308b56..af9686a 100644 --- a/lib/discovery.cc +++ b/lib/discovery.cc | |||
@@ -76,197 +76,197 @@ namespace opkele { | |||
76 | xri_proxy(XRI_PROXY_URL) { | 76 | xri_proxy(XRI_PROXY_URL) { |
77 | CURLcode r; | 77 | CURLcode r; |
78 | (r=misc_sets()) | 78 | (r=misc_sets()) |
79 | || (r=set_write()) | 79 | || (r=set_write()) |
80 | || (r=set_header()) | 80 | || (r=set_header()) |
81 | ; | 81 | ; |
82 | if(r) | 82 | if(r) |
83 | throw exception_curl(OPKELE_CP_ "failed to set curly options",r); | 83 | throw exception_curl(OPKELE_CP_ "failed to set curly options",r); |
84 | } | 84 | } |
85 | ~idigger_t() throw() { } | 85 | ~idigger_t() throw() { } |
86 | 86 | ||
87 | void discover(idiscovery_t& result,const string& identity) { | 87 | void discover(idiscovery_t& result,const string& identity) { |
88 | result.clear(); | 88 | result.clear(); |
89 | string::size_type fsc = identity.find_first_not_of(whitespace); | 89 | string::size_type fsc = identity.find_first_not_of(whitespace); |
90 | if(fsc==string::npos) | 90 | if(fsc==string::npos) |
91 | throw bad_input(OPKELE_CP_ "whtiespace-only identity"); | 91 | throw bad_input(OPKELE_CP_ "whtiespace-only identity"); |
92 | string::size_type lsc = identity.find_last_not_of(whitespace); | 92 | string::size_type lsc = identity.find_last_not_of(whitespace); |
93 | assert(lsc!=string::npos); | 93 | assert(lsc!=string::npos); |
94 | if(!strncasecmp(identity.c_str()+fsc,"xri://",sizeof("xri://")-1)) | 94 | if(!strncasecmp(identity.c_str()+fsc,"xri://",sizeof("xri://")-1)) |
95 | fsc += sizeof("xri://")-1; | 95 | fsc += sizeof("xri://")-1; |
96 | if((fsc+1)>=lsc) | 96 | if((fsc+1)>=lsc) |
97 | throw bad_input(OPKELE_CP_ "not a character of importance in identity"); | 97 | throw bad_input(OPKELE_CP_ "not a character of importance in identity"); |
98 | string id(identity,fsc,lsc-fsc+1); | 98 | string id(identity,fsc,lsc-fsc+1); |
99 | if(strchr(i_leaders,id[0])) { | 99 | if(strchr(i_leaders,id[0])) { |
100 | result.normalized_id = id; | 100 | result.normalized_id = id; |
101 | result.xri_identity = true; | 101 | result.xri_identity = true; |
102 | /* TODO: further canonicalize xri identity? Like folding case or whatever... */ | 102 | /* TODO: further canonicalize xri identity? Like folding case or whatever... */ |
103 | discover_at( | 103 | discover_at( |
104 | result, | 104 | result, |
105 | xri_proxy + util::url_encode(id)+ | 105 | xri_proxy + util::url_encode(id)+ |
106 | "?_xrd_r=application/xrd+xml;sep=false", xmode_xrd); | 106 | "?_xrd_r=application/xrd+xml;sep=false", xmode_xrd); |
107 | if(status_code!=100) | 107 | if(status_code!=100) |
108 | throw failed_xri_resolution(OPKELE_CP_ | 108 | throw failed_xri_resolution(OPKELE_CP_ |
109 | "XRI resolution failed with '"+status_string+"' message",status_code); | 109 | "XRI resolution failed with '"+status_string+"' message",status_code); |
110 | if(result.xrd.canonical_ids.empty()) | 110 | if(result.xrd.canonical_ids.empty()) |
111 | throw opkele::failed_discovery(OPKELE_CP_ "No CanonicalID for XRI identity found"); | 111 | throw opkele::failed_discovery(OPKELE_CP_ "No CanonicalID for XRI identity found"); |
112 | result.canonicalized_id = result.xrd.canonical_ids.begin()->second; | 112 | result.canonicalized_id = result.xrd.canonical_ids.begin()->second; |
113 | }else{ | 113 | }else{ |
114 | result.xri_identity = false; | 114 | result.xri_identity = false; |
115 | if(id.find("://")==string::npos) | 115 | if(id.find("://")==string::npos) |
116 | id.insert(0,"http://"); | 116 | id.insert(0,"http://"); |
117 | string::size_type fp = id.find('#'); | 117 | string::size_type fp = id.find('#'); |
118 | if(fp!=string::npos) { | 118 | if(fp!=string::npos) { |
119 | string::size_type qp = id.find('?'); | 119 | string::size_type qp = id.find('?'); |
120 | if(qp==string::npos || qp<fp) | 120 | if(qp==string::npos || qp<fp) |
121 | id.erase(fp); | 121 | id.erase(fp); |
122 | else if(qp>fp) | 122 | else if(qp>fp) |
123 | id.erase(fp,qp-fp); | 123 | id.erase(fp,qp-fp); |
124 | } | 124 | } |
125 | result.normalized_id = util::rfc_3986_normalize_uri(id); | 125 | result.normalized_id = util::rfc_3986_normalize_uri(id); |
126 | discover_at(result,id,xmode_html|xmode_xrd); | 126 | discover_at(result,id,xmode_html|xmode_xrd); |
127 | const char * eu = 0; | 127 | const char * eu = 0; |
128 | CURLcode r = easy_getinfo(CURLINFO_EFFECTIVE_URL,&eu); | 128 | CURLcode r = easy_getinfo(CURLINFO_EFFECTIVE_URL,&eu); |
129 | if(r) | 129 | if(r) |
130 | throw exception_curl(OPKELE_CP_ "failed to get CURLINFO_EFFECTIVE_URL",r); | 130 | throw exception_curl(OPKELE_CP_ "failed to get CURLINFO_EFFECTIVE_URL",r); |
131 | result.canonicalized_id = util::rfc_3986_normalize_uri(eu); /* XXX: strip fragment part? */ | 131 | result.canonicalized_id = util::rfc_3986_normalize_uri(eu); /* XXX: strip fragment part? */ |
132 | if(xrds_location.empty()) { | 132 | if(xrds_location.empty()) { |
133 | html2xrd(result.xrd); | 133 | html2xrd(result.xrd); |
134 | }else{ | 134 | }else{ |
135 | discover_at(result,xrds_location,xmode_xrd); | 135 | discover_at(result,xrds_location,xmode_xrd); |
136 | if(result.xrd.empty()) | 136 | if(result.xrd.empty()) |
137 | html2xrd(result.xrd); | 137 | html2xrd(result.xrd); |
138 | } | 138 | } |
139 | } | 139 | } |
140 | } | 140 | } |
141 | 141 | ||
142 | void discover_at(idiscovery_t& result,const string& url,int xm) { | 142 | void discover_at(idiscovery_t& result,const string& url,int xm) { |
143 | CURLcode r = easy_setopt(CURLOPT_URL,url.c_str()); | 143 | CURLcode r = easy_setopt(CURLOPT_URL,url.c_str()); |
144 | if(r) | 144 | if(r) |
145 | throw exception_curl(OPKELE_CP_ "failed to set culry urlie",r); | 145 | throw exception_curl(OPKELE_CP_ "failed to set culry urlie",r); |
146 | 146 | ||
147 | http_content_type.clear(); | 147 | http_content_type.clear(); |
148 | xmode = xm; | 148 | xmode = xm; |
149 | prepare_to_parse(); | 149 | prepare_to_parse(); |
150 | if(xmode&xmode_html) { | 150 | if(xmode&xmode_html) { |
151 | xrds_location.clear(); | 151 | xrds_location.clear(); |
152 | save_html.clear(); | 152 | save_html.clear(); |
153 | save_html.reserve(max_html); | 153 | save_html.reserve(max_html); |
154 | } | 154 | } |
155 | xrd = &result.xrd; | 155 | xrd = &result.xrd; |
156 | 156 | ||
157 | r = easy_perform(); | 157 | r = easy_perform(); |
158 | if(r && r!=CURLE_WRITE_ERROR) | 158 | if(r && r!=CURLE_WRITE_ERROR) |
159 | throw exception_curl(OPKELE_CP_ "failed to perform curly request",r); | 159 | throw exception_curl(OPKELE_CP_ "failed to perform curly request",r); |
160 | 160 | ||
161 | if(!parser_choked) { | 161 | if(!parser_choked) { |
162 | parse(0,0,true); | 162 | parse(0,0,true); |
163 | }else{ | 163 | }else{ |
164 | /* TODO: do not bother if we've seen xml */ | 164 | /* TODO: do not bother if we've seen xml */ |
165 | try { | 165 | try { |
166 | util::tidy_doc_t td = util::tidy_doc_t::create(); | 166 | util::tidy_doc_t td = util::tidy_doc_t::create(); |
167 | if(!td) | 167 | if(!td) |
168 | throw exception_tidy(OPKELE_CP_ "failed to create htmltidy document"); | 168 | throw exception_tidy(OPKELE_CP_ "failed to create htmltidy document"); |
169 | #ifndef NDEBUG | 169 | #ifndef NDEBUG |
170 | td.opt_set(TidyQuiet,false); | 170 | td.opt_set(TidyQuiet,false); |
171 | td.opt_set(TidyShowWarnings,false); | 171 | td.opt_set(TidyShowWarnings,false); |
172 | #endif /* NDEBUG */ | ||
172 | td.opt_set(TidyForceOutput,true); | 173 | td.opt_set(TidyForceOutput,true); |
173 | td.opt_set(TidyXhtmlOut,true); | 174 | td.opt_set(TidyXhtmlOut,true); |
174 | td.opt_set(TidyDoctypeMode,TidyDoctypeOmit); | 175 | td.opt_set(TidyDoctypeMode,TidyDoctypeOmit); |
175 | td.opt_set(TidyMark,false); | 176 | td.opt_set(TidyMark,false); |
176 | #endif /* NDEBUG */ | ||
177 | if(td.parse_string(save_html)<=0) | 177 | if(td.parse_string(save_html)<=0) |
178 | throw exception_tidy(OPKELE_CP_ "tidy failed to parse document"); | 178 | throw exception_tidy(OPKELE_CP_ "tidy failed to parse document"); |
179 | if(td.clean_and_repair()<=0) | 179 | if(td.clean_and_repair()<=0) |
180 | throw exception_tidy(OPKELE_CP_ "tidy failed to clean and repair"); | 180 | throw exception_tidy(OPKELE_CP_ "tidy failed to clean and repair"); |
181 | util::tidy_buf_t tide; | 181 | util::tidy_buf_t tide; |
182 | if(td.save_buffer(tide)<=0) | 182 | if(td.save_buffer(tide)<=0) |
183 | throw exception_tidy(OPKELE_CP_ "tidy failed to save buffer"); | 183 | throw exception_tidy(OPKELE_CP_ "tidy failed to save buffer"); |
184 | prepare_to_parse(); | 184 | prepare_to_parse(); |
185 | parse(tide.c_str(),tide.size(),true); | 185 | parse(tide.c_str(),tide.size(),true); |
186 | }catch(exception_tidy& et) { } | 186 | }catch(exception_tidy& et) { } |
187 | } | 187 | } |
188 | save_html.clear(); | 188 | save_html.clear(); |
189 | } | 189 | } |
190 | 190 | ||
191 | void prepare_to_parse() { | 191 | void prepare_to_parse() { |
192 | (*(expat_t*)this) = parser_create_ns(); | 192 | (*(expat_t*)this) = parser_create_ns(); |
193 | set_user_data(); set_element_handler(); | 193 | set_user_data(); set_element_handler(); |
194 | set_character_data_handler(); | 194 | set_character_data_handler(); |
195 | 195 | ||
196 | if(xmode&xmode_html) { | 196 | if(xmode&xmode_html) { |
197 | html_openid1.clear(); html_openid2.clear(); | 197 | html_openid1.clear(); html_openid2.clear(); |
198 | parser_choked = false; | 198 | parser_choked = false; |
199 | } | 199 | } |
200 | 200 | ||
201 | cdata = 0; xrd_service = 0; skipping = 0; | 201 | cdata = 0; xrd_service = 0; skipping = 0; |
202 | status_code = 100; status_string.clear(); | 202 | status_code = 100; status_string.clear(); |
203 | } | 203 | } |
204 | 204 | ||
205 | void html2xrd(XRD_t& x) { | 205 | void html2xrd(XRD_t& x) { |
206 | if(!html_openid1.uris.empty()) { | 206 | if(!html_openid1.uris.empty()) { |
207 | html_openid1.types.insert(STURI_OPENID11); | 207 | html_openid1.types.insert(STURI_OPENID11); |
208 | x.services.add(-1,html_openid1); | 208 | x.services.add(-1,html_openid1); |
209 | } | 209 | } |
210 | if(!html_openid2.uris.empty()) { | 210 | if(!html_openid2.uris.empty()) { |
211 | html_openid2.types.insert(STURI_OPENID20); | 211 | html_openid2.types.insert(STURI_OPENID20); |
212 | x.services.add(-1,html_openid2); | 212 | x.services.add(-1,html_openid2); |
213 | } | 213 | } |
214 | } | 214 | } |
215 | 215 | ||
216 | size_t write(void *p,size_t s,size_t nm) { | 216 | size_t write(void *p,size_t s,size_t nm) { |
217 | /* TODO: limit total size */ | 217 | /* TODO: limit total size */ |
218 | size_t bytes = s*nm; | 218 | size_t bytes = s*nm; |
219 | const char *inbuf = (const char*)p; | 219 | const char *inbuf = (const char*)p; |
220 | if(xmode&xmode_html) { | 220 | if(xmode&xmode_html) { |
221 | size_t mbts = save_html.capacity()-save_html.size(); | 221 | size_t mbts = save_html.capacity()-save_html.size(); |
222 | size_t bts = 0; | 222 | size_t bts = 0; |
223 | if(mbts>0) { | 223 | if(mbts>0) { |
224 | bts = (bytes>mbts)?mbts:bytes; | 224 | bts = (bytes>mbts)?mbts:bytes; |
225 | save_html.append(inbuf,bts); | 225 | save_html.append(inbuf,bts); |
226 | } | 226 | } |
227 | if(skipping<0) return bts; | 227 | if(skipping<0) return bts; |
228 | } | 228 | } |
229 | if(skipping<0) return 0; | 229 | if(skipping<0) return 0; |
230 | bool rp = parse(inbuf,bytes,false); | 230 | bool rp = parse(inbuf,bytes,false); |
231 | if(!rp) { | 231 | if(!rp) { |
232 | parser_choked = true; | 232 | parser_choked = true; |
233 | skipping = -1; | 233 | skipping = -1; |
234 | if(!(xmode&xmode_html)) | 234 | if(!(xmode&xmode_html)) |
235 | bytes = 0; | 235 | bytes = 0; |
236 | } | 236 | } |
237 | return bytes; | 237 | return bytes; |
238 | } | 238 | } |
239 | size_t header(void *p,size_t s,size_t nm) { | 239 | size_t header(void *p,size_t s,size_t nm) { |
240 | size_t bytes = s*nm; | 240 | size_t bytes = s*nm; |
241 | const char *h = (const char*)p; | 241 | const char *h = (const char*)p; |
242 | const char *colon = (const char*)memchr(p,':',bytes); | 242 | const char *colon = (const char*)memchr(p,':',bytes); |
243 | const char *space = (const char*)memchr(p,' ',bytes); | 243 | const char *space = (const char*)memchr(p,' ',bytes); |
244 | if(space && ( (!colon) || space<colon ) ) { | 244 | if(space && ( (!colon) || space<colon ) ) { |
245 | xrds_location.clear(); http_content_type.clear(); | 245 | xrds_location.clear(); http_content_type.clear(); |
246 | }else if(colon) { | 246 | }else if(colon) { |
247 | const char *hv = ++colon; | 247 | const char *hv = ++colon; |
248 | int hnl = colon-h; | 248 | int hnl = colon-h; |
249 | int rb; | 249 | int rb; |
250 | for(rb = bytes-hnl-1;rb>0 && isspace(*hv);++hv,--rb); | 250 | for(rb = bytes-hnl-1;rb>0 && isspace(*hv);++hv,--rb); |
251 | while(rb>0 && isspace(hv[rb-1])) --rb; | 251 | while(rb>0 && isspace(hv[rb-1])) --rb; |
252 | if(rb) { | 252 | if(rb) { |
253 | if( (hnl>=sizeof(XRDS_HEADER)) | 253 | if( (hnl>=sizeof(XRDS_HEADER)) |
254 | && !strncasecmp(h,XRDS_HEADER":", | 254 | && !strncasecmp(h,XRDS_HEADER":", |
255 | sizeof(XRDS_HEADER)) ) { | 255 | sizeof(XRDS_HEADER)) ) { |
256 | xrds_location.assign(hv,rb); | 256 | xrds_location.assign(hv,rb); |
257 | }else if( (hnl>=sizeof(CT_HEADER)) | 257 | }else if( (hnl>=sizeof(CT_HEADER)) |
258 | && !strncasecmp(h,CT_HEADER":", | 258 | && !strncasecmp(h,CT_HEADER":", |
259 | sizeof(CT_HEADER)) ) { | 259 | sizeof(CT_HEADER)) ) { |
260 | const char *sc = (const char*)memchr( | 260 | const char *sc = (const char*)memchr( |
261 | hv,';',rb); | 261 | hv,';',rb); |
262 | http_content_type.assign(hv,sc?(sc-hv):rb); | 262 | http_content_type.assign(hv,sc?(sc-hv):rb); |
263 | } | 263 | } |
264 | } | 264 | } |
265 | } | 265 | } |
266 | return curl_t::header(p,s,nm); | 266 | return curl_t::header(p,s,nm); |
267 | } | 267 | } |
268 | 268 | ||
269 | void start_element(const XML_Char *n,const XML_Char **a) { | 269 | void start_element(const XML_Char *n,const XML_Char **a) { |
270 | if(skipping<0) return; | 270 | if(skipping<0) return; |
271 | if(skipping) { | 271 | if(skipping) { |
272 | if(xmode&xmode_html) | 272 | if(xmode&xmode_html) |