Skip to content

Commit ceb5ac8

Browse files
author
Luis Miranda
committed
added framework-independent HttpRequest
this can be used in java-saml-core where previously we would use HttpServletRequest, therefore removing the requirement for clients to be running inside a servlet container.
1 parent 3b45261 commit ceb5ac8

3 files changed

Lines changed: 208 additions & 0 deletions

File tree

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.onelogin.saml2.http;
2+
3+
import static com.onelogin.saml2.util.Preconditions.checkNotNull;
4+
import static java.util.Collections.unmodifiableList;
5+
import static java.util.Collections.unmodifiableMap;
6+
7+
import java.util.ArrayList;
8+
import java.util.Collections;
9+
import java.util.HashMap;
10+
import java.util.List;
11+
import java.util.Map;
12+
import java.util.Objects;
13+
14+
/**
15+
* Framework-agnostic representation of an HTTP request.
16+
*
17+
* @since 2.0.0
18+
*/
19+
public final class HttpRequest {
20+
private final String requestURL;
21+
private final Map<String, List<String>> parameters;
22+
23+
/**
24+
* Creates a new HttpRequest.
25+
*
26+
* @param requestURL the request URL (up to but not including query parameters)
27+
* @throws NullPointerException if requestURL is null
28+
*/
29+
public HttpRequest(String requestURL) {
30+
this(requestURL, Collections.<String, List<String>>emptyMap());
31+
}
32+
33+
/**
34+
* Creates a new HttpRequest.
35+
*
36+
* @param requestURL the request URL (up to but not including query parameters)
37+
* @param parameters the request query parameters
38+
* @throws NullPointerException if any of the parameters is null
39+
*/
40+
public HttpRequest(String requestURL, Map<String, List<String>> parameters) {
41+
this.requestURL = checkNotNull(requestURL, "requestURL");
42+
this.parameters = unmodifiableCopyOf(checkNotNull(parameters, "queryParams"));
43+
}
44+
45+
/**
46+
* @param name the query parameter name
47+
* @param value the query parameter value
48+
* @return a new HttpRequest with the given query parameter added
49+
* @throws NullPointerException if any of the parameters is null
50+
*/
51+
public HttpRequest addParameter(String name, String value) {
52+
checkNotNull(name, "name");
53+
checkNotNull(value, "value");
54+
55+
final List<String> oldValues = parameters.containsKey(name) ? parameters.get(name) : new ArrayList<String>();
56+
final List<String> newValues = new ArrayList<>(oldValues);
57+
newValues.add(value);
58+
final Map<String, List<String>> params = new HashMap<>(parameters);
59+
params.put(name, newValues);
60+
61+
return new HttpRequest(requestURL, params);
62+
}
63+
64+
/**
65+
* The URL the client used to make the request. Includes a protocol, server name, port number, and server path, but
66+
* not the query string parameters.
67+
*
68+
* @return the request URL
69+
*/
70+
public String getRequestURL() {
71+
return requestURL;
72+
}
73+
74+
/**
75+
* @param name the query parameter name
76+
* @return the first value for the parameter, or null
77+
*/
78+
public String getParameter(String name) {
79+
List<String> values = getParameters(name);
80+
return values.isEmpty() ? null : values.get(0);
81+
}
82+
83+
/**
84+
* @param name the query parameter name
85+
* @return a List containing all values for the parameter
86+
*/
87+
public List<String> getParameters(String name) {
88+
List<String> values = parameters.get(name);
89+
return values != null ? values : Collections.<String>emptyList();
90+
}
91+
92+
/**
93+
* @return a map of all query parameters
94+
*/
95+
public Map<String, List<String>> getParameters() {
96+
return parameters;
97+
}
98+
99+
@Override
100+
public boolean equals(Object o) {
101+
if (this == o) return true;
102+
if (o == null || getClass() != o.getClass()) return false;
103+
HttpRequest that = (HttpRequest) o;
104+
return Objects.equals(requestURL, that.requestURL) &&
105+
Objects.equals(parameters, that.parameters);
106+
}
107+
108+
@Override
109+
public int hashCode() {
110+
return Objects.hash(requestURL, parameters);
111+
}
112+
113+
@Override
114+
public String toString() {
115+
return "HttpRequest{" +
116+
"requestURL='" + requestURL + '\'' +
117+
", parameters=" + parameters +
118+
'}';
119+
}
120+
121+
private static Map<String, List<String>> unmodifiableCopyOf(Map<String, List<String>> orig) {
122+
Map<String, List<String>> copy = new HashMap<>();
123+
for (Map.Entry<String, List<String>> entry : orig.entrySet()) {
124+
copy.put(entry.getKey(), unmodifiableList(new ArrayList<>(entry.getValue())));
125+
}
126+
127+
return unmodifiableMap(copy);
128+
}
129+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.onelogin.saml2.util;
2+
3+
public final class Preconditions {
4+
/**
5+
* Throws a NullPointerException if {@code t} is null.
6+
*
7+
* @param t the value to check for null
8+
* @param message the message to include in the thrown exception
9+
* @return t
10+
* @throws NullPointerException if {@code t} is null
11+
*/
12+
public static <T> T checkNotNull(T t, String message) {
13+
if (t == null) {
14+
throw new NullPointerException(message);
15+
} else {
16+
return t;
17+
}
18+
}
19+
20+
private Preconditions() {
21+
}
22+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.onelogin.saml2.http;
2+
3+
import static java.util.Collections.singletonList;
4+
import static java.util.Collections.singletonMap;
5+
import static org.hamcrest.CoreMatchers.equalTo;
6+
import static org.hamcrest.CoreMatchers.nullValue;
7+
import static org.junit.Assert.assertThat;
8+
9+
import java.util.Arrays;
10+
import java.util.Collections;
11+
import java.util.List;
12+
import java.util.Map;
13+
14+
import org.junit.Test;
15+
16+
public class HttpRequestTest {
17+
@Test
18+
public void testConstructorWithNoQueryParams() throws Exception {
19+
final String url = "url";
20+
21+
final HttpRequest request = new HttpRequest(url);
22+
assertThat(request.getRequestURL(), equalTo(url));
23+
assertThat(request.getParameters(), equalTo(Collections.<String, List<String>>emptyMap()));
24+
assertThat(request.getParameters("x"), equalTo(Collections.<String>emptyList()));
25+
assertThat(request.getParameter("x"), nullValue());
26+
}
27+
28+
@Test
29+
public void testConstructorWithQueryParams() throws Exception {
30+
final String url = "url";
31+
final String name = "name";
32+
final String value1 = "val1";
33+
final String value2 = "val2";
34+
35+
final List<String> values = Arrays.asList(value1, value2);
36+
final Map<String, List<String>> parametersMap = singletonMap(name, values);
37+
38+
final HttpRequest request = new HttpRequest(url, parametersMap);
39+
assertThat(request.getRequestURL(), equalTo(url));
40+
assertThat(request.getParameters(), equalTo(parametersMap));
41+
assertThat(request.getParameters(name), equalTo(values));
42+
assertThat(request.getParameter(name), equalTo(value1));
43+
}
44+
45+
@Test
46+
public void testAddParameter() throws Exception {
47+
final String url = "some_url";
48+
final String name = "name";
49+
final String value = "value";
50+
51+
final HttpRequest request = new HttpRequest(url).addParameter(name, value);
52+
assertThat(request.getRequestURL(), equalTo(url));
53+
assertThat(request.getParameters(), equalTo(singletonMap(name, singletonList(value))));
54+
assertThat(request.getParameters(name), equalTo(singletonList(value)));
55+
assertThat(request.getParameter(name), equalTo(value));
56+
}
57+
}

0 commit comments

Comments
 (0)