Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 48 additions & 18 deletions src/main/java/org/json/HTTP.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,36 +113,66 @@ public static JSONObject toJSONObject(String string) throws JSONException {
public static String toString(JSONObject jo) throws JSONException {
StringBuilder sb = new StringBuilder();
if (jo.has("Status-Code") && jo.has("Reason-Phrase")) {
sb.append(jo.getString("HTTP-Version"));
sb.append(' ');
sb.append(jo.getString("Status-Code"));
sb.append(' ');
sb.append(jo.getString("Reason-Phrase"));
appendResponseHeader(sb, jo);
} else if (jo.has("Method") && jo.has("Request-URI")) {
sb.append(jo.getString("Method"));
sb.append(' ');
sb.append('"');
sb.append(jo.getString("Request-URI"));
sb.append('"');
sb.append(' ');
sb.append(jo.getString("HTTP-Version"));
appendRequestHeader(sb, jo);
} else {
throw new JSONException("Not enough material for an HTTP header.");
}
sb.append(CRLF);
// Don't use the new entrySet API to maintain Android support

// Append other HTTP fields
appendAdditionalHeaders(sb, jo);

sb.append(CRLF);
return sb.toString();
}

/**
* Appends the HTTP response header to the StringBuilder.
* @param sb The StringBuilder to append to.
* @param jo The JSONObject representing the HTTP response.
* @throws JSONException if required fields are missing.
*/
private static void appendResponseHeader(StringBuilder sb, JSONObject jo) throws JSONException {
sb.append(jo.getString("HTTP-Version"));
sb.append(' ');
sb.append(jo.getString("Status-Code"));
sb.append(' ');
sb.append(jo.getString("Reason-Phrase"));
}

/**
* Appends the HTTP request header to the StringBuilder.
* @param sb The StringBuilder to append to.
* @param jo The JSONObject representing the HTTP request.
* @throws JSONException if required fields are missing.
*/
private static void appendRequestHeader(StringBuilder sb, JSONObject jo) throws JSONException {
sb.append(jo.getString("Method"));
sb.append(' ');
sb.append('"');
sb.append(jo.getString("Request-URI"));
sb.append('"');
sb.append(' ');
sb.append(jo.getString("HTTP-Version"));
}
/**
* Appends additional HTTP headers to the StringBuilder.
* @param sb The StringBuilder to append to.
* @param jo The JSONObject containing the additional headers.
*/
private static void appendAdditionalHeaders(StringBuilder sb, JSONObject jo) {
for (final String key : jo.keySet()) {
String value = jo.optString(key);
if (!"HTTP-Version".equals(key) && !"Status-Code".equals(key) &&
if (!"HTTP-Version".equals(key) && !"Status-Code".equals(key) &&
!"Reason-Phrase".equals(key) && !"Method".equals(key) &&
!"Request-URI".equals(key) && !JSONObject.NULL.equals(value)) {
!"Request-URI".equals(key) && !JSONObject.NULL.equals(value)) {
sb.append(key);
sb.append(": ");
sb.append(jo.optString(key));
sb.append(value);
sb.append(CRLF);
}
}
sb.append(CRLF);
return sb.toString();
}
}
39 changes: 12 additions & 27 deletions src/main/java/org/json/HTTPTokener.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package org.json;

/*
Public Domain.
*/

/**
* The HTTPTokener extends the JSONTokener to provide additional methods
* for the parsing of HTTP headers.
Expand All @@ -20,38 +16,27 @@ public HTTPTokener(String string) {
super(string);
}


/**
* Get the next token or string. This is used in parsing HTTP headers.
* @return A String.
* @throws JSONException if a syntax error occurs
*/
public String nextToken() throws JSONException {
char c = nextNonWhitespace();
TokenParser parser = TokenParsers.getParser(c);
return parser.parse(this, c);
}

/**
* Consume whitespace characters and return the first non-whitespace character.
* @return The first non-whitespace character.
* @throws JSONException if an error occurs while reading.
*/
private char nextNonWhitespace() throws JSONException {
char c;
char q;
StringBuilder sb = new StringBuilder();
do {
c = next();
} while (Character.isWhitespace(c));
if (c == '"' || c == '\'') {
q = c;
for (;;) {
c = next();
if (c < ' ') {
throw syntaxError("Unterminated string.");
}
if (c == q) {
return sb.toString();
}
sb.append(c);
}
}
for (;;) {
if (c == 0 || Character.isWhitespace(c)) {
return sb.toString();
}
sb.append(c);
c = next();
}
return c;
}
}
28 changes: 14 additions & 14 deletions src/main/java/org/json/JSONML.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class JSONML {
*/
public JSONML() {
}

public static final JSONMLParserConfiguration JSONML_PARSER_CONFIGURATION = new JSONMLParserConfiguration();
/**
* Parse XML values and store them in a JSONArray.
* @param x The XMLTokener containing the source string.
Expand All @@ -38,7 +38,7 @@ private static Object parse(
int currentNestingDepth
) throws JSONException {
return parse(x,arrayForm, ja,
keepStrings ? JSONMLParserConfiguration.KEEP_STRINGS : JSONMLParserConfiguration.ORIGINAL,
keepStrings ? JSONMLParserConfiguration.KEEP_STRINGS : JSONML_PARSER_CONFIGURATION,
currentNestingDepth);
}

Expand Down Expand Up @@ -81,10 +81,10 @@ private static Object parse(
throw x.syntaxError("Bad XML");
}
token = x.nextContent();
if (token == XML.LT) {
if (token == XMLSpecialCharacters.getLt()) {
token = x.nextToken();
if (token instanceof Character) {
if (token == XML.SLASH) {
if (token == XMLStructuralCharacters.getSlash()) {

// Close tag </

Expand All @@ -94,11 +94,11 @@ private static Object parse(
"Expected a closing name instead of '" +
token + "'.");
}
if (x.nextToken() != XML.GT) {
if (x.nextToken() != XMLSpecialCharacters.getGt()) {
throw x.syntaxError("Misshaped close tag");
}
return token;
} else if (token == XML.BANG) {
} else if (token == XMLSpecialCharacters.getBang()) {

// <!

Expand All @@ -124,14 +124,14 @@ private static Object parse(
token = x.nextMeta();
if (token == null) {
throw x.syntaxError("Missing '>' after '<!'.");
} else if (token == XML.LT) {
} else if (token == XMLSpecialCharacters.getLt()) {
i += 1;
} else if (token == XML.GT) {
} else if (token == XMLSpecialCharacters.getGt()) {
i -= 1;
}
} while (i > 0);
}
} else if (token == XML.QUEST) {
} else if (token == XMLStructuralCharacters.getQuest()) {

// <?

Expand Down Expand Up @@ -179,7 +179,7 @@ private static Object parse(
throw x.syntaxError("Reserved attribute.");
}
token = x.nextToken();
if (token == XML.EQ) {
if (token == XMLSpecialCharacters.getEq()) {
token = x.nextToken();
if (!(token instanceof String)) {
throw x.syntaxError("Missing value");
Expand All @@ -196,8 +196,8 @@ private static Object parse(

// Empty tag <.../>

if (token == XML.SLASH) {
if (x.nextToken() != XML.GT) {
if (token == XMLStructuralCharacters.getSlash()) {
if (x.nextToken() != XMLSpecialCharacters.getGt()) {
throw x.syntaxError("Misshaped tag");
}
if (ja == null) {
Expand All @@ -210,7 +210,7 @@ private static Object parse(
// Content, between <...> and </...>

} else {
if (token != XML.GT) {
if (token != XMLSpecialCharacters.getGt()) {
throw x.syntaxError("Misshaped tag");
}

Expand Down Expand Up @@ -261,7 +261,7 @@ private static Object parse(
* @throws JSONException Thrown on error converting to a JSONArray
*/
public static JSONArray toJSONArray(String string) throws JSONException {
return (JSONArray)parse(new XMLTokener(string), true, null, JSONMLParserConfiguration.ORIGINAL, 0);
return (JSONArray)parse(new XMLTokener(string), true, null, JSONML_PARSER_CONFIGURATION, 0);
}


Expand Down
4 changes: 1 addition & 3 deletions src/main/java/org/json/JSONMLParserConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ public class JSONMLParserConfiguration extends ParserConfiguration {
*/
public static final int DEFAULT_MAXIMUM_NESTING_DEPTH = ParserConfiguration.DEFAULT_MAXIMUM_NESTING_DEPTH;

/** Original Configuration of the XML to JSONML Parser. */
public static final JSONMLParserConfiguration ORIGINAL
= new JSONMLParserConfiguration();

/** Original configuration of the XML to JSONML Parser except that values are kept as strings. */
public static final JSONMLParserConfiguration KEEP_STRINGS
= new JSONMLParserConfiguration().withKeepStrings(true);
Expand Down
Loading
Loading