/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* .
*
*/
package org.apache.hc.core5.net;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import org.apache.hc.core5.http.NameValuePair;
import org.apache.hc.core5.http.message.BasicNameValuePair;
import org.junit.Assert;
import org.junit.Test;
public class TestURLEncodedUtils {
@Test
public void testParseURLCodedContent() throws Exception {
List result;
result = parse("");
Assert.assertTrue(result.isEmpty());
result = parse("Name0");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name0", null);
result = parse("Name1=Value1");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name1", "Value1");
result = parse("Name2=");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name2", "");
result = parse("Name3");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name3", null);
result = parse("Name4=Value%204%21");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name4", "Value 4!");
result = parse("Name4=Value%2B4%21");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name4", "Value+4!");
result = parse("Name4=Value%204%21%20%214");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name4", "Value 4! !4");
result = parse("Name5=aaa&Name6=bbb");
Assert.assertEquals(2, result.size());
assertNameValuePair(result.get(0), "Name5", "aaa");
assertNameValuePair(result.get(1), "Name6", "bbb");
result = parse("Name7=aaa&Name7=b%2Cb&Name7=ccc");
Assert.assertEquals(3, result.size());
assertNameValuePair(result.get(0), "Name7", "aaa");
assertNameValuePair(result.get(1), "Name7", "b,b");
assertNameValuePair(result.get(2), "Name7", "ccc");
result = parse("Name8=xx%2C%20%20yy%20%20%2Czz");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name8", "xx, yy ,zz");
result = parse("price=10%20%E2%82%AC");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "price", "10 \u20AC");
}
@Test
public void testParseURLCodedContentString() throws Exception {
List result;
result = parseString("");
Assert.assertTrue(result.isEmpty());
result = parseString("Name0");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name0", null);
result = parseString("Name1=Value1");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name1", "Value1");
result = parseString("Name2=");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name2", "");
result = parseString("Name3");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name3", null);
result = parseString("Name4=Value%204%21");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name4", "Value 4!");
result = parseString("Name4=Value%2B4%21");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name4", "Value+4!");
result = parseString("Name4=Value%204%21%20%214");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name4", "Value 4! !4");
result = parseString("Name5=aaa&Name6=bbb");
Assert.assertEquals(2, result.size());
assertNameValuePair(result.get(0), "Name5", "aaa");
assertNameValuePair(result.get(1), "Name6", "bbb");
result = parseString("Name7=aaa&Name7=b%2Cb&Name7=ccc");
Assert.assertEquals(3, result.size());
assertNameValuePair(result.get(0), "Name7", "aaa");
assertNameValuePair(result.get(1), "Name7", "b,b");
assertNameValuePair(result.get(2), "Name7", "ccc");
result = parseString("Name8=xx%2C%20%20yy%20%20%2Czz");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "Name8", "xx, yy ,zz");
result = parseString("price=10%20%E2%82%AC");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "price", "10 \u20AC");
}
@Test
public void testParseInvalidURLCodedContent() throws Exception {
List result;
result = parse("name=%");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "name", "%");
result = parse("name=%a");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "name", "%a");
result = parse("name=%wa%20");
Assert.assertEquals(1, result.size());
assertNameValuePair(result.get(0), "name", "%wa ");
}
private static final int SWISS_GERMAN_HELLO [] = {
0x47, 0x72, 0xFC, 0x65, 0x7A, 0x69, 0x5F, 0x7A, 0xE4, 0x6D, 0xE4
};
private static final int RUSSIAN_HELLO [] = {
0x412, 0x441, 0x435, 0x43C, 0x5F, 0x43F, 0x440, 0x438,
0x432, 0x435, 0x442
};
private static String constructString(final int [] unicodeChars) {
final StringBuilder buffer = new StringBuilder();
if (unicodeChars != null) {
for (final int unicodeChar : unicodeChars) {
buffer.append((char)unicodeChar);
}
}
return buffer.toString();
}
@Test
public void testParseUTF8Ampersand1String() throws Exception {
final String ru_hello = constructString(RUSSIAN_HELLO);
final String ch_hello = constructString(SWISS_GERMAN_HELLO);
final List parameters = new ArrayList<>();
parameters.add(new BasicNameValuePair("russian", ru_hello));
parameters.add(new BasicNameValuePair("swiss", ch_hello));
final String s = URLEncodedUtils.format(parameters, StandardCharsets.UTF_8);
final List result = URLEncodedUtils.parse(s, StandardCharsets.UTF_8);
Assert.assertEquals(2, result.size());
assertNameValuePair(result.get(0), "russian", ru_hello);
assertNameValuePair(result.get(1), "swiss", ch_hello);
}
@Test
public void testParseUTF8Ampersand2String() throws Exception {
testParseUTF8String('&');
}
@Test
public void testParseUTF8SemicolonString() throws Exception {
testParseUTF8String(';');
}
private void testParseUTF8String(final char parameterSeparator) throws Exception {
final String ru_hello = constructString(RUSSIAN_HELLO);
final String ch_hello = constructString(SWISS_GERMAN_HELLO);
final List parameters = new ArrayList<>();
parameters.add(new BasicNameValuePair("russian", ru_hello));
parameters.add(new BasicNameValuePair("swiss", ch_hello));
final String s = URLEncodedUtils.format(parameters, parameterSeparator, StandardCharsets.UTF_8);
final List result1 = URLEncodedUtils.parse(s, StandardCharsets.UTF_8);
Assert.assertEquals(2, result1.size());
assertNameValuePair(result1.get(0), "russian", ru_hello);
assertNameValuePair(result1.get(1), "swiss", ch_hello);
final List result2 = URLEncodedUtils.parse(s, StandardCharsets.UTF_8, parameterSeparator);
Assert.assertEquals(2, result2.size());
assertNameValuePair(result2.get(0), "russian", ru_hello);
assertNameValuePair(result2.get(1), "swiss", ch_hello);
}
@Test
public void testFormat() throws Exception {
final List params = new ArrayList<>();
Assert.assertEquals(0, URLEncodedUtils.format(params, StandardCharsets.US_ASCII).length());
params.clear();
params.add(new BasicNameValuePair("Name0", null));
Assert.assertEquals("Name0", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name1", "Value1"));
Assert.assertEquals("Name1=Value1", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name2", ""));
Assert.assertEquals("Name2=", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4&"));
Assert.assertEquals("Name4=Value+4%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value+4&"));
Assert.assertEquals("Name4=Value%2B4%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4& =4"));
Assert.assertEquals("Name4=Value+4%26+%3D4", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name5", "aaa"));
params.add(new BasicNameValuePair("Name6", "bbb"));
Assert.assertEquals("Name5=aaa&Name6=bbb", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name7", "aaa"));
params.add(new BasicNameValuePair("Name7", "b,b"));
params.add(new BasicNameValuePair("Name7", "ccc"));
Assert.assertEquals("Name7=aaa&Name7=b%2Cb&Name7=ccc", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
Assert.assertEquals("Name7=aaa&Name7=b%2Cb&Name7=ccc", URLEncodedUtils.format(params, '&', StandardCharsets.US_ASCII));
Assert.assertEquals("Name7=aaa;Name7=b%2Cb;Name7=ccc", URLEncodedUtils.format(params, ';', StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name8", "xx, yy ,zz"));
Assert.assertEquals("Name8=xx%2C++yy++%2Czz", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
}
@Test
public void testFormatString() throws Exception { // as above, using String
final List params = new ArrayList<>();
Assert.assertEquals(0, URLEncodedUtils.format(params, StandardCharsets.US_ASCII).length());
params.clear();
params.add(new BasicNameValuePair("Name0", null));
Assert.assertEquals("Name0", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name1", "Value1"));
Assert.assertEquals("Name1=Value1", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name2", ""));
Assert.assertEquals("Name2=", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4&"));
Assert.assertEquals("Name4=Value+4%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value+4&"));
Assert.assertEquals("Name4=Value%2B4%26", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name4", "Value 4& =4"));
Assert.assertEquals("Name4=Value+4%26+%3D4", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name5", "aaa"));
params.add(new BasicNameValuePair("Name6", "bbb"));
Assert.assertEquals("Name5=aaa&Name6=bbb", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name7", "aaa"));
params.add(new BasicNameValuePair("Name7", "b,b"));
params.add(new BasicNameValuePair("Name7", "ccc"));
Assert.assertEquals("Name7=aaa&Name7=b%2Cb&Name7=ccc", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
params.clear();
params.add(new BasicNameValuePair("Name8", "xx, yy ,zz"));
Assert.assertEquals("Name8=xx%2C++yy++%2Czz", URLEncodedUtils.format(params, StandardCharsets.US_ASCII));
}
private List parse (final String params) {
return URLEncodedUtils.parse(params, StandardCharsets.UTF_8);
}
private List parseString (final String uri) throws Exception {
return URLEncodedUtils.parse(new URI("?"+uri), StandardCharsets.UTF_8);
}
private static void assertNameValuePair (
final NameValuePair parameter,
final String expectedName,
final String expectedValue) {
Assert.assertEquals(parameter.getName(), expectedName);
Assert.assertEquals(parameter.getValue(), expectedValue);
}
}