1997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu/* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany 2997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * 3997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * Permission is hereby granted, free of charge, to any person obtaining a copy 4997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * of this software and associated documentation files (the "Software"), to deal 5997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * in the Software without restriction, including without limitation the rights 6997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * to use, copy, modify, merge, publish, distribute, sublicense, and/or 7997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * sell copies of the Software, and to permit persons to whom the Software is 8997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * furnished to do so, subject to the following conditions: 9997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * 10997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The above copyright notice and this permission notice shall be included in 11997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * all copies or substantial portions of the Software. 12997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * 13997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * IN THE SOFTWARE. */ 20997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 21997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupackage org.ksoap2.kobjects.mime; 22997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 23997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.io.*; 24997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport java.util.*; 25997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yuimport org.ksoap2.kobjects.base64.*; 26997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 27997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yupublic class Decoder { 28997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 29997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu InputStream is; 30997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Hashtable header; 31997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu boolean eof; 32997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu boolean consumed; 33997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String boundary; 34997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String characterEncoding; 35997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 36997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu char[] buf = new char[256]; 37997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 38997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // add some kind of buffering here!!! 39997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 40997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu private final String readLine() throws IOException { 41997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 42997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int cnt = 0; 43997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 44997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu while (true) { 45997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int i = is.read(); 46997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (i == -1 && cnt == 0) 47997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return null; 48997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else if (i == -1 || i == '\n') 49997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return new String(buf, 0, cnt); 50997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else if (i != '\r') { 51997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (cnt >= buf.length) { 52997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu char[] tmp = new char[(buf.length * 3) / 2]; 53997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu System.arraycopy(buf, 0, tmp, 0, buf.length); 54997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu buf = tmp; 55997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 56997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 57997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu buf[cnt++] = (char) i; 58997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 59997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 60997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 61997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 62997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /** 63997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * The "main" element is returned in the 64997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu * hashtable with an empty key ("") */ 65997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 66997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public static Hashtable getHeaderElements(String header) { 67997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 68997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String key = ""; 69997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int pos = 0; 70997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Hashtable result = new Hashtable(); 71997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int len = header.length(); 72997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 73997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu while (true) { 74997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // skip spaces 75997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 76997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu while (pos < len && header.charAt(pos) <= ' ') 77997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu pos++; 78997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (pos >= len) 79997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 80997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 81997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (header.charAt(pos) == '"') { 82997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu pos++; 83997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int cut = header.indexOf('"', pos); 84997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (cut == -1) 85997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("End quote expected in " + header); 86997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 87997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu result.put(key, header.substring(pos, cut)); 88997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu pos = cut + 2; 89997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 90997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (pos >= len) 91997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 92997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (header.charAt(pos - 1) != ';') 93997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("; expected in " + header); 94997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 95997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else { 96997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int cut = header.indexOf(';', pos); 97997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (cut == -1) { 98997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu result.put(key, header.substring(pos)); 99997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 100997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 101997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu result.put(key, header.substring(pos, cut)); 102997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu pos = cut + 1; 103997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 104997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 105997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int cut = header.indexOf('=', pos); 106997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 107997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (cut == -1) 108997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 109997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 110997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu key = header.substring(pos, cut).toLowerCase().trim(); 111997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu pos = cut + 1; 112997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 113997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // System.out.println("header: "+result); 114997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 115997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return result; 116997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 117997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 118997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Decoder(InputStream is, String _bound) throws IOException { 119997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this(is, _bound, null); 120997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 121997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 122997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Decoder(InputStream is, String _bound, String characterEncoding) throws IOException { 123997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 124997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this.characterEncoding = characterEncoding; 125997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this.is = is; 126997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu this.boundary = "--" + _bound; 127997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 128997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // StringBuffer buf = new StringBuffer(); 129997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 130997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String line = null; 131997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu while (true) { 132997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu line = readLine(); 133997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (line == null) 134997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new IOException("Unexpected EOF"); 135997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 136997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // System.out.println("line: '" + line + "'"); 137997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // System.out.println("bound: '" + boundary + "'"); 138997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 139997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (line.startsWith(boundary)) 140997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 141997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // buf.append(line); 142997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 143997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 144997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // data = buf.toString().getBytes(); 145997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (line.endsWith("--")) { 146997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu eof = true; 147997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu is.close(); 148997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 149997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 150997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu consumed = true; 151997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 152997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 153997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public Enumeration getHeaderNames() { 154997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return header.keys(); 155997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 156997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 157997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String getHeader(String key) { 158997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return (String) header.get(key.toLowerCase()); 159997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 160997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 161997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public String readContent() throws IOException { 162997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ByteArrayOutputStream bos = new ByteArrayOutputStream(); 163997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu readContent(bos); 164997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String result = characterEncoding == null 165997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ? new String(bos.toByteArray()) 166997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu : new String(bos.toByteArray(), characterEncoding); 167997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 168997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu System.out.println("Field content: '" + result + "'"); 169997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu return result; 170997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 171997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 172997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu public void readContent(OutputStream os) throws IOException { 173997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (consumed) 174997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("Content already consumed!"); 175997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 176997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String line = ""; 177997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 178997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String contentType = getHeader("Content-Type"); 179997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // System.out.println("header: " + header); 180997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // System.out.println("Content-Type: "+contentType); 181997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 182997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if ("base64".equals(getHeader("Content-Transfer-Encoding"))) { 183997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu ByteArrayOutputStream bos = new ByteArrayOutputStream(); 184997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu while (true) { 185997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu line = readLine(); 186997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (line == null) 187997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new IOException("Unexpected EOF"); 188997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (line.startsWith(boundary)) 189997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 190997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 191997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu Base64.decode(line, os); 192997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 193997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 194997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else { 195997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 196997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu String deli = "\r\n" + boundary; 197997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int match = 0; 198997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 199997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu while (true) { 200997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu int i = is.read(); 201997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /* if (i >= 32 && i <= 127) 202997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu System.out.print((char) i); 203997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else 204997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu System.out.print("#" + i + ";"); */ 205997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (i == -1) 206997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu throw new RuntimeException("Unexpected EOF"); 207997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 208997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (((char) i) == deli.charAt(match)) { 209997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu match++; 210997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (match == deli.length()) 211997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu break; 212997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 213997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu else { 214997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (match > 0) { 215997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu for (int j = 0; j < match; j++) 216997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu os.write((byte) deli.charAt(j)); 217997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 218997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu match = ((char) i == deli.charAt(0)) ? 1 : 0; 219997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 220997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (match == 0) 221997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu os.write((byte) i); 222997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 223997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 224997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 225997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu line = readLine(); // read crlf and possibly remaining -- 226997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 227997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 228997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu if (line.endsWith("--")) 229997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu eof = true; 230997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 231997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu consumed = true; 232997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu } 233997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 234997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // public boolean next() throws IOException { 235997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 236997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // if(!consumed) 237997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // readContent(null); 238997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 239997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // if (eof) 240997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // return false; 241997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 242997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // // read header 243997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 244997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // header = new Hashtable(); 245997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // String line; 246997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 247997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // while (true) { 248997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // line = readLine(); 249997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // if (line == null || line.equals("")) 250997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // break; 251997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // int cut = line.indexOf(':'); 252997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // if (cut == -1) 253997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // throw new IOException("colon missing in multipart header line: " + line); 254997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 255997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // header.put( 256997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // line.substring(0, cut).trim().toLowerCase(), 257997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // line.substring(cut + 1).trim()); 258997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu /* 259997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu System.out.println( 260997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu "key: '" 261997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + line.substring(0, cut).trim().toLowerCase() 262997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + "' value: '" 263997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu + line.substring(cut + 1).trim());*/ 264997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 265997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // } 266997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu 267997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // consumed = false; 268997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // 269997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // return true; 270997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu // } 271997171ed3fdf8baf96d8fdf9dd3201a459327d89Ryan Yu} 272