Skip to content

Commit 607e30f

Browse files
committed
add URI-based component provider and query parser
1 parent bf66e74 commit 607e30f

File tree

4 files changed

+104
-71
lines changed

4 files changed

+104
-71
lines changed

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@
8080
<artifactId>commons-lang3</artifactId>
8181
<version>3.12.0</version>
8282
</dependency>
83+
<dependency>
84+
<groupId>org.apache.httpcomponents.core5</groupId>
85+
<artifactId>httpcore5</artifactId>
86+
<version>5.1.4</version>
87+
</dependency>
8388
</dependencies>
8489
<distributionManagement>
8590
<snapshotRepository>

src/main/java/io/bspk/httpsig/SignatureParameters.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,4 +275,9 @@ public static SignatureParameters fromDictionaryEntry(Dictionary signatureInput,
275275
}
276276

277277
}
278+
279+
@Override
280+
public String toString() {
281+
return "SignatureParameters: " + toComponentValue().serialize();
282+
}
278283
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package io.bspk.httpsig;
2+
3+
import java.net.URI;
4+
import java.nio.charset.Charset;
5+
import java.util.List;
6+
7+
import org.apache.hc.core5.http.NameValuePair;
8+
import org.apache.hc.core5.net.WWWFormCodec;
9+
10+
/**
11+
* @author jricher
12+
*
13+
*/
14+
public abstract class UriRequestComponentProviderAdapter extends RequestComponentProviderAdapter {
15+
16+
17+
private final URI uri;
18+
19+
20+
public UriRequestComponentProviderAdapter(URI uri)
21+
{
22+
this.uri = uri;
23+
}
24+
25+
26+
@Override
27+
public String getAuthority()
28+
{
29+
return uri.getAuthority();
30+
}
31+
32+
33+
@Override
34+
public String getScheme()
35+
{
36+
return uri.getScheme();
37+
}
38+
39+
40+
@Override
41+
public String getTargetUri()
42+
{
43+
return uri.toString();
44+
}
45+
46+
47+
@Override
48+
public String getRequestTarget()
49+
{
50+
String reqt = "";
51+
if (uri.getRawPath() != null) {
52+
reqt += uri.getRawPath();
53+
}
54+
if (uri.getRawQuery() != null) {
55+
reqt += "?" + uri.getRawQuery();
56+
}
57+
return reqt;
58+
}
59+
60+
61+
@Override
62+
public String getPath()
63+
{
64+
return uri.getPath();
65+
}
66+
67+
68+
@Override
69+
public String getQuery()
70+
{
71+
return uri.getQuery();
72+
}
73+
74+
75+
@Override
76+
public String getQueryParams(String name)
77+
{
78+
List<NameValuePair> params = WWWFormCodec.parse(getQuery(), Charset.defaultCharset());
79+
return params.stream()
80+
.filter(p -> p.getName().equals(name))
81+
.map(NameValuePair::getValue)
82+
.reduce((a, b) -> {
83+
throw new IllegalArgumentException("Found two named parameters, unsupported opperation");
84+
})
85+
.orElse(null);
86+
}
87+
88+
89+
}

src/main/java/io/bspk/httpsig/servlet/HttpServletRequestProvider.java

Lines changed: 5 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2,104 +2,38 @@
22

33
import java.net.URI;
44
import java.util.Collections;
5-
import java.util.List;
6-
import java.util.Map;
7-
import java.util.function.Function;
8-
import java.util.stream.Collectors;
95

106
import javax.servlet.http.HttpServletRequest;
117

12-
import org.springframework.util.MultiValueMap;
13-
import org.springframework.web.util.UriComponentsBuilder;
14-
158
import io.bspk.httpsig.ComponentProvider;
9+
import io.bspk.httpsig.UriRequestComponentProviderAdapter;
1610

1711
/**
1812
* @author jricher
1913
*
2014
*/
21-
public class HttpServletRequestProvider implements ComponentProvider {
15+
public class HttpServletRequestProvider extends UriRequestComponentProviderAdapter {
2216

2317
private HttpServletRequest request;
24-
private URI uri;
25-
private Map<String, Integer> counters;
2618

2719
public HttpServletRequestProvider(HttpServletRequest request) {
20+
super(URI.create(request.getRequestURL().toString()
21+
+ (request.getQueryString() != null ? "?" + request.getQueryString() : "")));
2822
this.request = request;
29-
this.uri = URI.create(request.getRequestURL().toString()
30-
+ (request.getQueryString() != null ? "?" + request.getQueryString() : ""));
3123
}
3224

3325
@Override
3426
public String getMethod() {
3527
return request.getMethod();
3628
}
3729

38-
@Override
39-
public String getAuthority() {
40-
return uri.getHost();
41-
}
42-
43-
@Override
44-
public String getScheme() {
45-
return uri.getScheme();
46-
}
47-
48-
@Override
49-
public String getTargetUri() {
50-
return uri.toString();
51-
}
52-
53-
@Override
54-
public String getRequestTarget() {
55-
String reqt = "";
56-
if (uri.getRawPath() != null) {
57-
reqt += uri.getRawPath();
58-
}
59-
if (uri.getRawQuery() != null) {
60-
reqt += "?" + uri.getRawQuery();
61-
}
62-
return reqt;
63-
}
64-
65-
@Override
66-
public String getPath() {
67-
return uri.getRawPath();
68-
}
69-
70-
@Override
71-
public String getQuery() {
72-
return uri.getRawQuery();
73-
}
74-
75-
@Override
76-
public String getQueryParams(String name) {
77-
MultiValueMap<String,String> queryParams = UriComponentsBuilder.fromUri(uri).build().getQueryParams();
78-
List<String> values = queryParams.get(name);
79-
80-
if (values.size() == 1) {
81-
// no problem, return one
82-
return values.get(0);
83-
} else if (values.size() == 0) {
84-
throw new IllegalArgumentException("Could not find query parameter named " + name);
85-
} else {
86-
if (counters == null) {
87-
// we have to count the accesses, initialize all to zero
88-
counters = queryParams.keySet().stream()
89-
.collect(Collectors.toMap(Function.identity(), (k) -> 0));
90-
}
91-
Integer count = counters.get(name); // get the current count (ie: 1)
92-
counters.put(name, count + 1); // increment the count (ie: 2)
93-
return values.get(count); // return the value at the position before the update (ie: 1)
94-
}
95-
}
96-
9730
@Override
9831
public String getStatus() {
9932
throw new UnsupportedOperationException("Requests cannot return a status code");
10033
}
10134

10235
@Override
36+
@SuppressWarnings("unchecked") // we know the enumeration returns strings
10337
public String getField(String name) {
10438
return ComponentProvider.combineFieldValues(Collections.list(request.getHeaders(name)));
10539
}

0 commit comments

Comments
 (0)