1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.forgerock.json.resource.http;
18
19 import java.util.Collections;
20 import java.util.LinkedHashMap;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Set;
24 import java.util.TreeMap;
25
26 import org.forgerock.services.context.AbstractContext;
27 import org.forgerock.services.context.Context;
28 import org.forgerock.http.protocol.Header;
29 import org.forgerock.json.JsonValue;
30 import org.forgerock.util.Factory;
31 import org.forgerock.util.LazyMap;
32
33
34 public final class HttpContext extends AbstractContext {
35
36
37
38
39
40
41 public static final String ATTR_HEADERS = "headers";
42
43
44
45
46
47 public static final String ATTR_PARAMETERS = "parameters";
48
49
50
51
52
53 public static final String ATTR_METHOD = "method";
54
55
56
57
58
59
60 public static final String ATTR_PATH = "path";
61
62 private final Map<String, List<String>> headers;
63 private final Map<String, List<String>> parameters;
64
65 HttpContext(Context parent, final org.forgerock.http.protocol.Request req) {
66 super(parent, "http");
67 data.put(ATTR_METHOD, HttpUtils.getMethod(req));
68 data.put(ATTR_PATH, getRequestPath(req));
69 this.headers = Collections.unmodifiableMap(new LazyMap<>(
70 new Factory<Map<String, List<String>>>() {
71 @Override
72 public Map<String, List<String>> newInstance() {
73 Map<String, List<String>> result = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
74 for (Map.Entry<String, Header> header : req.getHeaders().asMapOfHeaders().entrySet()) {
75 String name = header.getKey();
76 List<String> values = header.getValue().getValues();
77 result.put(name, values);
78 }
79 return result;
80 }
81 }));
82 data.put(ATTR_HEADERS, headers);
83 this.parameters = Collections.unmodifiableMap(new LazyMap<>(
84 new Factory<Map<String, List<String>>>() {
85 @Override
86 public Map<String, List<String>> newInstance() {
87 Map<String, List<String>> result = new LinkedHashMap<>();
88 Set<Map.Entry<String, List<String>>> parameters = req.getForm().entrySet();
89 for (Map.Entry<String, List<String>> parameter : parameters) {
90 String name = parameter.getKey();
91 List<String> values = parameter.getValue();
92 result.put(name, values);
93 }
94 return result;
95 }
96 }));
97 data.put(ATTR_PARAMETERS, parameters);
98 }
99
100
101
102
103
104
105
106
107
108
109
110 public HttpContext(final JsonValue savedContext, final ClassLoader classLoader) {
111 super(savedContext, classLoader);
112 this.headers = data.get(ATTR_HEADERS).required().asMapOfList(String.class);
113 this.parameters = data.get(ATTR_PARAMETERS).required().asMapOfList(String.class);
114 }
115
116 private String getRequestPath(org.forgerock.http.protocol.Request req) {
117 return new StringBuilder()
118 .append(req.getUri().getScheme())
119 .append("://")
120 .append(req.getUri().getRawAuthority())
121 .append(req.getUri().getRawPath()).toString();
122 }
123
124
125
126
127
128
129
130
131
132
133
134 public List<String> getHeader(String name) {
135 List<String> header = headers.get(name);
136 return Collections.unmodifiableList(header != null ? header : Collections.<String> emptyList());
137 }
138
139
140
141
142
143
144
145
146
147 public String getHeaderAsString(String name) {
148 List<String> header = getHeader(name);
149 return header.isEmpty() ? null : header.get(0);
150 }
151
152
153
154
155
156
157 public Map<String, List<String>> getHeaders() {
158 return headers;
159 }
160
161
162
163
164
165
166
167
168 public String getMethod() {
169 return data.get(ATTR_METHOD).asString();
170 }
171
172
173
174
175
176
177
178
179
180
181
182 public List<String> getParameter(String name) {
183 final List<String> parameter = parameters.get(name);
184 return Collections.unmodifiableList(parameter != null ? parameter : Collections.<String> emptyList());
185 }
186
187
188
189
190
191
192
193
194
195 public String getParameterAsString(String name) {
196 final List<String> parameter = getParameter(name);
197 return parameter.isEmpty() ? null : parameter.get(0);
198 }
199
200
201
202
203
204
205 public Map<String, List<String>> getParameters() {
206 return parameters;
207 }
208
209
210
211
212
213
214 public String getPath() {
215 return data.get(ATTR_PATH).asString();
216 }
217 }