21
21
22
22
import java .io .IOException ;
23
23
import java .io .InputStream ;
24
+ import java .net .URLEncoder ;
24
25
import java .nio .charset .StandardCharsets ;
25
26
import java .util .ArrayList ;
26
27
import java .util .Base64 ;
@@ -64,6 +65,8 @@ public abstract class HttpSolrClientTestBase extends SolrJettyTestBase {
64
65
protected static final String REDIRECT_SERVLET_PATH = "/redirect" ;
65
66
protected static final String REDIRECT_SERVLET_REGEX = REDIRECT_SERVLET_PATH + "/*" ;
66
67
protected static final String COLLECTION_1 = "collection1" ;
68
+ // example chars that must be URI encoded - non-ASCII and curly quote
69
+ protected static final String MUST_ENCODE = "\u1234 \u007B " ;
67
70
68
71
@ BeforeClass
69
72
public static void beforeTest () throws Exception {
@@ -113,7 +116,7 @@ public void testQueryGet() throws Exception {
113
116
assertNull (DebugServlet .headers .get ("content-type" ));
114
117
// param encoding
115
118
assertEquals (1 , DebugServlet .parameters .get ("a" ).length );
116
- assertEquals (" \u1234 " , DebugServlet .parameters .get ("a" )[0 ]);
119
+ assertEquals (MUST_ENCODE , DebugServlet .parameters .get ("a" )[0 ]);
117
120
}
118
121
119
122
public void testQueryPost () throws Exception {
@@ -125,9 +128,11 @@ public void testQueryPost() throws Exception {
125
128
assertEquals ("javabin" , DebugServlet .parameters .get (CommonParams .WT )[0 ]);
126
129
assertEquals (1 , DebugServlet .parameters .get (CommonParams .VERSION ).length );
127
130
assertEquals (1 , DebugServlet .parameters .get ("a" ).length );
128
- assertEquals (" \u1234 " , DebugServlet .parameters .get ("a" )[0 ]);
131
+ assertEquals (MUST_ENCODE , DebugServlet .parameters .get ("a" )[0 ]);
129
132
assertEquals (expectedUserAgent (), DebugServlet .headers .get ("user-agent" ));
130
133
assertEquals ("application/x-www-form-urlencoded" , DebugServlet .headers .get ("content-type" ));
134
+ // this validates that URI encoding has been applied - the content-length is smaller if not
135
+ assertEquals ("41" , DebugServlet .headers .get ("content-length" ));
131
136
}
132
137
133
138
public void testQueryPut () throws Exception {
@@ -139,9 +144,10 @@ public void testQueryPut() throws Exception {
139
144
assertEquals ("javabin" , DebugServlet .parameters .get (CommonParams .WT )[0 ]);
140
145
assertEquals (1 , DebugServlet .parameters .get (CommonParams .VERSION ).length );
141
146
assertEquals (1 , DebugServlet .parameters .get ("a" ).length );
142
- assertEquals (" \u1234 " , DebugServlet .parameters .get ("a" )[0 ]);
147
+ assertEquals (MUST_ENCODE , DebugServlet .parameters .get ("a" )[0 ]);
143
148
assertEquals (expectedUserAgent (), DebugServlet .headers .get ("user-agent" ));
144
149
assertEquals ("application/x-www-form-urlencoded" , DebugServlet .headers .get ("content-type" ));
150
+ assertEquals ("41" , DebugServlet .headers .get ("content-length" ));
145
151
}
146
152
147
153
public void testQueryXmlGet () throws Exception {
@@ -153,7 +159,7 @@ public void testQueryXmlGet() throws Exception {
153
159
assertEquals ("xml" , DebugServlet .parameters .get (CommonParams .WT )[0 ]);
154
160
assertEquals (1 , DebugServlet .parameters .get (CommonParams .VERSION ).length );
155
161
assertEquals (1 , DebugServlet .parameters .get ("a" ).length );
156
- assertEquals (" \u1234 " , DebugServlet .parameters .get ("a" )[0 ]);
162
+ assertEquals (MUST_ENCODE , DebugServlet .parameters .get ("a" )[0 ]);
157
163
assertEquals (expectedUserAgent (), DebugServlet .headers .get ("user-agent" ));
158
164
}
159
165
@@ -166,7 +172,7 @@ public void testQueryXmlPost() throws Exception {
166
172
assertEquals ("xml" , DebugServlet .parameters .get (CommonParams .WT )[0 ]);
167
173
assertEquals (1 , DebugServlet .parameters .get (CommonParams .VERSION ).length );
168
174
assertEquals (1 , DebugServlet .parameters .get ("a" ).length );
169
- assertEquals (" \u1234 " , DebugServlet .parameters .get ("a" )[0 ]);
175
+ assertEquals (MUST_ENCODE , DebugServlet .parameters .get ("a" )[0 ]);
170
176
assertEquals (expectedUserAgent (), DebugServlet .headers .get ("user-agent" ));
171
177
assertEquals ("application/x-www-form-urlencoded" , DebugServlet .headers .get ("content-type" ));
172
178
}
@@ -180,7 +186,7 @@ public void testQueryXmlPut() throws Exception {
180
186
assertEquals ("xml" , DebugServlet .parameters .get (CommonParams .WT )[0 ]);
181
187
assertEquals (1 , DebugServlet .parameters .get (CommonParams .VERSION ).length );
182
188
assertEquals (1 , DebugServlet .parameters .get ("a" ).length );
183
- assertEquals (" \u1234 " , DebugServlet .parameters .get ("a" )[0 ]);
189
+ assertEquals (MUST_ENCODE , DebugServlet .parameters .get ("a" )[0 ]);
184
190
assertEquals (expectedUserAgent (), DebugServlet .headers .get ("user-agent" ));
185
191
assertEquals ("application/x-www-form-urlencoded" , DebugServlet .headers .get ("content-type" ));
186
192
}
@@ -284,7 +290,8 @@ protected void testUpdate(HttpSolrClientBase client, WT wt, String contentType,
284
290
SolrInputDocument doc = new SolrInputDocument ();
285
291
doc .addField ("id" , docIdValue );
286
292
req .add (doc );
287
- req .setParam ("a" , "\u1234 " );
293
+ // non-ASCII characters and curly quotes should be URI-encoded
294
+ req .setParam ("a" , MUST_ENCODE );
288
295
289
296
try {
290
297
client .request (req );
@@ -301,7 +308,7 @@ protected void testUpdate(HttpSolrClientBase client, WT wt, String contentType,
301
308
client .getParser ().getVersion (), DebugServlet .parameters .get (CommonParams .VERSION )[0 ]);
302
309
assertEquals (contentType , DebugServlet .headers .get ("content-type" ));
303
310
assertEquals (1 , DebugServlet .parameters .get ("a" ).length );
304
- assertEquals (" \u1234 " , DebugServlet .parameters .get ("a" )[0 ]);
311
+ assertEquals (MUST_ENCODE , DebugServlet .parameters .get ("a" )[0 ]);
305
312
306
313
if (wt == WT .XML ) {
307
314
String requestBody = new String (DebugServlet .requestBody , StandardCharsets .UTF_8 );
@@ -338,12 +345,14 @@ protected void testCollectionParameters(
338
345
protected void setReqParamsOf (UpdateRequest req , String ... keys ) {
339
346
if (keys != null ) {
340
347
for (String k : keys ) {
341
- req .setParam (k , k + "Value" );
348
+ // note inclusion of non-ASCII character, and curly quotes which should be URI encoded
349
+ req .setParam (k , k + "Value" + MUST_ENCODE );
342
350
}
343
351
}
344
352
}
345
353
346
- protected void verifyServletState (HttpSolrClientBase client , SolrRequest <?> request ) {
354
+ protected void verifyServletState (HttpSolrClientBase client , SolrRequest <?> request )
355
+ throws Exception {
347
356
// check query String
348
357
Iterator <String > paramNames = request .getParams ().getParameterNamesIterator ();
349
358
while (paramNames .hasNext ()) {
@@ -355,7 +364,9 @@ protected void verifyServletState(HttpSolrClientBase client, SolrRequest<?> requ
355
364
client .getUrlParamNames ().contains (name )
356
365
|| (request .getQueryParams () != null && request .getQueryParams ().contains (name ));
357
366
assertEquals (
358
- shouldBeInQueryString , DebugServlet .queryString .contains (name + "=" + value ));
367
+ shouldBeInQueryString ,
368
+ DebugServlet .queryString .contains (
369
+ name + "=" + URLEncoder .encode (value , StandardCharsets .UTF_8 .name ())));
359
370
// in either case, it should be in the parameters
360
371
assertNotNull (DebugServlet .parameters .get (name ));
361
372
assertEquals (1 , DebugServlet .parameters .get (name ).length );
0 commit comments