X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fdolda%2Fjsvc%2Futil%2FMisc.java;h=122a6541b6ea23fb985c2262e6ebe01aed38e017;hb=ca045757135b00baa1f9161d2fb1e2e9e4f2bb5e;hp=cc01f1f47074602fdad8627a589e209063019553;hpb=c25c3aadf42cf04fe8dbbfb60624589ba60112bd;p=jsvc.git diff --git a/src/dolda/jsvc/util/Misc.java b/src/dolda/jsvc/util/Misc.java index cc01f1f..122a654 100644 --- a/src/dolda/jsvc/util/Misc.java +++ b/src/dolda/jsvc/util/Misc.java @@ -1,8 +1,11 @@ package dolda.jsvc.util; +import dolda.jsvc.*; import java.util.*; +import java.io.*; public class Misc { + public static final java.nio.charset.Charset utf8 = java.nio.charset.Charset.forName("UTF-8"); private static Map stext = new HashMap(); static { @@ -11,6 +14,7 @@ public class Misc { stext.put(301, "Permanently Moved"); stext.put(302, "Temporarily Moved"); stext.put(303, "See Other"); + stext.put(304, "Not Modified"); stext.put(400, "Bad Request"); stext.put(401, "Authentication Required"); stext.put(403, "Access Forbidden"); @@ -32,4 +36,90 @@ public class Misc { p = p.substring(1); return(p); } + + static byte[] readall(InputStream in) throws IOException { + byte[] buf = new byte[4096]; + int off = 0; + while(true) { + if(off == buf.length) { + byte[] n = new byte[buf.length * 2]; + System.arraycopy(buf, 0, n, 0, buf.length); + buf = n; + } + int ret = in.read(buf, off, buf.length - off); + if(ret < 0) { + byte[] n = new byte[off]; + System.arraycopy(buf, 0, n, 0, off); + return(n); + } + off += ret; + } + } + + public static void cpstream(InputStream in, OutputStream out) throws IOException { + byte[] buf = new byte[4096]; + while(true) { + int ret = in.read(buf, 0, buf.length); + if(ret < 0) + return; + out.write(buf, 0, ret); + } + } + + public static Responder stdroot(Responder root) { + Responder ret = root; + ret = new Rehandler(ret); + ret = new ErrorHandler(ret); + return(ret); + } + + public static int hex2int(char digit) { + if((digit >= '0') && (digit <= '9')) + return(digit - '0'); + if((digit >= 'a') && (digit <= 'f')) + return(digit - 'a' + 10); + if((digit >= 'A') && (digit <= 'F')) + return(digit - 'A' + 10); + throw(new NumberFormatException("Invalid hex digit " + digit)); + } + + public static char int2hex(int nibble, boolean upper) { + if((nibble >= 0) && (nibble <= 9)) + return((char)('0' + nibble)); + if((nibble >= 10) && (nibble <= 15)) + return((char)((upper?'A':'a') + nibble - 10)); + throw(new NumberFormatException("Invalid hex nibble " + nibble)); + } + + public static String htmlq(String in) { + StringBuilder buf = new StringBuilder(); + for(int i = 0; i < in.length(); i++) { + char c = in.charAt(i); + if(c == '&') + buf.append("&"); + else if(c == '<') + buf.append("<"); + else if(c == '>') + buf.append(">"); + else + buf.append(c); + } + return(buf.toString()); + } + + public static String urlq(String in) { + byte[] bytes = in.getBytes(utf8); + StringBuilder buf = new StringBuilder(); + for(int i = 0; i < bytes.length; i++) { + byte b = bytes[i]; + if((b < 32) || (b == ' ') || (b == '&') || (b == '?') || (b == '/') || (b == '=') || (b == '#') || (b == '%') || (b == '+') || (b >= 128)) { + buf.append('%'); + buf.append(int2hex((b & 0xf0) >> 4, true)); + buf.append(int2hex(b & 0x0f, true)); + } else { + buf.append((char)b); + } + } + return(buf.toString()); + } }