Skip to content

Commit 5316c0d

Browse files
authored
Fixing #941 - Jetty specific import in spark.Request (#942)
In 2.7.0 release a specific Jetty import was mistakenly added in spark.Request. This PR fixes this.
1 parent c0d7926 commit 5316c0d

File tree

5 files changed

+662
-6
lines changed

5 files changed

+662
-6
lines changed

src/main/java/spark/Request.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
import javax.servlet.http.Cookie;
3232
import javax.servlet.http.HttpServletRequest;
3333
import javax.servlet.http.HttpSession;
34-
import org.eclipse.jetty.util.URIUtil;
3534

3635
import spark.routematch.RouteMatch;
36+
import spark.utils.urldecoding.UrlDecode;
3737
import spark.utils.IOUtils;
3838
import spark.utils.SparkUtils;
3939
import spark.utils.StringUtils;
@@ -286,7 +286,7 @@ public String queryParams(String queryParam) {
286286
/**
287287
* Gets the query param, or returns default value
288288
*
289-
* @param queryParam the query parameter
289+
* @param queryParam the query parameter
290290
* @param defaultValue the default value
291291
* @return the value of the provided queryParam, or default if value is null
292292
* Example: query parameter 'id' from the following request URI: /hello?id=foo
@@ -497,12 +497,16 @@ private static Map<String, String> getParams(List<String> request, List<String>
497497

498498
for (int i = 0; (i < request.size()) && (i < matched.size()); i++) {
499499
String matchedPart = matched.get(i);
500+
500501
if (SparkUtils.isParam(matchedPart)) {
501-
String decodedReq = URIUtil.decodePath(request.get(i));
502+
503+
String decodedReq = UrlDecode.path(request.get(i));
504+
502505
LOG.debug("matchedPart: "
503-
+ matchedPart
504-
+ " = "
505-
+ decodedReq);
506+
+ matchedPart
507+
+ " = "
508+
+ decodedReq);
509+
506510
params.put(matchedPart.toLowerCase(), decodedReq);
507511
}
508512
}
Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
//
2+
// ========================================================================
3+
// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
4+
// ------------------------------------------------------------------------
5+
// All rights reserved. This program and the accompanying materials
6+
// are made available under the terms of the Eclipse Public License v1.0
7+
// and Apache License v2.0 which accompanies this distribution.
8+
//
9+
// The Eclipse Public License is available at
10+
// http://www.eclipse.org/legal/epl-v10.html
11+
//
12+
// The Apache License v2.0 is available at
13+
// http://www.opensource.org/licenses/apache2.0.php
14+
//
15+
// You may elect to redistribute this code under either of these licenses.
16+
// ========================================================================
17+
//
18+
package spark.utils.urldecoding;
19+
20+
import java.lang.reflect.Method;
21+
import java.util.HashMap;
22+
23+
/* ------------------------------------------------------------ */
24+
25+
/**
26+
* TYPE Utilities.
27+
* Provides various static utiltiy methods for manipulating types and their
28+
* string representations.
29+
*
30+
* @since Jetty 4.1
31+
*/
32+
public class TypeUtil {
33+
34+
/* ------------------------------------------------------------ */
35+
private static final HashMap<String, Class<?>> name2Class = new HashMap<>();
36+
37+
static {
38+
name2Class.put("boolean", java.lang.Boolean.TYPE);
39+
name2Class.put("byte", java.lang.Byte.TYPE);
40+
name2Class.put("char", java.lang.Character.TYPE);
41+
name2Class.put("double", java.lang.Double.TYPE);
42+
name2Class.put("float", java.lang.Float.TYPE);
43+
name2Class.put("int", java.lang.Integer.TYPE);
44+
name2Class.put("long", java.lang.Long.TYPE);
45+
name2Class.put("short", java.lang.Short.TYPE);
46+
name2Class.put("void", java.lang.Void.TYPE);
47+
48+
name2Class.put("java.lang.Boolean.TYPE", java.lang.Boolean.TYPE);
49+
name2Class.put("java.lang.Byte.TYPE", java.lang.Byte.TYPE);
50+
name2Class.put("java.lang.Character.TYPE", java.lang.Character.TYPE);
51+
name2Class.put("java.lang.Double.TYPE", java.lang.Double.TYPE);
52+
name2Class.put("java.lang.Float.TYPE", java.lang.Float.TYPE);
53+
name2Class.put("java.lang.Integer.TYPE", java.lang.Integer.TYPE);
54+
name2Class.put("java.lang.Long.TYPE", java.lang.Long.TYPE);
55+
name2Class.put("java.lang.Short.TYPE", java.lang.Short.TYPE);
56+
name2Class.put("java.lang.Void.TYPE", java.lang.Void.TYPE);
57+
58+
name2Class.put("java.lang.Boolean", java.lang.Boolean.class);
59+
name2Class.put("java.lang.Byte", java.lang.Byte.class);
60+
name2Class.put("java.lang.Character", java.lang.Character.class);
61+
name2Class.put("java.lang.Double", java.lang.Double.class);
62+
name2Class.put("java.lang.Float", java.lang.Float.class);
63+
name2Class.put("java.lang.Integer", java.lang.Integer.class);
64+
name2Class.put("java.lang.Long", java.lang.Long.class);
65+
name2Class.put("java.lang.Short", java.lang.Short.class);
66+
67+
name2Class.put("Boolean", java.lang.Boolean.class);
68+
name2Class.put("Byte", java.lang.Byte.class);
69+
name2Class.put("Character", java.lang.Character.class);
70+
name2Class.put("Double", java.lang.Double.class);
71+
name2Class.put("Float", java.lang.Float.class);
72+
name2Class.put("Integer", java.lang.Integer.class);
73+
name2Class.put("Long", java.lang.Long.class);
74+
name2Class.put("Short", java.lang.Short.class);
75+
76+
name2Class.put(null, java.lang.Void.TYPE);
77+
name2Class.put("string", java.lang.String.class);
78+
name2Class.put("String", java.lang.String.class);
79+
name2Class.put("java.lang.String", java.lang.String.class);
80+
}
81+
82+
/* ------------------------------------------------------------ */
83+
private static final HashMap<Class<?>, String> class2Name = new HashMap<>();
84+
85+
static {
86+
class2Name.put(java.lang.Boolean.TYPE, "boolean");
87+
class2Name.put(java.lang.Byte.TYPE, "byte");
88+
class2Name.put(java.lang.Character.TYPE, "char");
89+
class2Name.put(java.lang.Double.TYPE, "double");
90+
class2Name.put(java.lang.Float.TYPE, "float");
91+
class2Name.put(java.lang.Integer.TYPE, "int");
92+
class2Name.put(java.lang.Long.TYPE, "long");
93+
class2Name.put(java.lang.Short.TYPE, "short");
94+
class2Name.put(java.lang.Void.TYPE, "void");
95+
96+
class2Name.put(java.lang.Boolean.class, "java.lang.Boolean");
97+
class2Name.put(java.lang.Byte.class, "java.lang.Byte");
98+
class2Name.put(java.lang.Character.class, "java.lang.Character");
99+
class2Name.put(java.lang.Double.class, "java.lang.Double");
100+
class2Name.put(java.lang.Float.class, "java.lang.Float");
101+
class2Name.put(java.lang.Integer.class, "java.lang.Integer");
102+
class2Name.put(java.lang.Long.class, "java.lang.Long");
103+
class2Name.put(java.lang.Short.class, "java.lang.Short");
104+
105+
class2Name.put(null, "void");
106+
class2Name.put(java.lang.String.class, "java.lang.String");
107+
}
108+
109+
/* ------------------------------------------------------------ */
110+
private static final HashMap<Class<?>, Method> class2Value = new HashMap<>();
111+
112+
static {
113+
try {
114+
Class<?>[] s = {java.lang.String.class};
115+
116+
class2Value.put(java.lang.Boolean.TYPE,
117+
java.lang.Boolean.class.getMethod("valueOf", s));
118+
class2Value.put(java.lang.Byte.TYPE,
119+
java.lang.Byte.class.getMethod("valueOf", s));
120+
class2Value.put(java.lang.Double.TYPE,
121+
java.lang.Double.class.getMethod("valueOf", s));
122+
class2Value.put(java.lang.Float.TYPE,
123+
java.lang.Float.class.getMethod("valueOf", s));
124+
class2Value.put(java.lang.Integer.TYPE,
125+
java.lang.Integer.class.getMethod("valueOf", s));
126+
class2Value.put(java.lang.Long.TYPE,
127+
java.lang.Long.class.getMethod("valueOf", s));
128+
class2Value.put(java.lang.Short.TYPE,
129+
java.lang.Short.class.getMethod("valueOf", s));
130+
131+
class2Value.put(java.lang.Boolean.class,
132+
java.lang.Boolean.class.getMethod("valueOf", s));
133+
class2Value.put(java.lang.Byte.class,
134+
java.lang.Byte.class.getMethod("valueOf", s));
135+
class2Value.put(java.lang.Double.class,
136+
java.lang.Double.class.getMethod("valueOf", s));
137+
class2Value.put(java.lang.Float.class,
138+
java.lang.Float.class.getMethod("valueOf", s));
139+
class2Value.put(java.lang.Integer.class,
140+
java.lang.Integer.class.getMethod("valueOf", s));
141+
class2Value.put(java.lang.Long.class,
142+
java.lang.Long.class.getMethod("valueOf", s));
143+
class2Value.put(java.lang.Short.class,
144+
java.lang.Short.class.getMethod("valueOf", s));
145+
} catch (Exception e) {
146+
throw new Error(e);
147+
}
148+
}
149+
150+
/**
151+
* Parse an int from a substring.
152+
* Negative numbers are not handled.
153+
*
154+
* @param s String
155+
* @param offset Offset within string
156+
* @param length Length of integer or -1 for remainder of string
157+
* @param base base of the integer
158+
* @return the parsed integer
159+
* @throws NumberFormatException if the string cannot be parsed
160+
*/
161+
public static int parseInt(String s, int offset, int length, int base)
162+
throws NumberFormatException {
163+
int value = 0;
164+
165+
if (length < 0) {
166+
length = s.length() - offset;
167+
}
168+
169+
for (int i = 0; i < length; i++) {
170+
char c = s.charAt(offset + i);
171+
172+
int digit = convertHexDigit((int) c);
173+
if (digit < 0 || digit >= base) {
174+
throw new NumberFormatException(s.substring(offset, offset + length));
175+
}
176+
value = value * base + digit;
177+
}
178+
return value;
179+
}
180+
181+
/* ------------------------------------------------------------ */
182+
public static String toString(byte[] bytes, int base) {
183+
StringBuilder buf = new StringBuilder();
184+
for (byte b : bytes) {
185+
int bi = 0xff & b;
186+
int c = '0' + (bi / base) % base;
187+
if (c > '9') {
188+
c = 'a' + (c - '0' - 10);
189+
}
190+
buf.append((char) c);
191+
c = '0' + bi % base;
192+
if (c > '9') {
193+
c = 'a' + (c - '0' - 10);
194+
}
195+
buf.append((char) c);
196+
}
197+
return buf.toString();
198+
}
199+
200+
/* ------------------------------------------------------------ */
201+
202+
/**
203+
* @param c An ASCII encoded character 0-9 a-f A-F
204+
* @return The byte value of the character 0-16.
205+
*/
206+
public static int convertHexDigit(char c) {
207+
int d = ((c & 0x1f) + ((c >> 6) * 0x19) - 0x10);
208+
if (d < 0 || d > 15) {
209+
throw new NumberFormatException("!hex " + c);
210+
}
211+
return d;
212+
}
213+
214+
/* ------------------------------------------------------------ */
215+
216+
/**
217+
* @param c An ASCII encoded character 0-9 a-f A-F
218+
* @return The byte value of the character 0-16.
219+
*/
220+
public static int convertHexDigit(int c) {
221+
int d = ((c & 0x1f) + ((c >> 6) * 0x19) - 0x10);
222+
if (d < 0 || d > 15) {
223+
throw new NumberFormatException("!hex " + c);
224+
}
225+
return d;
226+
}
227+
228+
/* ------------------------------------------------------------ */
229+
public static String toHexString(byte b) {
230+
return toHexString(new byte[] {b}, 0, 1);
231+
}
232+
233+
/* ------------------------------------------------------------ */
234+
public static String toHexString(byte[] b, int offset, int length) {
235+
StringBuilder buf = new StringBuilder();
236+
for (int i = offset; i < offset + length; i++) {
237+
int bi = 0xff & b[i];
238+
int c = '0' + (bi / 16) % 16;
239+
if (c > '9') {
240+
c = 'A' + (c - '0' - 10);
241+
}
242+
buf.append((char) c);
243+
c = '0' + bi % 16;
244+
if (c > '9') {
245+
c = 'a' + (c - '0' - 10);
246+
}
247+
buf.append((char) c);
248+
}
249+
return buf.toString();
250+
}
251+
}

0 commit comments

Comments
 (0)