Skip to content

Commit 7071898

Browse files
authored
Merge pull request #676 from andrenpaes/servlet-request-attributes
Exposes Servlet Request attributes
2 parents 7c9f59b + 402753e commit 7071898

4 files changed

Lines changed: 65 additions & 5 deletions

File tree

jooby-servlet/src/main/java/org/jooby/servlet/ServletServletRequest.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,9 @@
2323
import java.io.IOException;
2424
import java.io.InputStream;
2525
import java.net.URLDecoder;
26-
import java.util.Arrays;
27-
import java.util.Collections;
28-
import java.util.Enumeration;
29-
import java.util.List;
30-
import java.util.Optional;
26+
import java.util.*;
3127
import java.util.concurrent.Executor;
28+
import java.util.function.Function;
3229
import java.util.stream.Collectors;
3330

3431
import javax.servlet.ServletException;
@@ -119,6 +116,16 @@ public List<String> params(final String name) throws Exception {
119116
return Arrays.asList(values);
120117
}
121118

119+
@Override
120+
public Map<String, Object> attributes() {
121+
final Enumeration<String> attributeNames = req.getAttributeNames();
122+
if (!attributeNames.hasMoreElements()) {
123+
return Collections.emptyMap();
124+
}
125+
return Collections.list(attributeNames).stream()
126+
.collect(Collectors.toMap(Function.identity(), name -> req.getAttribute(name)));
127+
}
128+
122129
@Override
123130
public List<String> headers(final String name) {
124131
return toList(req.getHeaders(name));

jooby-servlet/src/test/java/org/jooby/servlet/ServletServletRequestTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
import static org.junit.Assert.assertEquals;
55

66
import java.io.IOException;
7+
import java.util.Arrays;
8+
import java.util.Collections;
9+
import java.util.UUID;
710

811
import javax.servlet.ServletException;
912
import javax.servlet.http.HttpServletRequest;
1013

14+
import com.google.common.collect.ImmutableMap;
1115
import org.jooby.MediaType;
1216
import org.jooby.test.MockUnit;
1317
import org.junit.Test;
@@ -148,6 +152,45 @@ public void noparams() throws IOException, Exception {
148152

149153
}
150154

155+
@Test
156+
public void attributes() throws Exception {
157+
String tmpdir = System.getProperty("java.io.tmpdir");
158+
final UUID serverAttribute = UUID.randomUUID();
159+
new MockUnit(HttpServletRequest.class)
160+
.expect(unit -> {
161+
HttpServletRequest req = unit.get(HttpServletRequest.class);
162+
expect(req.getContentType()).andReturn("text/html");
163+
expect(req.getPathInfo()).andReturn("/");
164+
expect(req.getAttributeNames()).andReturn(
165+
Collections.enumeration(Collections.singletonList("server.attribute")));
166+
expect(req.getAttribute("server.attribute")).andReturn(serverAttribute);
167+
})
168+
.run(unit -> {
169+
assertEquals(ImmutableMap.of("server.attribute", serverAttribute),
170+
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
171+
.attributes());
172+
});
173+
174+
}
175+
176+
@Test
177+
public void emptyAttributes() throws Exception {
178+
String tmpdir = System.getProperty("java.io.tmpdir");
179+
new MockUnit(HttpServletRequest.class)
180+
.expect(unit -> {
181+
HttpServletRequest req = unit.get(HttpServletRequest.class);
182+
expect(req.getContentType()).andReturn("text/html");
183+
expect(req.getPathInfo()).andReturn("/");
184+
expect(req.getAttributeNames()).andReturn(Collections.emptyEnumeration());
185+
})
186+
.run(unit -> {
187+
assertEquals(Collections.emptyMap(),
188+
new ServletServletRequest(unit.get(HttpServletRequest.class), tmpdir)
189+
.attributes());
190+
});
191+
192+
}
193+
151194
@Test(expected = IOException.class)
152195
public void filesFailure() throws IOException, Exception {
153196
String tmpdir = System.getProperty("java.io.tmpdir");

jooby/src/main/java/org/jooby/internal/HttpHandlerImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ public void handle(final NativeRequest request, final NativeResponse response) t
227227
requestPath = rpath.apply(requestPath);
228228
}
229229

230+
// put request attributes first to make sure we don't override defaults
231+
locals.putAll(request.attributes());
230232
// default locals
231233
locals.put(CONTEXT_PATH, contextPath);
232234
locals.put(PATH, requestPath);

jooby/src/main/java/org/jooby/spi/NativeRequest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.io.IOException;
2222
import java.io.InputStream;
23+
import java.util.Collections;
2324
import java.util.List;
2425
import java.util.Map;
2526
import java.util.Optional;
@@ -71,6 +72,13 @@ public interface NativeRequest {
7172
*/
7273
List<String> params(String name) throws Exception;
7374

75+
/**
76+
* @return Map containing all request attributes
77+
*/
78+
default Map<String, Object> attributes() {
79+
return Collections.emptyMap();
80+
}
81+
7482
/**
7583
* Get all the headers for the provided name or a empty list.
7684
*

0 commit comments

Comments
 (0)