| 1 | package jagi; |
| 2 | |
| 3 | import java.util.*; |
| 4 | import java.io.*; |
| 5 | import java.nio.*; |
| 6 | import java.nio.channels.*; |
| 7 | |
| 8 | public class Utils { |
| 9 | public static final java.nio.charset.Charset UTF8 = java.nio.charset.Charset.forName("UTF-8"); |
| 10 | public static final java.nio.charset.Charset LATIN1 = java.nio.charset.Charset.forName("ISO-8859-1"); |
| 11 | public static final java.nio.charset.Charset ASCII = java.nio.charset.Charset.forName("US-ASCII"); |
| 12 | |
| 13 | public static int read(ReadableByteChannel ch) throws IOException { |
| 14 | ByteBuffer buf = ByteBuffer.allocate(1); |
| 15 | while(true) { |
| 16 | int rv = ch.read(buf); |
| 17 | if(rv < 0) |
| 18 | return(-1); |
| 19 | else if(rv == 1) |
| 20 | return(buf.get(0) & 0xff); |
| 21 | else if(rv > 1) |
| 22 | throw(new AssertionError()); |
| 23 | } |
| 24 | } |
| 25 | |
| 26 | public static ByteBuffer readall(ReadableByteChannel ch, ByteBuffer dst) throws IOException { |
| 27 | while(dst.remaining() > 0) |
| 28 | ch.read(dst); |
| 29 | return(dst); |
| 30 | } |
| 31 | |
| 32 | public static void writeall(WritableByteChannel ch, ByteBuffer src) throws IOException { |
| 33 | while(src.remaining() > 0) |
| 34 | ch.write(src); |
| 35 | } |
| 36 | |
| 37 | public static void transfer(WritableByteChannel dst, ReadableByteChannel src) throws IOException { |
| 38 | ByteBuffer buf = ByteBuffer.allocate(65536); |
| 39 | while(true) { |
| 40 | buf.clear(); |
| 41 | if(src.read(buf) < 0) |
| 42 | break; |
| 43 | buf.flip(); |
| 44 | while(buf.remaining() > 0) |
| 45 | dst.write(buf); |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | public static String htmlquote(CharSequence text) { |
| 50 | StringBuilder buf = new StringBuilder(); |
| 51 | for(int i = 0; i < text.length(); i++) { |
| 52 | char c = text.charAt(i); |
| 53 | switch(c) { |
| 54 | case '&': buf.append("&"); break; |
| 55 | case '<': buf.append("<"); break; |
| 56 | case '>': buf.append(">"); break; |
| 57 | case '"': buf.append("""); break; |
| 58 | default: buf.append(c); break; |
| 59 | } |
| 60 | } |
| 61 | return(buf.toString()); |
| 62 | } |
| 63 | |
| 64 | public static Map<Object, Object> simpleerror(int code, CharSequence title, CharSequence msg) { |
| 65 | StringBuilder buf = new StringBuilder(); |
| 66 | buf.append("<?xml version=\"1.0\" encoding=\"US-ASCII\"?>\n"); |
| 67 | buf.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n"); |
| 68 | buf.append("<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en-US\">\n"); |
| 69 | buf.append("<head>\n"); |
| 70 | buf.append("<title>" + title + "</title>\n"); |
| 71 | buf.append("</head>\n"); |
| 72 | buf.append("<body>\n"); |
| 73 | buf.append("<h1>" + title + "</h1>\n"); |
| 74 | buf.append("<p>" + htmlquote(msg) + "</p>\n"); |
| 75 | buf.append("</body>\n"); |
| 76 | buf.append("</html>\n"); |
| 77 | ByteBuffer out = ASCII.encode(CharBuffer.wrap(buf)); |
| 78 | Map<Object, Object> resp = new HashMap<>(); |
| 79 | resp.put("http.status", code + " " + title); |
| 80 | resp.put("http.Content-Type", "text/html; charset=us-ascii"); |
| 81 | resp.put("http.Content-Length", Integer.toString(out.remaining())); |
| 82 | resp.put("jagi.output", out); |
| 83 | return(resp); |
| 84 | } |
| 85 | } |