-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 | |||
@@ -108,133 +108,133 @@ namespace opkele { | |||
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; |