Skip to content

Commit

Permalink
Refactored the request body processing in the HTTP components.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Oct 5, 2015
1 parent 33ad279 commit 6485e6e
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 20 deletions.
Expand Up @@ -115,9 +115,7 @@ public Map<String, String> toMap(String data) {
return map; return map;
} }


public Map<String, String> toMap(Buf src, boolean urlDecodeKeys, boolean urlDecodeVals) { public void toMap(Buf src, boolean urlDecodeKeys, boolean urlDecodeVals, Map<String, String> dest) {
Map<String, String> map = U.map();

for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
String key = keys[i].str(src.bytes()); String key = keys[i].str(src.bytes());
String val = values[i].str(src.bytes()); String val = values[i].str(src.bytes());
Expand All @@ -129,9 +127,13 @@ public Map<String, String> toMap(Buf src, boolean urlDecodeKeys, boolean urlDeco
val = UTILS.urlDecode(val); val = UTILS.urlDecode(val);
} }


map.put(key, val); dest.put(key, val);
} }
}


public Map<String, String> toMap(Buf src, boolean urlDecodeKeys, boolean urlDecodeVals) {
Map<String, String> map = U.map();
toMap(src, urlDecodeKeys, urlDecodeVals, map);
return map; return map;
} }


Expand Down
6 changes: 3 additions & 3 deletions rapidoid-http-api/src/main/java/org/rapidoid/http/Req.java
Expand Up @@ -67,11 +67,11 @@ public interface Req {


String cookie(@P("name") String name, @P("defaultValue") String defaultValue); String cookie(@P("name") String name, @P("defaultValue") String defaultValue);


Map<String, String> posted(); Map<String, Object> posted();


String posted(@P("name") String name); <T extends Serializable> T posted(@P("name") String name);


String posted(@P("name") String name, @P("defaultValue") String defaultValue); <T extends Serializable> T posted(@P("name") String name, @P("defaultValue") T defaultValue);


Map<String, byte[]> files(); Map<String, byte[]> files();


Expand Down
Expand Up @@ -137,9 +137,10 @@ public class HttpExchangeImpl extends DefaultExchange<HttpExchangeImpl> implemen
private final MultiData _params; private final MultiData _params;
private final MultiData _headers; private final MultiData _headers;
private final MultiData _cookies; private final MultiData _cookies;
private final MultiData _posted;
private final BinaryMultiData _files; private final BinaryMultiData _files;


private volatile Map<String, Object> postedData;

private int responseCode; private int responseCode;
private String redirectUrl; private String redirectUrl;
private String sessionId; private String sessionId;
Expand Down Expand Up @@ -190,7 +191,6 @@ public HttpExchangeImpl() {
this._params = multiData(params); this._params = multiData(params);
this._headers = multiData(headersKV); this._headers = multiData(headersKV);
this._cookies = multiData(cookies); this._cookies = multiData(cookies);
this._posted = multiData(posted);
this._files = binaryMultiData(files); this._files = binaryMultiData(files);


reset(); reset();
Expand Down Expand Up @@ -225,6 +225,8 @@ public synchronized void reset() {
path = null; path = null;
home = "/"; home = "/";


postedData = null;

parsedParams = false; parsedParams = false;
parsedHeaders = false; parsedHeaders = false;
parsedBody = false; parsedBody = false;
Expand All @@ -251,7 +253,6 @@ public synchronized void reset() {
_params.reset(); _params.reset();
_headers.reset(); _headers.reset();
_cookies.reset(); _cookies.reset();
_posted.reset();
_files.reset(); _files.reset();


resetResponse(); resetResponse();
Expand Down Expand Up @@ -475,18 +476,21 @@ public synchronized String cookie(String name, String defaultValue) {
} }


@Override @Override
public synchronized Map<String, String> posted() { public synchronized Map<String, Object> posted() {
return posted_().get(); doParseBody();
return postedData;
} }


@SuppressWarnings("unchecked")
@Override @Override
public synchronized String posted(String name) { public synchronized <T extends Serializable> T posted(String name) {
return U.notNull(posted_().get(name), "POSTED[%s]", name); return (T) U.notNull(posted().get(name), "POSTED[%s]", name);
} }


@SuppressWarnings("unchecked")
@Override @Override
public synchronized String posted(String name, String defaultValue) { public synchronized <T extends Serializable> T posted(String name, T defaultValue) {
return U.or(posted_().get(name), defaultValue); return (T) U.or(posted().get(name), defaultValue);
} }


@Override @Override
Expand Down
28 changes: 26 additions & 2 deletions rapidoid-http/src/main/java/org/rapidoid/http/HttpRouter.java
Expand Up @@ -69,11 +69,11 @@ private synchronized void addRoute(String action, String path, Handler handler)
} }


private long hash(String action, String path) { private long hash(String action, String path) {
return action.charAt(0) * 17 + action.length() * 19 + path.charAt(0); return action.charAt(0) * 17 + path.length() * 19 + path.charAt(path.length() - 1);
} }


private long hash(Buf buf, Range action, Range path) { private long hash(Buf buf, Range action, Range path) {
return buf.get(action.start) * 17 + action.length * 19 + buf.get(path.start); return buf.get(action.start) * 17 + path.length * 19 + buf.get(path.last());
} }


@Override @Override
Expand All @@ -82,6 +82,30 @@ public void dispatch(HttpExchangeImpl x) {
handle(handler, x); handle(handler, x);
} }


public Handler findHandler(Buf buf, Range action, Range path) {
long hash = hash(buf, action, path);

SimpleList<Route> candidates = routes.get(hash);

if (candidates != null) {

for (int i = 0; i < candidates.size(); i++) {
Route route = candidates.get(i);

if (BytesUtil.matches(buf.bytes(), action, route.action, true)
&& BytesUtil.startsWith(buf.bytes(), path, route.path, true)) {

int pos = path.start + route.path.length;
if (path.limit() == pos || buf.get(pos) == '/') {
return route.handler;
}
}
}
}

return null;
}

private Handler findHandler(HttpExchangeImpl x) { private Handler findHandler(HttpExchangeImpl x) {


Buf buf = x.input(); Buf buf = x.input();
Expand Down
Expand Up @@ -59,8 +59,6 @@ public interface LowLevelHttpExchange extends HttpExchange {


MultiData cookies_(); MultiData cookies_();


MultiData posted_();

BinaryMultiData files_(); BinaryMultiData files_();


LowLevelHttpExchange send(); LowLevelHttpExchange send();
Expand Down

0 comments on commit 6485e6e

Please sign in to comment.