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