1 package atg.taglib.json.util;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import java.util.Iterator;
28
29 /**
30 * Convert an HTTP header to a JSONObject and back.
31 * @author JSON.org
32 * @version 2
33 */
34 public class HTTP {
35
36 /** Carriage return/line feed. */
37 public static final String CRLF = "\r\n";
38
39 /**
40 * Convert an HTTP header string into a JSONObject. It can be a request
41 * header or a response header. A request header will contain
42 * <pre>{
43 * Method: "POST" (for example),
44 * "Request-URI": "/" (for example),
45 * "HTTP-Version": "HTTP/1.1" (for example)
46 * }</pre>
47 * A response header will contain
48 * <pre>{
49 * "HTTP-Version": "HTTP/1.1" (for example),
50 * "Status-Code": "200" (for example),
51 * "Reason-Phrase": "OK" (for example)
52 * }</pre>
53 * In addition, the other parameters in the header will be captured, using
54 * the HTTP field names as JSON names, so that <pre>
55 * Date: Sun, 26 May 2002 18:06:04 GMT
56 * Cookie: Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s
57 * Cache-Control: no-cache</pre>
58 * become
59 * <pre>{...
60 * Date: "Sun, 26 May 2002 18:06:04 GMT",
61 * Cookie: "Q=q2=PPEAsg--; B=677gi6ouf29bn&b=2&f=s",
62 * "Cache-Control": "no-cache",
63 * ...}</pre>
64 * It does no further checking or conversion. It does not parse dates.
65 * It does not do '%' transforms on URLs.
66 * @param string An HTTP header string.
67 * @return A JSONObject containing the elements and attributes
68 * of the XML string.
69 * @throws JSONException
70 */
71 public static JSONObject toJSONObject(String string) throws JSONException {
72 JSONObject o = new JSONObject();
73 HTTPTokener x = new HTTPTokener(string);
74 String t;
75
76 t = x.nextToken();
77 if (t.toUpperCase().startsWith("HTTP")) {
78
79
80
81 o.put("HTTP-Version", t);
82 o.put("Status-Code", x.nextToken());
83 o.put("Reason-Phrase", x.nextTo('\0'));
84 x.next();
85
86 } else {
87
88
89
90 o.put("Method", t);
91 o.put("Request-URI", x.nextToken());
92 o.put("HTTP-Version", x.nextToken());
93 }
94
95
96
97 while (x.more()) {
98 String name = x.nextTo(':');
99 x.next(':');
100 o.put(name, x.nextTo('\0'));
101 x.next();
102 }
103 return o;
104 }
105
106
107 /**
108 * Convert a JSONObject into an HTTP header. A request header must contain
109 * <pre>{
110 * Method: "POST" (for example),
111 * "Request-URI": "/" (for example),
112 * "HTTP-Version": "HTTP/1.1" (for example)
113 * }</pre>
114 * A response header must contain
115 * <pre>{
116 * "HTTP-Version": "HTTP/1.1" (for example),
117 * "Status-Code": "200" (for example),
118 * "Reason-Phrase": "OK" (for example)
119 * }</pre>
120 * Any other members of the JSONObject will be output as HTTP fields.
121 * The result will end with two CRLF pairs.
122 * @param o A JSONObject
123 * @return An HTTP header string.
124 * @throws JSONException if the object does not contain enough
125 * information.
126 */
127 public static String toString(JSONObject o) throws JSONException {
128 Iterator keys = o.keys();
129 String s;
130 StringBuffer sb = new StringBuffer();
131 if (o.has("Status-Code") && o.has("Reason-Phrase")) {
132 sb.append(o.getString("HTTP-Version"));
133 sb.append(' ');
134 sb.append(o.getString("Status-Code"));
135 sb.append(' ');
136 sb.append(o.getString("Reason-Phrase"));
137 } else if (o.has("Method") && o.has("Request-URI")) {
138 sb.append(o.getString("Method"));
139 sb.append(' ');
140 sb.append('"');
141 sb.append(o.getString("Request-URI"));
142 sb.append('"');
143 sb.append(' ');
144 sb.append(o.getString("HTTP-Version"));
145 } else {
146 throw new JSONException("Not enough material for an HTTP header.");
147 }
148 sb.append(CRLF);
149 while (keys.hasNext()) {
150 s = keys.next().toString();
151 if (!s.equals("HTTP-Version") && !s.equals("Status-Code") &&
152 !s.equals("Reason-Phrase") && !s.equals("Method") &&
153 !s.equals("Request-URI") && !o.isNull(s)) {
154 sb.append(s);
155 sb.append(": ");
156 sb.append(o.getString(s));
157 sb.append(CRLF);
158 }
159 }
160 sb.append(CRLF);
161 return sb.toString();
162 }
163 }