Skip to content

Commit

Permalink
WebRequest.getParameters() updated to deliver the same results as the…
Browse files Browse the repository at this point in the history
… servlet API (issue #836)
  • Loading branch information
rbri committed Jul 31, 2024
1 parent 9a72f0b commit 66062b6
Show file tree
Hide file tree
Showing 4 changed files with 158 additions and 367 deletions.
7 changes: 7 additions & 0 deletions src/changes/changes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@

<body>
<release version="4.5.0" date="xxxx, 2024" description="WebWorker, Bugfixes">
<action type="update" dev="rbri" issue="#836">
WebRequest.getParameters() updated to deliver the same results as the servlet API
will report if this request reaches a servlet. This implies several changes: For url-encoded and
plain text encoded post requests, the query parameters are part of the result.
For multipart requests only the query parameters forming the result. Additionally only
the first occurence of a key is part of the result.
</action>
<action type="add" dev="rbri" issue="#816">
WorkerNavigator and WorkerLocation implemented.
</action>
Expand Down
21 changes: 17 additions & 4 deletions src/main/java/org/htmlunit/WebRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
Expand Down Expand Up @@ -378,21 +379,28 @@ public List<NameValuePair> getParameters() {
return normalize(allParameters);
}

if (getEncodingType() == FormEncodingType.TEXT_PLAIN && HttpMethod.POST == getHttpMethod()) {
if (getEncodingType() == FormEncodingType.TEXT_PLAIN && HttpMethod.POST == getHttpMethod()) {
if (getRequestBody() == null) {
final List<NameValuePair> allParameters = new ArrayList<>();
allParameters.addAll(HttpUtils.parseUrlQuery(getUrl().getQuery(), getCharset()));
allParameters.addAll(getRequestParameters());
// the servlet api ignores the parameters
// allParameters.addAll(getRequestParameters());
return normalize(allParameters);
}

return normalize(HttpUtils.parseUrlQuery(getUrl().getQuery(), getCharset()));
}

if ((getEncodingType() == FormEncodingType.URL_ENCODED || getEncodingType() == FormEncodingType.TEXT_PLAIN)
&& HttpMethod.PUT == getHttpMethod()) {
return normalize(HttpUtils.parseUrlQuery(getUrl().getQuery(), getCharset()));
}

if (FormEncodingType.MULTIPART == getEncodingType()) {
final List<NameValuePair> allParameters = new ArrayList<>();
allParameters.addAll(HttpUtils.parseUrlQuery(getUrl().getQuery(), getCharset()));
allParameters.addAll(getRequestParameters());
// the servlet api ignores the parameters
// allParameters.addAll(getRequestParameters());
return normalize(allParameters);
}

Expand All @@ -405,9 +413,14 @@ private static List<NameValuePair> normalize(final List<NameValuePair> pairs) {
return pairs;
}

final Set<String> keys = new HashSet<>();

final List<NameValuePair> resultingPairs = new ArrayList<>();
for (final NameValuePair pair : pairs) {
resultingPairs.add(pair.normalized());
if (!keys.contains(pair.getName())) {
resultingPairs.add(pair.normalized());
keys.add(pair.getName());
}
}

return resultingPairs;
Expand Down
Loading

0 comments on commit 66062b6

Please sign in to comment.