summaryrefslogtreecommitdiffabout
path: root/lib/util.cc
Unidiff
Diffstat (limited to 'lib/util.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--lib/util.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/lib/util.cc b/lib/util.cc
index b702291..d979502 100644
--- a/lib/util.cc
+++ b/lib/util.cc
@@ -190,49 +190,49 @@ namespace opkele {
190 for_each(str.begin(),str.end(), 190 for_each(str.begin(),str.end(),
191 __url_encoder(rv)); 191 __url_encoder(rv));
192 return rv; 192 return rv;
193 } 193 }
194 194
195 string url_decode(const string& str) { 195 string url_decode(const string& str) {
196 string rv; 196 string rv;
197 back_insert_iterator<string> ii(rv); 197 back_insert_iterator<string> ii(rv);
198 for(string::const_iterator i=str.begin(),ie=str.end(); 198 for(string::const_iterator i=str.begin(),ie=str.end();
199 i!=ie;++i) { 199 i!=ie;++i) {
200 switch(*i) { 200 switch(*i) {
201 case '+': 201 case '+':
202 *(ii++) = ' '; break; 202 *(ii++) = ' '; break;
203 case '%': 203 case '%':
204 ++i; 204 ++i;
205 static char tmp[3] = {0,0,0}; 205 static char tmp[3] = {0,0,0};
206 if(i==ie) 206 if(i==ie)
207 throw failed_conversion(OPKELE_CP_ "trailing percent in the url-encoded string"); 207 throw failed_conversion(OPKELE_CP_ "trailing percent in the url-encoded string");
208 tmp[0] = *(i++); 208 tmp[0] = *(i++);
209 if(i==ie) 209 if(i==ie)
210 throw failed_conversion(OPKELE_CP_ "not enough hexadecimals after the percent sign in url-encoded string"); 210 throw failed_conversion(OPKELE_CP_ "not enough hexadecimals after the percent sign in url-encoded string");
211 tmp[1] = *i; 211 tmp[1] = *i;
212 if(!(isxdigit(tmp[0]) && isxdigit(tmp[1]))) 212 if(!(isxdigit(tmp[0]) && isxdigit(tmp[1])))
213 throw failed_conversion(OPKELE_CP_ "non-hex follows percent in url-encoded string"); 213 throw failed_conversion(OPKELE_CP_ "non-hex follows percent in url-encoded string");
214 *(ii++) = strtol(tmp,0,16); 214 *(ii++) = (char)strtol(tmp,0,16);
215 break; 215 break;
216 default: 216 default:
217 *(ii++) = *i; break; 217 *(ii++) = *i; break;
218 } 218 }
219 } 219 }
220 return rv; 220 return rv;
221 } 221 }
222 222
223 string attr_escape(const string& str) { 223 string attr_escape(const string& str) {
224 static const char *unsafechars = "<>&\n\"'"; 224 static const char *unsafechars = "<>&\n\"'";
225 string rv; 225 string rv;
226 string::size_type p=0; 226 string::size_type p=0;
227 while(true) { 227 while(true) {
228 string::size_type us = str.find_first_of(unsafechars,p); 228 string::size_type us = str.find_first_of(unsafechars,p);
229 if(us==string::npos) { 229 if(us==string::npos) {
230 if(p!=str.length()) 230 if(p!=str.length())
231 rv.append(str,p,str.length()-p); 231 rv.append(str,p,str.length()-p);
232 return rv; 232 return rv;
233 } 233 }
234 rv.append(str,p,us-p); 234 rv.append(str,p,us-p);
235 rv += "&#"; 235 rv += "&#";
236 rv += long_to_string((long)str[us]); 236 rv += long_to_string((long)str[us]);
237 rv += ';'; 237 rv += ';';
238 p = us+1; 238 p = us+1;
@@ -327,52 +327,52 @@ namespace opkele {
327 ++interesting; 327 ++interesting;
328 } 328 }
329 string::size_type n = interesting; 329 string::size_type n = interesting;
330 char tmp[3] = { 0,0,0 }; 330 char tmp[3] = { 0,0,0 };
331 stack<string::size_type> psegs; psegs.push(rv.length()); 331 stack<string::size_type> psegs; psegs.push(rv.length());
332 string pseg; 332 string pseg;
333 for(;n<ul;) { 333 for(;n<ul;) {
334 string::size_type unsafe = uri.find_first_of(qf?"%":"%/?#",n); 334 string::size_type unsafe = uri.find_first_of(qf?"%":"%/?#",n);
335 if(unsafe==string::npos) { 335 if(unsafe==string::npos) {
336 pseg.append(uri,n,ul-n-1); n = ul-1; 336 pseg.append(uri,n,ul-n-1); n = ul-1;
337 }else{ 337 }else{
338 pseg.append(uri,n,unsafe-n); 338 pseg.append(uri,n,unsafe-n);
339 n = unsafe; 339 n = unsafe;
340 } 340 }
341 char c = uri[n++]; 341 char c = uri[n++];
342 if(c=='%') { 342 if(c=='%') {
343 if((n+1)>=ul) 343 if((n+1)>=ul)
344 throw bad_input(OPKELE_CP_ "Unexpected end of URI encountered while parsing percent-encoded character"); 344 throw bad_input(OPKELE_CP_ "Unexpected end of URI encountered while parsing percent-encoded character");
345 tmp[0] = uri[n++]; 345 tmp[0] = uri[n++];
346 tmp[1] = uri[n++]; 346 tmp[1] = uri[n++];
347 if(!( isxdigit(tmp[0]) && isxdigit(tmp[1]) )) 347 if(!( isxdigit(tmp[0]) && isxdigit(tmp[1]) ))
348 throw bad_input(OPKELE_CP_ "Invalid percent-encoded character in URI being normalized"); 348 throw bad_input(OPKELE_CP_ "Invalid percent-encoded character in URI being normalized");
349 int cc = strtol(tmp,0,16); 349 int cc = strtol(tmp,0,16);
350 if( isalpha(cc) || isdigit(cc) || strchr("._~-",cc) ) 350 if( isalpha(cc) || isdigit(cc) || strchr("._~-",cc) )
351 pseg += cc; 351 pseg += (char)cc;
352 else{ 352 else{
353 pseg += '%'; 353 pseg += '%';
354 pseg += toupper(tmp[0]); pseg += toupper(tmp[1]); 354 pseg += (char)toupper(tmp[0]); pseg += (char)toupper(tmp[1]);
355 } 355 }
356 }else if(qf) { 356 }else if(qf) {
357 rv += pseg; rv += c; 357 rv += pseg; rv += c;
358 pseg.clear(); 358 pseg.clear();
359 }else if(n>=ul || strchr("?/#",c)) { 359 }else if(n>=ul || strchr("?/#",c)) {
360 if(pseg.empty() || pseg==".") { 360 if(pseg.empty() || pseg==".") {
361 }else if(pseg=="..") { 361 }else if(pseg=="..") {
362 if(psegs.size()>1) { 362 if(psegs.size()>1) {
363 rv.resize(psegs.top()); psegs.pop(); 363 rv.resize(psegs.top()); psegs.pop();
364 } 364 }
365 }else{ 365 }else{
366 psegs.push(rv.length()); 366 psegs.push(rv.length());
367 if(c!='/') { 367 if(c!='/') {
368 pseg += c; 368 pseg += c;
369 qf = true; 369 qf = true;
370 } 370 }
371 rv += '/'; rv += pseg; 371 rv += '/'; rv += pseg;
372 } 372 }
373 if(c=='/' && (n>=ul || strchr("?#",uri[n])) ) { 373 if(c=='/' && (n>=ul || strchr("?#",uri[n])) ) {
374 rv += '/'; 374 rv += '/';
375 if(n<ul) 375 if(n<ul)
376 qf = true; 376 qf = true;
377 }else if(strchr("?#",c)) { 377 }else if(strchr("?#",c)) {
378 if(psegs.size()==1 && psegs.top()==rv.length()) 378 if(psegs.size()==1 && psegs.top()==rv.length())