From f3f7cd6d0d3eb5b7ffb4baebcc174d073e8f3a25 Mon Sep 17 00:00:00 2001 From: HliasMpGH Date: Tue, 9 Sep 2025 11:49:28 +0300 Subject: [PATCH] [UNDERTOW-2465] Fix javadoc and add default value for URL_CHARSET option https://issues.redhat.com/browse/UNDERTOW-2465 --- core/src/main/java/io/undertow/UndertowOptions.java | 13 +++++++++---- .../main/java/io/undertow/server/Connectors.java | 3 +-- .../server/protocol/ajp/AjpOpenListener.java | 6 +++--- .../server/protocol/http/HttpRequestParser.java | 3 +-- .../server/protocol/http2/Http2ReceiveListener.java | 3 +-- .../protocol/http2/Http2ServerConnection.java | 3 +-- .../java/io/undertow/util/QueryParameterUtils.java | 2 +- .../servlet/compat/rewrite/RewriteHandler.java | 4 +--- 8 files changed, 18 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/io/undertow/UndertowOptions.java b/core/src/main/java/io/undertow/UndertowOptions.java index 71e50f0ca2..bfe7ecb52b 100644 --- a/core/src/main/java/io/undertow/UndertowOptions.java +++ b/core/src/main/java/io/undertow/UndertowOptions.java @@ -18,6 +18,8 @@ package io.undertow; +import static java.nio.charset.StandardCharsets.UTF_8; + import org.xnio.Option; import org.xnio.Options; import org.xnio.channels.ReadTimeoutException; @@ -154,15 +156,18 @@ public class UndertowOptions { */ public static final Option DECODE_URL = Option.simple(UndertowOptions.class, "DECODE_URL", Boolean.class); - /** - * If this is true then the parser will decode the URL and query parameters using the selected character encoding (UTF-8 by default). If this is false they will - * not be decoded. This will allow a later handler to decode them into whatever charset is desired. + * The character encoding to be used for the URL decoding of requests. *

