fix plus parsing
This commit is contained in:
parent
a63557cdd9
commit
1f949104ef
10 changed files with 97 additions and 10 deletions
|
@ -55,7 +55,7 @@ subprojects {
|
||||||
targetCompatibility = JavaVersion.VERSION_1_8
|
targetCompatibility = JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
tasks.withType(JavaCompile) {
|
tasks.withType(JavaCompile) {
|
||||||
options.compilerArgs << "-Xlint:all,-serial" << "-profile" << "compact1"
|
options.compilerArgs << "-Xlint:all,-serial"
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
|
@ -89,7 +89,7 @@ subprojects {
|
||||||
imagesdir: 'img'
|
imagesdir: 'img'
|
||||||
}
|
}
|
||||||
|
|
||||||
javadoc {
|
/*javadoc {
|
||||||
options.docletpath = configurations.asciidoclet.files.asType(List)
|
options.docletpath = configurations.asciidoclet.files.asType(List)
|
||||||
options.doclet = 'org.asciidoctor.Asciidoclet'
|
options.doclet = 'org.asciidoctor.Asciidoclet'
|
||||||
//options.overview = "src/docs/asciidoclet/overview.adoc"
|
//options.overview = "src/docs/asciidoclet/overview.adoc"
|
||||||
|
@ -99,7 +99,7 @@ subprojects {
|
||||||
configure(options) {
|
configure(options) {
|
||||||
noTimestamp = true
|
noTimestamp = true
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
task sourcesJar(type: Jar, dependsOn: classes) {
|
task sourcesJar(type: Jar, dependsOn: classes) {
|
||||||
classifier 'sources'
|
classifier 'sources'
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
group = org.xbib
|
group = org.xbib
|
||||||
name = net
|
name = net
|
||||||
version = 1.2.1
|
version = 1.2.2
|
||||||
|
|
||||||
jackson.version = 2.8.11
|
jackson.version = 2.8.11
|
||||||
junit.version = 4.12
|
junit.version = 4.12
|
||||||
|
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
||||||
#Thu Jan 17 15:23:55 CET 2019
|
#Tue Apr 16 23:50:27 CEST 2019
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-5.3-all.zip
|
||||||
|
|
18
gradlew
vendored
18
gradlew
vendored
|
@ -1,5 +1,21 @@
|
||||||
#!/usr/bin/env sh
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright 2015 the original author or authors.
|
||||||
|
#
|
||||||
|
# Licensed 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.
|
||||||
|
#
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
##
|
||||||
## Gradle start up script for UN*X
|
## Gradle start up script for UN*X
|
||||||
|
@ -28,7 +44,7 @@ APP_NAME="Gradle"
|
||||||
APP_BASE_NAME=`basename "$0"`
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m"'
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD="maximum"
|
MAX_FD="maximum"
|
||||||
|
|
18
gradlew.bat
vendored
18
gradlew.bat
vendored
|
@ -1,3 +1,19 @@
|
||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%" == "" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
|
@ -14,7 +30,7 @@ set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
set DEFAULT_JVM_OPTS="-Xmx64m"
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
@rem Find java.exe
|
@rem Find java.exe
|
||||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
|
@ -20,7 +20,7 @@ import java.util.SortedSet;
|
||||||
* A limited multi-map of HTTP request parameters. Each key references a
|
* A limited multi-map of HTTP request parameters. Each key references a
|
||||||
* limited set of parameters collected from the request during message
|
* limited set of parameters collected from the request during message
|
||||||
* signing. Parameter values are sorted as per
|
* signing. Parameter values are sorted as per
|
||||||
* <a href="http://oauth.net/core/1.0a/#anchor13">OAuth specification</a></a>.
|
* <a href="http://oauth.net/core/1.0a/#anchor13">OAuth specification</a>.
|
||||||
* Every key/value pair will be percent-encoded upon insertion.
|
* Every key/value pair will be percent-encoded upon insertion.
|
||||||
* This class has special semantics tailored to
|
* This class has special semantics tailored to
|
||||||
* being useful for message signing; it's not a general purpose collection class
|
* being useful for message signing; it's not a general purpose collection class
|
||||||
|
@ -130,6 +130,8 @@ public class HttpParameters implements Map<String, SortedSet<String>> {
|
||||||
* @param key the parameter name
|
* @param key the parameter name
|
||||||
* @param value the parameter value
|
* @param value the parameter value
|
||||||
* @return the value
|
* @return the value
|
||||||
|
* @throws MalformedInputException if input is malformed
|
||||||
|
* @throws UnmappableCharacterException if characters are unmappable
|
||||||
*/
|
*/
|
||||||
public String put(String key, String value)
|
public String put(String key, String value)
|
||||||
throws MalformedInputException, UnmappableCharacterException {
|
throws MalformedInputException, UnmappableCharacterException {
|
||||||
|
@ -145,6 +147,8 @@ public class HttpParameters implements Map<String, SortedSet<String>> {
|
||||||
* @param percentEncode whether key and value should be percent encoded before being
|
* @param percentEncode whether key and value should be percent encoded before being
|
||||||
* inserted into the map
|
* inserted into the map
|
||||||
* @return the value
|
* @return the value
|
||||||
|
* @throws MalformedInputException if input is malformed
|
||||||
|
* @throws UnmappableCharacterException if characters are unmappable
|
||||||
*/
|
*/
|
||||||
public String put(String key, String value, boolean percentEncode)
|
public String put(String key, String value, boolean percentEncode)
|
||||||
throws MalformedInputException, UnmappableCharacterException {
|
throws MalformedInputException, UnmappableCharacterException {
|
||||||
|
@ -169,6 +173,8 @@ public class HttpParameters implements Map<String, SortedSet<String>> {
|
||||||
* @param key the parameter name
|
* @param key the parameter name
|
||||||
* @param nullString can be anything, but probably... null?
|
* @param nullString can be anything, but probably... null?
|
||||||
* @return null
|
* @return null
|
||||||
|
* @throws MalformedInputException if input is malformed
|
||||||
|
* @throws UnmappableCharacterException if characters are unmappable
|
||||||
*/
|
*/
|
||||||
public String putNull(String key, String nullString)
|
public String putNull(String key, String nullString)
|
||||||
throws MalformedInputException, UnmappableCharacterException {
|
throws MalformedInputException, UnmappableCharacterException {
|
||||||
|
@ -194,7 +200,7 @@ public class HttpParameters implements Map<String, SortedSet<String>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience method to merge a Map<String, List<String>>.
|
* Convenience method to merge a {@code Map<String, List<String>>}.
|
||||||
*
|
*
|
||||||
* @param m the map
|
* @param m the map
|
||||||
*/
|
*/
|
||||||
|
@ -226,6 +232,8 @@ public class HttpParameters implements Map<String, SortedSet<String>> {
|
||||||
* characters!)
|
* characters!)
|
||||||
* @param percentDecode whether the value being retrieved should be percent decoded
|
* @param percentDecode whether the value being retrieved should be percent decoded
|
||||||
* @return the first value found for this parameter
|
* @return the first value found for this parameter
|
||||||
|
* @throws MalformedInputException if input is malformed
|
||||||
|
* @throws UnmappableCharacterException if characters are unmappable
|
||||||
*/
|
*/
|
||||||
public String getFirst(String key, boolean percentDecode)
|
public String getFirst(String key, boolean percentDecode)
|
||||||
throws MalformedInputException, UnmappableCharacterException {
|
throws MalformedInputException, UnmappableCharacterException {
|
||||||
|
@ -243,6 +251,8 @@ public class HttpParameters implements Map<String, SortedSet<String>> {
|
||||||
*
|
*
|
||||||
* @param key the parameter name
|
* @param key the parameter name
|
||||||
* @return the query string
|
* @return the query string
|
||||||
|
* @throws MalformedInputException if input is malformed
|
||||||
|
* @throws UnmappableCharacterException if characters are unmappable
|
||||||
*/
|
*/
|
||||||
public String getAsQueryString(String key)
|
public String getAsQueryString(String key)
|
||||||
throws MalformedInputException, UnmappableCharacterException {
|
throws MalformedInputException, UnmappableCharacterException {
|
||||||
|
@ -257,6 +267,8 @@ public class HttpParameters implements Map<String, SortedSet<String>> {
|
||||||
* @param percentEncode whether key should be percent encoded before being
|
* @param percentEncode whether key should be percent encoded before being
|
||||||
* used with the map
|
* used with the map
|
||||||
* @return the query string
|
* @return the query string
|
||||||
|
* @throws MalformedInputException if input is malformed
|
||||||
|
* @throws UnmappableCharacterException if characters are unmappable
|
||||||
*/
|
*/
|
||||||
public String getAsQueryString(String key, boolean percentEncode)
|
public String getAsQueryString(String key, boolean percentEncode)
|
||||||
throws MalformedInputException, UnmappableCharacterException {
|
throws MalformedInputException, UnmappableCharacterException {
|
||||||
|
|
|
@ -253,6 +253,7 @@ public class URL implements Comparable<URL> {
|
||||||
/**
|
/**
|
||||||
* Return a special URL denoting the fact that this URL should be considered as invalid.
|
* Return a special URL denoting the fact that this URL should be considered as invalid.
|
||||||
* The URL has a null scheme.
|
* The URL has a null scheme.
|
||||||
|
* @return url
|
||||||
*/
|
*/
|
||||||
public static URL nullUrl() {
|
public static URL nullUrl() {
|
||||||
return NULL_URL;
|
return NULL_URL;
|
||||||
|
@ -409,6 +410,7 @@ public class URL implements Comparable<URL> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the percent-decoded path of the {@code URL} if it exists.
|
* Get the percent-decoded path of the {@code URL} if it exists.
|
||||||
|
* @return decoded path
|
||||||
*/
|
*/
|
||||||
public String getDecodedPath() {
|
public String getDecodedPath() {
|
||||||
return decode(path);
|
return decode(path);
|
||||||
|
|
|
@ -159,6 +159,16 @@ public class URLParserTest {
|
||||||
assertRoundTrip(url.toExternalForm());
|
assertRoundTrip(url.toExternalForm());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPassword() throws Exception {
|
||||||
|
URL url = URL.from("ftp://aaa:b%2B1@www.google.com");
|
||||||
|
assertEquals("b+1", url.getPassword());
|
||||||
|
assertRoundTrip(url.toExternalForm());
|
||||||
|
url = URL.from("ftp://aaa:b+1@www.google.com");
|
||||||
|
assertEquals("b+1", url.getPassword());
|
||||||
|
assertRoundTrip(url.toExternalForm());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPlus() throws Exception {
|
public void testPlus() throws Exception {
|
||||||
URL url = URL.from("http://foobar:8080/test/print?value=%EA%B0%80+%EB%82%98");
|
URL url = URL.from("http://foobar:8080/test/print?value=%EA%B0%80+%EB%82%98");
|
||||||
|
|
|
@ -1,10 +1,15 @@
|
||||||
package org.xbib.net.path;
|
package org.xbib.net.path;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.xbib.net.URL;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.nio.charset.MalformedInputException;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.charset.UnmappableCharacterException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
|
@ -37,4 +42,30 @@ public class PathDecoderTest {
|
||||||
assertEquals("[b c]", decoder.params().get("a").toString());
|
assertEquals("[b c]", decoder.params().get("a").toString());
|
||||||
assertEquals("[e f]", decoder.params().get("d").toString());
|
assertEquals("[e f]", decoder.params().get("d").toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPlusPercent() throws Exception {
|
||||||
|
PathDecoder decoder = new PathDecoder("//path?a=b%2Bc", "d=e%2Bf", StandardCharsets.UTF_8);
|
||||||
|
assertEquals("/path", decoder.path());
|
||||||
|
assertEquals("[b+c]", decoder.params().get("a").toString());
|
||||||
|
assertEquals("[e+f]", decoder.params().get("d").toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void decodeURL() throws MalformedInputException, UnmappableCharacterException {
|
||||||
|
String requestURI = "/pdfconverter/index.gtpl?x-fl-key=20190035592&x-fl-source=ftp://DE-465:r09t00k25@herakles.hbz-nrw.de/fl/upload/20190035592/20190035592.pdf&x-fl-target=ftp://DE-1073:haribo%2B1@herakles.hbz-nrw.de/fl/download/20190035592/Fernleihe_Kopienlieferung_null_FB201900373_BLQDMT62_20190035592_20190035592.pdf&x-fl-copy=&x-fl-ack=https://fl.hbz-nrw.de/app/ack/index.gtpl&x-fl-pages=1-";
|
||||||
|
URL url = URL.builder().path(requestURI).build();
|
||||||
|
log.log(Level.INFO, "URL: url=" + url + " path=" + url.getPath() + " query=" + url.getQuery() +
|
||||||
|
" fragment=" + url.getFragment());
|
||||||
|
PathDecoder decoder = new PathDecoder(requestURI, StandardCharsets.UTF_8);
|
||||||
|
if (url.getQuery() != null) {
|
||||||
|
decoder.parse(url.getDecodedQuery());
|
||||||
|
}
|
||||||
|
log.log(Level.INFO, "decoded query=" + url.getDecodedQuery());
|
||||||
|
log.log(Level.INFO, "path decoder params=" + decoder.params());
|
||||||
|
url = URL.from(decoder.params().get("x-fl-target").get(0));
|
||||||
|
log.log(Level.INFO, "url=" + url);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final Logger log = Logger.getLogger(PathDecoderTest.class.getName());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue