Skip to content

Commit

Permalink
Extract body from more text-based content types
Browse files Browse the repository at this point in the history
  • Loading branch information
guillaumebort committed Dec 17, 2010
1 parent f342c3c commit ac01598
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 20 deletions.
21 changes: 2 additions & 19 deletions framework/src/play/data/parsing/DataParser.java
Original file line number Diff line number Diff line change
@@ -1,33 +1,14 @@
package play.data.parsing;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import play.Logger;
import play.mvc.Http.Request;

/**
* A data parser parse the HTTP request data to a Map<String,String[]>
*/
public abstract class DataParser {

public static Map<String, String[]> resolveAndParse(Request request) throws UnsupportedEncodingException {
// 1. determine content-type in request
Logger.info("request contentType is %s", request.contentType);
String mimeType = request.contentType;
if (mimeType.indexOf(';') != -1) {
mimeType = mimeType.substring(0, mimeType.indexOf(';'));
}
DataParser parser = parsers.get(mimeType);
if (parser == null) {
Logger.warn("no parser registered for content type %s", mimeType);
return new HashMap<String, String[]>();
}
return parser.parse(new ByteArrayInputStream(request.querystring.getBytes("utf-8")));
}

// ~~~~~~~~ Repository
public abstract Map<String, String[]> parse(InputStream is);
public static Map<String, DataParser> parsers = new HashMap<String, DataParser>();
Expand All @@ -36,6 +17,8 @@ public static Map<String, String[]> resolveAndParse(Request request) throws Unsu
static {
parsers.put("application/x-www-form-urlencoded", new UrlEncodedParser());
parsers.put("multipart/form-data", new ApacheMultipartParser());
parsers.put("application/xml", new TextParser());
parsers.put("application/json", new TextParser());
}

public static void putMapEntry(Map<String, String[]> map, String name, String value) {
Expand Down
28 changes: 28 additions & 0 deletions framework/src/play/data/parsing/TextParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package play.data.parsing;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import play.exceptions.UnexpectedException;

public class TextParser extends DataParser {

@Override
public Map<String, String[]> parse(InputStream is) {
try {
Map<String, String[]> params = new HashMap<String, String[]>();
ByteArrayOutputStream os = new ByteArrayOutputStream();
int b;
while ((b = is.read()) != -1) {
os.write(b);
}
byte[] data = os.toByteArray();
params.put("body", new String[] {new String(data, "utf-8")});
return params;
} catch (Exception e) {
throw new UnexpectedException(e);
}
}

}
7 changes: 6 additions & 1 deletion framework/src/play/mvc/Scope.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import play.Play;
import play.data.binding.Binder;
import play.data.parsing.DataParser;
import play.data.parsing.TextParser;
import play.data.validation.Validation;
import play.exceptions.UnexpectedException;
import play.libs.Codec;
Expand Down Expand Up @@ -301,12 +302,16 @@ public void checkAndParse() {
DataParser dataParser = DataParser.parsers.get(contentType);
if (dataParser != null) {
_mergeWith(dataParser.parse(request.body));
} else {
if(contentType.startsWith("text/")) {
_mergeWith(new TextParser().parse(request.body));
}
}
}
try {
request.body.close();
} catch (Exception e) {
e.printStackTrace();
//
}
requestIsParsed = true;
}
Expand Down

0 comments on commit ac01598

Please sign in to comment.