- * Defaults to true. + * Defaults to {@link #DEFAULT_URL_CHARSET}. */ public static final Option URL_CHARSET = Option.simple(UndertowOptions.class, "URL_CHARSET", String.class); + /** + * Default value of {@link #URL_CHARSET} option. + */ + public static final String DEFAULT_URL_CHARSET = UTF_8.name(); + /** * If this is true then a Connection: keep-alive header will be added to responses, even when it is not strictly required by * the specification. diff --git a/core/src/main/java/io/undertow/server/Connectors.java b/core/src/main/java/io/undertow/server/Connectors.java index 8bb06b0e77..7784e91213 100644 --- a/core/src/main/java/io/undertow/server/Connectors.java +++ b/core/src/main/java/io/undertow/server/Connectors.java @@ -39,7 +39,6 @@ import org.xnio.conduits.ConduitStreamSinkChannel; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.Date; import java.util.Map; import java.util.Set; @@ -490,7 +489,7 @@ public static void setExchangeRequestPath(final HttpServerExchange exchange, fin final OptionMap options = exchange.getConnection().getUndertowOptions(); boolean slashDecodingFlag = URLUtils.getSlashDecodingFlag(options); setExchangeRequestPath(exchange, encodedPath, - options.get(UndertowOptions.URL_CHARSET, StandardCharsets.UTF_8.name()), + options.get(UndertowOptions.URL_CHARSET, UndertowOptions.DEFAULT_URL_CHARSET), options.get(UndertowOptions.DECODE_URL, true), slashDecodingFlag, decodeBuffer, diff --git a/core/src/main/java/io/undertow/server/protocol/ajp/AjpOpenListener.java b/core/src/main/java/io/undertow/server/protocol/ajp/AjpOpenListener.java index 7ea563e2e0..7743ff16d2 100644 --- a/core/src/main/java/io/undertow/server/protocol/ajp/AjpOpenListener.java +++ b/core/src/main/java/io/undertow/server/protocol/ajp/AjpOpenListener.java @@ -44,13 +44,13 @@ import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import static io.undertow.UndertowOptions.DECODE_URL; import static io.undertow.UndertowOptions.URL_CHARSET; +import static io.undertow.UndertowOptions.DEFAULT_URL_CHARSET; /** * @author Stuart Douglas @@ -100,7 +100,7 @@ public AjpOpenListener(final ByteBufferPool pool, final OptionMap undertowOption PooledByteBuffer buf = pool.allocate(); this.bufferSize = buf.getBuffer().remaining(); buf.close(); - parser = new AjpRequestParser(undertowOptions.get(URL_CHARSET, StandardCharsets.UTF_8.name()), undertowOptions.get(DECODE_URL, true), undertowOptions.get(UndertowOptions.MAX_PARAMETERS, UndertowOptions.DEFAULT_MAX_PARAMETERS), undertowOptions.get(UndertowOptions.MAX_HEADERS, UndertowOptions.DEFAULT_MAX_HEADERS), URLUtils.getSlashDecodingFlag(undertowOptions), undertowOptions.get(UndertowOptions.ALLOW_UNESCAPED_CHARACTERS_IN_URL, false), undertowOptions.get(UndertowOptions.AJP_ALLOWED_REQUEST_ATTRIBUTES_PATTERN, DEFAULT_AJP_ALLOWED_REQUEST_ATTRIBUTES_PATTERN)); + parser = new AjpRequestParser(undertowOptions.get(URL_CHARSET, DEFAULT_URL_CHARSET), undertowOptions.get(DECODE_URL, true), undertowOptions.get(UndertowOptions.MAX_PARAMETERS, UndertowOptions.DEFAULT_MAX_PARAMETERS), undertowOptions.get(UndertowOptions.MAX_HEADERS, UndertowOptions.DEFAULT_MAX_HEADERS), URLUtils.getSlashDecodingFlag(undertowOptions), undertowOptions.get(UndertowOptions.ALLOW_UNESCAPED_CHARACTERS_IN_URL, false), undertowOptions.get(UndertowOptions.AJP_ALLOWED_REQUEST_ATTRIBUTES_PATTERN, DEFAULT_AJP_ALLOWED_REQUEST_ATTRIBUTES_PATTERN)); connectorStatistics = new ConnectorStatisticsImpl(); statisticsEnabled = undertowOptions.get(UndertowOptions.ENABLE_CONNECTOR_STATISTICS, false); } @@ -180,7 +180,7 @@ public void setUndertowOptions(final OptionMap undertowOptions) { } this.undertowOptions = undertowOptions; statisticsEnabled = undertowOptions.get(UndertowOptions.ENABLE_CONNECTOR_STATISTICS, false); - parser = new AjpRequestParser(undertowOptions.get(URL_CHARSET, StandardCharsets.UTF_8.name()), undertowOptions.get(DECODE_URL, true), undertowOptions.get(UndertowOptions.MAX_PARAMETERS, UndertowOptions.DEFAULT_MAX_PARAMETERS), undertowOptions.get(UndertowOptions.MAX_HEADERS, UndertowOptions.DEFAULT_MAX_HEADERS), URLUtils.getSlashDecodingFlag(undertowOptions), undertowOptions.get(UndertowOptions.ALLOW_UNESCAPED_CHARACTERS_IN_URL, false)); + parser = new AjpRequestParser(undertowOptions.get(URL_CHARSET, DEFAULT_URL_CHARSET), undertowOptions.get(DECODE_URL, true), undertowOptions.get(UndertowOptions.MAX_PARAMETERS, UndertowOptions.DEFAULT_MAX_PARAMETERS), undertowOptions.get(UndertowOptions.MAX_HEADERS, UndertowOptions.DEFAULT_MAX_HEADERS), URLUtils.getSlashDecodingFlag(undertowOptions), undertowOptions.get(UndertowOptions.ALLOW_UNESCAPED_CHARACTERS_IN_URL, false)); } @Override diff --git a/core/src/main/java/io/undertow/server/protocol/http/HttpRequestParser.java b/core/src/main/java/io/undertow/server/protocol/http/HttpRequestParser.java index 7443dfa6fa..f0a894bd19 100644 --- a/core/src/main/java/io/undertow/server/protocol/http/HttpRequestParser.java +++ b/core/src/main/java/io/undertow/server/protocol/http/HttpRequestParser.java @@ -22,7 +22,6 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -214,7 +213,7 @@ public HttpRequestParser(OptionMap options) { maxHeaders = options.get(UndertowOptions.MAX_HEADERS, UndertowOptions.DEFAULT_MAX_HEADERS); slashDecodingFlag = URLUtils.getSlashDecodingFlag(options); decode = options.get(UndertowOptions.DECODE_URL, true); - charset = options.get(UndertowOptions.URL_CHARSET, StandardCharsets.UTF_8.name()); + charset = options.get(UndertowOptions.URL_CHARSET, UndertowOptions.DEFAULT_URL_CHARSET); maxCachedHeaderSize = options.get(UndertowOptions.MAX_CACHED_HEADER_SIZE, UndertowOptions.DEFAULT_MAX_CACHED_HEADER_SIZE); this.allowUnescapedCharactersInUrl = options.get(UndertowOptions.ALLOW_UNESCAPED_CHARACTERS_IN_URL, false); this.allowIDLessMatrixParams = Boolean.parseBoolean(System.getProperty(ID_LESS_MATRIX_PARAMS_PROPERTY)); diff --git a/core/src/main/java/io/undertow/server/protocol/http2/Http2ReceiveListener.java b/core/src/main/java/io/undertow/server/protocol/http2/Http2ReceiveListener.java index 2ae60d97e4..a1d9107e6f 100644 --- a/core/src/main/java/io/undertow/server/protocol/http2/Http2ReceiveListener.java +++ b/core/src/main/java/io/undertow/server/protocol/http2/Http2ReceiveListener.java @@ -54,7 +54,6 @@ import javax.net.ssl.SSLSession; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; import java.util.Deque; import java.util.Map; import java.util.function.Supplier; @@ -99,7 +98,7 @@ public Http2ReceiveListener(HttpHandler rootHandler, OptionMap undertowOptions, this.maxParameters = undertowOptions.get(UndertowOptions.MAX_PARAMETERS, UndertowOptions.DEFAULT_MAX_PARAMETERS); this.recordRequestStartTime = undertowOptions.get(UndertowOptions.RECORD_REQUEST_START_TIME, false); if (undertowOptions.get(UndertowOptions.DECODE_URL, true)) { - this.encoding = undertowOptions.get(UndertowOptions.URL_CHARSET, StandardCharsets.UTF_8.name()); + this.encoding = undertowOptions.get(UndertowOptions.URL_CHARSET, UndertowOptions.DEFAULT_URL_CHARSET); } else { this.encoding = null; } diff --git a/core/src/main/java/io/undertow/server/protocol/http2/Http2ServerConnection.java b/core/src/main/java/io/undertow/server/protocol/http2/Http2ServerConnection.java index fc48796018..1ea4f8c209 100644 --- a/core/src/main/java/io/undertow/server/protocol/http2/Http2ServerConnection.java +++ b/core/src/main/java/io/undertow/server/protocol/http2/Http2ServerConnection.java @@ -21,7 +21,6 @@ import java.io.IOException; import java.net.SocketAddress; import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; import java.util.List; import javax.net.ssl.SSLSession; @@ -442,7 +441,7 @@ public boolean pushResource(String path, HttpString method, HeaderMap requestHea exchange.setProtocol(Protocols.HTTP_1_1); exchange.setRequestScheme(this.exchange.getRequestScheme()); try { - Connectors.setExchangeRequestPath(exchange, path, getUndertowOptions().get(UndertowOptions.URL_CHARSET, StandardCharsets.UTF_8.name()), getUndertowOptions().get(UndertowOptions.DECODE_URL, true), URLUtils.getSlashDecodingFlag(getUndertowOptions()), new StringBuilder(), getUndertowOptions().get(UndertowOptions.MAX_PARAMETERS, UndertowOptions.DEFAULT_MAX_HEADERS)); + Connectors.setExchangeRequestPath(exchange, path, getUndertowOptions().get(UndertowOptions.URL_CHARSET, UndertowOptions.DEFAULT_URL_CHARSET), getUndertowOptions().get(UndertowOptions.DECODE_URL, true), URLUtils.getSlashDecodingFlag(getUndertowOptions()), new StringBuilder(), getUndertowOptions().get(UndertowOptions.MAX_PARAMETERS, UndertowOptions.DEFAULT_MAX_HEADERS)); } catch (ParameterLimitException | BadRequestException e) { UndertowLogger.REQUEST_IO_LOGGER.debug("Too many parameters in HTTP/2 request", e); exchange.setStatusCode(StatusCodes.BAD_REQUEST); diff --git a/core/src/main/java/io/undertow/util/QueryParameterUtils.java b/core/src/main/java/io/undertow/util/QueryParameterUtils.java index f9723a604b..43a12b7426 100644 --- a/core/src/main/java/io/undertow/util/QueryParameterUtils.java +++ b/core/src/main/java/io/undertow/util/QueryParameterUtils.java @@ -164,7 +164,7 @@ public static String getQueryParamEncoding(HttpServerExchange exchange) { String encoding = null; OptionMap undertowOptions = exchange.getConnection().getUndertowOptions(); if(undertowOptions.get(UndertowOptions.DECODE_URL, true)) { - encoding = undertowOptions.get(UndertowOptions.URL_CHARSET, StandardCharsets.UTF_8.name()); + encoding = undertowOptions.get(UndertowOptions.URL_CHARSET, UndertowOptions.DEFAULT_URL_CHARSET); } return encoding; } diff --git a/servlet/src/main/java/io/undertow/servlet/compat/rewrite/RewriteHandler.java b/servlet/src/main/java/io/undertow/servlet/compat/rewrite/RewriteHandler.java index c90d093670..c4e574fd28 100644 --- a/servlet/src/main/java/io/undertow/servlet/compat/rewrite/RewriteHandler.java +++ b/servlet/src/main/java/io/undertow/servlet/compat/rewrite/RewriteHandler.java @@ -27,8 +27,6 @@ import io.undertow.servlet.spec.HttpServletResponseImpl; import io.undertow.util.Headers; import io.undertow.util.QueryParameterUtils; - -import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import jakarta.servlet.http.Cookie; @@ -236,7 +234,7 @@ else if (index == urlString.length() - 1) { if (queryString != null) { exchange.setQueryString(queryString); exchange.getQueryParameters().clear(); - exchange.getQueryParameters().putAll(QueryParameterUtils.parseQueryString(queryString, exchange.getConnection().getUndertowOptions().get(UndertowOptions.URL_CHARSET, StandardCharsets.UTF_8.name()))); + exchange.getQueryParameters().putAll(QueryParameterUtils.parseQueryString(queryString, exchange.getConnection().getUndertowOptions().get(UndertowOptions.URL_CHARSET, UndertowOptions.DEFAULT_URL_CHARSET))); } // Set the new host if it changed if (!host.equals(request.getServerName())) {