clean up Headers a bit
authoradam <adam@megacz.com>
Sat, 17 Mar 2007 08:53:16 +0000 (08:53 +0000)
committeradam <adam@megacz.com>
Sat, 17 Mar 2007 08:53:16 +0000 (08:53 +0000)
darcs-hash:20070317085316-5007d-f97ecf7a16e9f471563ad660a3e7c049d406f1f0.gz

src/org/ibex/mail/Headers.java

index 6094c79..2225919 100644 (file)
@@ -44,10 +44,9 @@ public abstract class Headers extends JS.Immutable implements Fountain {
     }
     
     // FIXME
-    public abstract String getString();
-
+    //public abstract String getString();
+    public abstract String[] getHeaderNames();
     public abstract String get(String s);
-    public abstract java.util.Enumeration names();
 
     public Headers set(String[] keyval) {
         Headers ret = this;
@@ -56,29 +55,25 @@ public abstract class Headers extends JS.Immutable implements Fountain {
         return ret;
     }
     public Headers remove(String key) { return set(key, null); /* FIXME */ }
-
-    public String getLowerCaseTrimmed(String s) {
-        String ret = get(s);
-        return ret==null ? null : ret.toLowerCase();
-    }
-    
+   
     public static class Original extends Headers {
         private final Hash head = new Hash();
-        private final Hash headModified = new Hash();
         public        int lines;
         public  final boolean mime;
         private String raw;
-        private StringFountain fountain;
+        private Fountain fountain;
+
+        //public String getString() { return raw; }
 
-        public String getString() { return raw; }
         public Stream getStream() { return fountain.getStream(); }
-        public int    getLength() { return fountain.getLength(); }
+        public long   getLength() { return fountain.getLength(); }
         public int    getNumLines() { return fountain.getNumLines(); }
-        public Stream getStreamWithCRLF() { return new Stream(raw+"\r\n"); }
+
         public JS get(JS s) throws JSExn { return JSU.S(get(JSU.toString(s).toLowerCase())); }
-        public java.util.Enumeration names() { return head.enumerateKeys(); }
-        
+
+        public String[] getHeaderNames() { return (String[])head.dumpkeys(new String[head.size()]); }
         public String get(String s) { return (String)head.get(s.toLowerCase()); }
+
         public Original(Stream stream) throws Malformed { this(stream, false); }
         public Original(Stream stream, boolean assumeMime) throws Malformed {
             StringBuffer all = new StringBuffer();
@@ -96,13 +91,17 @@ public abstract class Headers extends JS.Immutable implements Fountain {
                 if (s.indexOf(':') == -1) throw new Malformed("Header line does not contain colon: " + s);
                 key = s.substring(0, s.indexOf(':')).toLowerCase();
                 for(int i=0; i<key.length(); i++)
-                    if (key.charAt(i) < 33 || key.charAt(i) > 126)
-                        throw new Malformed("Header key \""+key+"\" contains invalid character \"" + key.charAt(i) + "\"");
+                    if (key.charAt(i) < 33 || key.charAt(i) > 126) {
+                        Log.error(null,all);
+                        throw new Malformed("Header key \""+key+"\" contains invalid character \"" +
+                                            key.charAt(i) + "\" (0x"+Integer.toString(key.charAt(i), 16) +")");
+                    }
                 String val = s.substring(s.indexOf(':') + 1).trim();
                 if (get(key) != null) val = get(key) + " " + val; // just append it to the previous one;
                 head.put(key, val);
             }
             this.raw = all.toString();
+            // FIXME: be more efficient here?
             this.fountain = new Fountain.StringFountain(this.raw);
             this.lines = lines;
             this.mime = assumeMime | (get("mime-version") != null && get("mime-version").trim().equals("1.0"));