Skip to content

Commit

Permalink
Added req/res wrappers
Browse files Browse the repository at this point in the history
  • Loading branch information
perwendel committed May 21, 2011
1 parent 47e266b commit 9400030
Show file tree
Hide file tree
Showing 6 changed files with 233 additions and 4 deletions.
6 changes: 5 additions & 1 deletion src/main/java/spark/Request.java
Expand Up @@ -77,6 +77,10 @@ public class Request {
// request.form_data? # false
// request.referrer # the referrer of the client or '/'

protected Request() {
// Used by wrapper
}

/**
* Constructor
*/
Expand All @@ -90,7 +94,7 @@ public class Request {
* Returns the value of the provided route pattern parameter.
* Example: parameter 'name' from the following pattern: (get '/hello/:name')
*/
public final String params(String param) {
public String params(String param) {
if (param.startsWith(":")) {
return params.get(param);
} else {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/spark/Response.java
Expand Up @@ -30,6 +30,10 @@ public class Response {
private HttpServletResponse response;
private String body;

protected Response() {
// Used by wrapper
}

Response(HttpServletResponse response) {
this.response = response;
}
Expand Down
20 changes: 17 additions & 3 deletions src/main/java/spark/webserver/MatcherFilter.java
Expand Up @@ -71,6 +71,9 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo

String bodyContent = null;

RequestWrapper req = new RequestWrapper();
ResponseWrapper res = new ResponseWrapper();

LOG.debug("httpMethod:" + httpMethod + ", uri: " + uri);
try {
// BEFORE filters
Expand All @@ -84,7 +87,10 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo

spark.Filter filter = (spark.Filter) filterTarget;

filter.handle(request, response);
req.setDelegate(request);
res.setDelegate(response);

filter.handle(req, res);

String bodyAfterFilter = Access.getBody(response);
if (bodyAfterFilter != null) {
Expand All @@ -110,7 +116,11 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
Route route = ((Route) target);
Request request = RequestResponseFactory.create(match, httpRequest);
Response response = RequestResponseFactory.create(httpResponse);
result = route.handle(request, response);

req.setDelegate(request);
res.setDelegate(response);

result = route.handle(req, res);
}
if (result != null) {
bodyContent = result.toString();
Expand Down Expand Up @@ -139,8 +149,12 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
if (filterTarget != null && filterTarget instanceof spark.Filter) {
Request request = RequestResponseFactory.create(filterMatch, httpRequest);
Response response = RequestResponseFactory.create(httpResponse);

req.setDelegate(request);
res.setDelegate(response);

spark.Filter filter = (spark.Filter) filterTarget;
filter.handle(request, response);
filter.handle(req, res);

String bodyAfterFilter = Access.getBody(response);
if (bodyAfterFilter != null) {
Expand Down
117 changes: 117 additions & 0 deletions src/main/java/spark/webserver/RequestWrapper.java
@@ -0,0 +1,117 @@
/*
* Copyright 2011- Per Wendel
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package spark.webserver;

import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import spark.Request;

class RequestWrapper extends Request {

private Request delegate;

public void setDelegate(Request delegate) {
this.delegate = delegate;
}

public String requestMethod() {
return delegate.requestMethod();
}

public String scheme() {
return delegate.scheme();
}

public int port() {
return delegate.port();
}

public String pathInfo() {
return delegate.pathInfo();
}

public String contentType() {
return delegate.contentType();
}

public String body() {
return delegate.body();
}

public int contentLength() {
return delegate.contentLength();
}

public boolean equals(Object obj) {
return delegate.equals(obj);
}

public int hashCode() {
return delegate.hashCode();
}

public final String params(String param) {
return delegate.params(param);
}

public String host() {
return delegate.host();
}

public String ip() {
return delegate.ip();
}

public String queryParams(String queryParam) {
return delegate.queryParams(queryParam);
}

public String headers(String header) {
return delegate.headers(header);
}

public Set<String> queryParams() {
return delegate.queryParams();
}

public Set<String> headers() {
return delegate.headers();
}

public String queryString() {
return delegate.queryString();
}

public HttpServletRequest raw() {
return delegate.raw();
}

public String toString() {
return delegate.toString();
}

public String userAgent() {
return delegate.userAgent();
}

public String url() {
return delegate.url();
}

}
67 changes: 67 additions & 0 deletions src/main/java/spark/webserver/ResponseWrapper.java
@@ -0,0 +1,67 @@
/*
* Copyright 2011- Per Wendel
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package spark.webserver;

import javax.servlet.http.HttpServletResponse;

import spark.Response;

class ResponseWrapper extends Response {

private Response delegate;

public void setDelegate(Response delegate) {
this.delegate = delegate;
}

public void status(int statusCode) {
delegate.status(statusCode);
}

public void body(String body) {
delegate.body(body);
}

public boolean equals(Object obj) {
return delegate.equals(obj);
}

public int hashCode() {
return delegate.hashCode();
}

public HttpServletResponse raw() {
return delegate.raw();
}

public void redirect(String location) {
delegate.redirect(location);
}

public void header(String header, String value) {
delegate.header(header, value);
}

public String toString() {
return delegate.toString();
}

public void type(String contentType) {
delegate.type(contentType);
}

}
23 changes: 23 additions & 0 deletions src/test/java/spark/SparkIntegrationTest.java
Expand Up @@ -3,6 +3,8 @@
import java.io.FileNotFoundException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

import junit.framework.Assert;

Expand All @@ -23,7 +25,22 @@ public class SparkIntegrationTest {
@BeforeClass
public static void setup() {
Spark.setPort(PORT);

Spark.before(new Filter(){
@Override
public void handle(Request request, Response response) {
response.header("FOZ", "BAZ");
}
});

Books.main(null);

Spark.after(new Filter(){
@Override
public void handle(Request request, Response response) {
response.header("FOO", "BAR");
}
});
try {
Thread.sleep(500);
} catch (Exception e) {
Expand Down Expand Up @@ -72,6 +89,10 @@ public void testGetBook() {
Assert.assertEquals(200, response.status);
Assert.assertTrue(result.contains(AUTHOR));
Assert.assertTrue(result.contains(TITLE));

// verify response header set by filters:
Assert.assertTrue(response.headers.get("FOZ").get(0).equals("BAZ"));
Assert.assertTrue(response.headers.get("FOO").get(0).equals("BAR"));
} catch (Throwable e) {
throw new RuntimeException(e);
}
Expand Down Expand Up @@ -150,10 +171,12 @@ private static UrlResponse doMethod(String requestMethod, String path, String bo
UrlResponse response = new UrlResponse();
response.body = res;
response.status = connection.getResponseCode();
response.headers = connection.getHeaderFields();
return response;
}

private static class UrlResponse {
public Map<String, List<String>> headers;
private String body;
private int status;
}
Expand Down

0 comments on commit 9400030

Please sign in to comment.