diff --git a/web/src/main/java/com/aspectran/web/activity/WebActivity.java b/web/src/main/java/com/aspectran/web/activity/WebActivity.java index 94c1375db..f6d058320 100755 --- a/web/src/main/java/com/aspectran/web/activity/WebActivity.java +++ b/web/src/main/java/com/aspectran/web/activity/WebActivity.java @@ -30,12 +30,11 @@ import com.aspectran.utils.Assert; import com.aspectran.utils.StringUtils; import com.aspectran.utils.annotation.jsr305.NonNull; -import com.aspectran.web.activity.request.MultipartFormDataParser; -import com.aspectran.web.activity.request.MultipartRequestParseException; import com.aspectran.web.activity.request.WebRequestBodyParser; import com.aspectran.web.adapter.HttpServletRequestAdapter; import com.aspectran.web.adapter.HttpServletResponseAdapter; import com.aspectran.web.adapter.HttpSessionAdapter; +import com.aspectran.web.adapter.WebRequestAdapter; import com.aspectran.web.service.WebService; import com.aspectran.web.support.http.HttpHeaders; import com.aspectran.web.support.http.MediaType; @@ -45,6 +44,7 @@ import java.io.UnsupportedEncodingException; import static com.aspectran.core.context.rule.RequestRule.LOCALE_CHANGE_INTERCEPTOR_SETTING_NAME; +import static com.aspectran.web.activity.request.WebRequestBodyParser.MAX_REQUEST_SIZE_SETTING_NAME; /** * An activity that processes a web request. @@ -53,10 +53,6 @@ */ public class WebActivity extends CoreActivity { - private static final String MULTIPART_FORM_DATA_PARSER_SETTING_NAME = "multipartFormDataParser"; - - private static final String MAX_REQUEST_SIZE_SETTING_NAME = "maxRequestSize"; - private final String reverseContextPath; private final HttpServletRequest request; @@ -223,40 +219,15 @@ protected void parseRequest() throws RequestParseException, ActivityTerminatedEx MediaType mediaType = ((HttpServletRequestAdapter)getRequestAdapter()).getMediaType(); if (mediaType != null) { if (WebRequestBodyParser.isMultipartForm(getRequestAdapter().getRequestMethod(), mediaType)) { - parseMultipartFormData(); + WebRequestBodyParser.parseMultipartFormData(this); } else if (WebRequestBodyParser.isURLEncodedForm(mediaType)) { - parseURLEncodedFormData(); + WebRequestBodyParser.parseURLEncodedFormData((WebRequestAdapter)getRequestAdapter()); } } super.parseRequest(); } - /** - * Parse the multipart form data. - */ - private void parseMultipartFormData() throws MultipartRequestParseException { - String multipartFormDataParser = getSetting(MULTIPART_FORM_DATA_PARSER_SETTING_NAME); - if (multipartFormDataParser == null) { - throw new MultipartRequestParseException("The setting name 'multipartFormDataParser' for multipart " + - "form data parsing is not specified. Please specify 'multipartFormDataParser' via Aspect so " + - "that Translet can parse multipart form data."); - } - - MultipartFormDataParser parser = getBean(multipartFormDataParser); - if (parser == null) { - throw new MultipartRequestParseException("No bean named '" + multipartFormDataParser + "' is defined"); - } - parser.parse(getRequestAdapter()); - } - - /** - * Parse the URL-encoded Form Data to get the request parameters. - */ - private void parseURLEncodedFormData() throws RequestParseException { - WebRequestBodyParser.parseURLEncodedFormData(getRequestAdapter()); - } - @Override protected LocaleResolver resolveLocale() { LocaleResolver localeResolver = super.resolveLocale(); diff --git a/web/src/main/java/com/aspectran/web/activity/request/WebRequestBodyParser.java b/web/src/main/java/com/aspectran/web/activity/request/WebRequestBodyParser.java index 3b48731ac..b63d07318 100644 --- a/web/src/main/java/com/aspectran/web/activity/request/WebRequestBodyParser.java +++ b/web/src/main/java/com/aspectran/web/activity/request/WebRequestBodyParser.java @@ -15,10 +15,10 @@ */ package com.aspectran.web.activity.request; +import com.aspectran.core.activity.Activity; import com.aspectran.core.activity.request.RequestBodyParser; import com.aspectran.core.activity.request.RequestParseException; import com.aspectran.core.activity.request.SizeLimitExceededException; -import com.aspectran.core.adapter.RequestAdapter; import com.aspectran.core.context.rule.type.MethodType; import com.aspectran.utils.ClassUtils; import com.aspectran.utils.LinkedMultiValueMap; @@ -29,13 +29,15 @@ import com.aspectran.utils.apon.JsonToApon; import com.aspectran.utils.apon.Parameters; import com.aspectran.utils.apon.XmlToApon; +import com.aspectran.web.adapter.WebRequestAdapter; import com.aspectran.web.support.http.MediaType; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; import java.net.URLDecoder; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -44,28 +46,40 @@ * * @since 6.2.0 */ -public class WebRequestBodyParser { +public abstract class WebRequestBodyParser { - private static final String DEFAULT_ENCODING = "ISO-8859-1"; + public static final String MULTIPART_FORM_DATA_PARSER_SETTING_NAME = "multipartFormDataParser"; + + public static final String MAX_REQUEST_SIZE_SETTING_NAME = "maxRequestSize"; + + private static final Charset DEFAULT_ENCODING = StandardCharsets.ISO_8859_1; private static final int BUFFER_SIZE = 1024; - private WebRequestBodyParser() { - } + /** + * Parse the multipart form data. + */ + public static void parseMultipartFormData(@NonNull Activity activity) throws MultipartRequestParseException { + String multipartFormDataParser = activity.getSetting(MULTIPART_FORM_DATA_PARSER_SETTING_NAME); + if (multipartFormDataParser == null) { + throw new MultipartRequestParseException("The setting name 'multipartFormDataParser' for multipart " + + "form data parsing is not specified. Please specify 'multipartFormDataParser' via Aspect so " + + "that Translet can parse multipart form data."); + } - @NonNull - public static String parseBody(InputStream inputStream, String encoding) - throws IOException, SizeLimitExceededException { - return parseBody(inputStream, encoding, 0L); + MultipartFormDataParser parser = activity.getBean(multipartFormDataParser); + if (parser == null) { + throw new MultipartRequestParseException("No bean named '" + multipartFormDataParser + "' is defined"); + } + parser.parse(activity.getRequestAdapter()); } @NonNull - public static String parseBody(InputStream inputStream, String encoding, long maxSize) - throws IOException, SizeLimitExceededException { + public static String parseBody(WebRequestAdapter requestAdapter) throws IOException, SizeLimitExceededException { + Charset encoding = determineEncoding(requestAdapter); + InputStream inputStream = requestAdapter.getInputStream(); + long maxSize = requestAdapter.getMaxRequestSize(); StringBuilder sb = new StringBuilder(); - if (encoding == null) { - encoding = DEFAULT_ENCODING; - } InputStreamReader reader = new InputStreamReader(inputStream, encoding); char[] buffer = new char[BUFFER_SIZE]; int bytesRead; @@ -85,32 +99,46 @@ public static String parseBody(InputStream inputStream, String encoding, long ma } @Nullable - public static MultiValueMap parseURLEncoded(String body, String encoding) - throws UnsupportedEncodingException { - if (StringUtils.isEmpty(body)) { + public static T parseBodyAsParameters( + @NonNull WebRequestAdapter requestAdapter, Class requiredType) throws RequestParseException { + MediaType mediaType = requestAdapter.getMediaType(); + if (mediaType == null) { return null; } - MultiValueMap multiValueMap = new LinkedMultiValueMap<>(); - String[] pairs = StringUtils.tokenize(body, "&"); - for (String pair : pairs) { - int idx = pair.indexOf('='); - if (idx == -1) { - String name = URLDecoder.decode(pair, encoding); - multiValueMap.add(name, null); - } else { - String name = URLDecoder.decode(pair.substring(0, idx), encoding); - String value = URLDecoder.decode(pair.substring(idx + 1), encoding); - multiValueMap.add(name, value); + if (isURLEncodedForm(mediaType)) { + return parseURLEncodedBodyAsParameters(requestAdapter, requiredType); + } else if (MediaType.APPLICATION_JSON.equalsTypeAndSubtype(mediaType)) { + try { + return JsonToApon.from(requestAdapter.getBody(), requiredType); + } catch (IOException e) { + throw new RequestParseException("Failed to parse request body of JSON format to required type [" + + requiredType.getName() + "]", e); } + } else if (MediaType.APPLICATION_APON.equalsTypeAndSubtype(mediaType)) { + return RequestBodyParser.parseBodyAsParameters(requestAdapter.getBody(), requiredType); + } else if (MediaType.APPLICATION_XML.equalsTypeAndSubtype(mediaType)) { + try { + return XmlToApon.from(requestAdapter.getBody(), requiredType); + } catch (IOException e) { + throw new RequestParseException("Failed to parse request body of XML format to required type [" + + requiredType.getName() + "]", e); + } + } else { + return null; } - return multiValueMap; } - public static void parseURLEncodedFormData(RequestAdapter requestAdapter) throws RequestParseException { + /** + * Parse the URL-encoded Form Data to get the request parameters. + */ + public static void parseURLEncodedFormData(WebRequestAdapter requestAdapter) throws RequestParseException { try { String body = requestAdapter.getBody(); - String encoding = requestAdapter.getEncoding(); - MultiValueMap multiValueMap = parseURLEncoded(body, encoding); + if (StringUtils.isEmpty(body)) { + return; + } + Charset encoding = determineEncoding(requestAdapter); + MultiValueMap multiValueMap = parseURLEncodedBody(body, encoding); if (multiValueMap != null) { requestAdapter.putAllParameters(multiValueMap); requestAdapter.setBody(null); @@ -121,15 +149,21 @@ public static void parseURLEncodedFormData(RequestAdapter requestAdapter) throws } } + public static boolean isMultipartForm(MethodType requestMethod, MediaType mediaType) { + return MethodType.POST.equals(requestMethod) && + MediaType.MULTIPART_FORM_DATA.equalsTypeAndSubtype(mediaType); + } + + public static boolean isURLEncodedForm(MediaType mediaType) { + return MediaType.APPLICATION_FORM_URLENCODED.equalsTypeAndSubtype(mediaType); + } + @Nullable - public static T parseURLEncodedAsParameters( - RequestAdapter requestAdapter, Class requiredType) throws RequestParseException { + private static T parseURLEncodedBodyAsParameters( + WebRequestAdapter requestAdapter, Class requiredType) throws RequestParseException { try { - String encoding = requestAdapter.getEncoding(); - if (encoding == null) { - encoding = DEFAULT_ENCODING; - } - MultiValueMap multiValueMap = parseURLEncoded(requestAdapter.getBody(), encoding); + Charset encoding = determineEncoding(requestAdapter); + MultiValueMap multiValueMap = parseURLEncodedBody(requestAdapter.getBody(), encoding); if (multiValueMap != null && !multiValueMap.isEmpty()) { T parameters = ClassUtils.createInstance(requiredType); for (Map.Entry> entry : multiValueMap.entrySet()) { @@ -147,42 +181,40 @@ public static T parseURLEncodedAsParameters( return null; } - public static T parseBodyAsParameters( - RequestAdapter requestAdapter, @Nullable MediaType mediaType, Class requiredType) - throws RequestParseException { - if (mediaType == null) { + @Nullable + private static MultiValueMap parseURLEncodedBody(String body, Charset encoding) { + if (StringUtils.isEmpty(body)) { return null; } - if (isURLEncodedForm(mediaType)) { - return parseURLEncodedAsParameters(requestAdapter, requiredType); - } else if (MediaType.APPLICATION_JSON.equalsTypeAndSubtype(mediaType)) { - try { - return JsonToApon.from(requestAdapter.getBody(), requiredType); - } catch (IOException e) { - throw new RequestParseException("Failed to parse request body of JSON format to required type [" + - requiredType.getName() + "]", e); - } - } else if (MediaType.APPLICATION_APON.equalsTypeAndSubtype(mediaType)) { - return RequestBodyParser.parseBodyAsParameters(requestAdapter.getBody(), requiredType); - } else if (MediaType.APPLICATION_XML.equalsTypeAndSubtype(mediaType)) { - try { - return XmlToApon.from(requestAdapter.getBody(), requiredType); - } catch (IOException e) { - throw new RequestParseException("Failed to parse request body of XML format to required type [" + - requiredType.getName() + "]", e); + MultiValueMap multiValueMap = new LinkedMultiValueMap<>(); + String[] pairs = StringUtils.tokenize(body, "&"); + for (String pair : pairs) { + int idx = pair.indexOf('='); + if (idx == -1) { + String name = URLDecoder.decode(pair, encoding); + multiValueMap.add(name, null); + } else { + String name = URLDecoder.decode(pair.substring(0, idx), encoding); + String value = URLDecoder.decode(pair.substring(idx + 1), encoding); + multiValueMap.add(name, value); } - } else { - return null; } + return multiValueMap; } - public static boolean isMultipartForm(MethodType requestMethod, MediaType mediaType) { - return MethodType.POST.equals(requestMethod) && - MediaType.MULTIPART_FORM_DATA.equalsTypeAndSubtype(mediaType); - } - - public static boolean isURLEncodedForm(MediaType mediaType) { - return MediaType.APPLICATION_FORM_URLENCODED.equalsTypeAndSubtype(mediaType); + @NonNull + private static Charset determineEncoding(@NonNull WebRequestAdapter requestAdapter) { + Charset encoding = null; + if (requestAdapter.getMediaType() != null) { + encoding = requestAdapter.getMediaType().getCharset(); + } + if (encoding == null && requestAdapter.getEncoding() != null) { + encoding = Charset.forName(requestAdapter.getEncoding()); + } + if (encoding == null) { + encoding = DEFAULT_ENCODING; + } + return encoding; } } diff --git a/web/src/main/java/com/aspectran/web/adapter/AbstractWebRequestAdapter.java b/web/src/main/java/com/aspectran/web/adapter/AbstractWebRequestAdapter.java new file mode 100644 index 000000000..fdeb2a83d --- /dev/null +++ b/web/src/main/java/com/aspectran/web/adapter/AbstractWebRequestAdapter.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2008-2024 The Aspectran Project + * + * 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. + */ +package com.aspectran.web.adapter; + +import com.aspectran.core.activity.request.RequestParseException; +import com.aspectran.core.adapter.AbstractRequestAdapter; +import com.aspectran.core.context.rule.type.MethodType; +import com.aspectran.utils.apon.Parameters; +import com.aspectran.utils.logging.Logger; +import com.aspectran.utils.logging.LoggerFactory; +import com.aspectran.web.activity.request.WebRequestBodyParser; +import com.aspectran.web.support.http.MediaType; + +public abstract class AbstractWebRequestAdapter extends AbstractRequestAdapter implements WebRequestAdapter { + + private static final Logger logger = LoggerFactory.getLogger(AbstractWebRequestAdapter.class); + + private MediaType mediaType; + + private boolean bodyObtained; + + public AbstractWebRequestAdapter(MethodType requestMethod, Object adaptee) { + super(requestMethod, adaptee); + } + + public MediaType getMediaType() { + return mediaType; + } + + protected void setMediaType(MediaType mediaType) { + this.mediaType = mediaType; + } + + @Override + public String getBody() { + if (!bodyObtained) { + bodyObtained = true; + try { + String body = WebRequestBodyParser.parseBody(this); + setBody(body); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Failed to parse request body", e); + } + setBody(null); + } + } + return super.getBody(); + } + + @Override + public T getBodyAsParameters(Class requiredType) throws RequestParseException { + if (getMediaType() != null) { + return WebRequestBodyParser.parseBodyAsParameters(this, requiredType); + } else { + return null; + } + } + + protected abstract void preparse(); + + protected abstract void preparse(WebRequestAdapter requestAdapter); + +} diff --git a/web/src/main/java/com/aspectran/web/adapter/HttpServletRequestAdapter.java b/web/src/main/java/com/aspectran/web/adapter/HttpServletRequestAdapter.java index 9863aeb72..25ac66f8f 100755 --- a/web/src/main/java/com/aspectran/web/adapter/HttpServletRequestAdapter.java +++ b/web/src/main/java/com/aspectran/web/adapter/HttpServletRequestAdapter.java @@ -15,16 +15,10 @@ */ package com.aspectran.web.adapter; -import com.aspectran.core.activity.request.RequestParseException; -import com.aspectran.core.adapter.AbstractRequestAdapter; import com.aspectran.core.adapter.RequestAdapter; import com.aspectran.core.context.rule.type.MethodType; import com.aspectran.utils.MultiValueMap; -import com.aspectran.utils.apon.Parameters; -import com.aspectran.utils.logging.Logger; -import com.aspectran.utils.logging.LoggerFactory; import com.aspectran.web.activity.request.RequestAttributeMap; -import com.aspectran.web.activity.request.WebRequestBodyParser; import com.aspectran.web.support.http.MediaType; import jakarta.servlet.http.HttpServletRequest; @@ -39,16 +33,10 @@ * * @since 2011. 3. 13. */ -public class HttpServletRequestAdapter extends AbstractRequestAdapter { - - private static final Logger logger = LoggerFactory.getLogger(HttpServletRequestAdapter.class); +public class HttpServletRequestAdapter extends AbstractWebRequestAdapter { private boolean headersObtained; - private boolean bodyObtained; - - private MediaType mediaType; - /** * Instantiates a new HttpServletRequestAdapter. * @param requestMethod the request method @@ -80,56 +68,24 @@ public MultiValueMap getHeaderMap() { @Override public String getEncoding() { - return ((HttpServletRequest)getAdaptee()).getCharacterEncoding(); + return getHttpServletRequest().getCharacterEncoding(); } @Override public void setEncoding(String encoding) throws UnsupportedEncodingException { - ((HttpServletRequest)getAdaptee()).setCharacterEncoding(encoding); + getHttpServletRequest().setCharacterEncoding(encoding); } @Override public InputStream getInputStream() throws IOException { - return ((HttpServletRequest)getAdaptee()).getInputStream(); + return getHttpServletRequest().getInputStream(); } - @Override - public String getBody() { - if (!bodyObtained) { - bodyObtained = true; - try { - String body = WebRequestBodyParser.parseBody(getInputStream(), getEncoding(), getMaxRequestSize()); - setBody(body); - } catch (Exception e) { - if (logger.isDebugEnabled()) { - logger.debug("Failed to parse request body", e); - } - setBody(null); - } - } - return super.getBody(); + private HttpServletRequest getHttpServletRequest() { + return getAdaptee(); } - + @Override - public T getBodyAsParameters(Class requiredType) throws RequestParseException { - if (getMediaType() != null) { - return WebRequestBodyParser.parseBodyAsParameters(this, getMediaType(), requiredType); - } else { - return null; - } - } - - /** - * Gets the media type value included in the Content-Type header. - */ - public MediaType getMediaType() { - return mediaType; - } - - private void setMediaType(MediaType mediaType) { - this.mediaType = mediaType; - } - public void preparse() { HttpServletRequest request = getAdaptee(); setAttributeMap(new RequestAttributeMap(request)); @@ -137,13 +93,23 @@ public void preparse() { if (!parameters.isEmpty()) { getParameterMap().putAll(parameters); } - if (request.getContentType() != null) { - setMediaType(MediaType.parseMediaType(request.getContentType())); + String contentType = request.getContentType(); + if (contentType != null) { + MediaType mediaType = MediaType.parseMediaType(contentType); + setMediaType(mediaType); + if (mediaType.getCharset() != null) { + try { + setEncoding(mediaType.getCharset().name()); + } catch (UnsupportedEncodingException e) { + // ignored + } + } } setLocale(request.getLocale()); } - public void preparse(HttpServletRequestAdapter requestAdapter) { + @Override + public void preparse(WebRequestAdapter requestAdapter) { if (requestAdapter == this) { throw new IllegalStateException("Unable To Replicate"); } diff --git a/web/src/main/java/com/aspectran/web/adapter/WebRequestAdapter.java b/web/src/main/java/com/aspectran/web/adapter/WebRequestAdapter.java new file mode 100644 index 000000000..26e475bef --- /dev/null +++ b/web/src/main/java/com/aspectran/web/adapter/WebRequestAdapter.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2008-2024 The Aspectran Project + * + * 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. + */ +package com.aspectran.web.adapter; + +import com.aspectran.core.adapter.RequestAdapter; +import com.aspectran.web.support.http.MediaType; + +public interface WebRequestAdapter extends RequestAdapter { + + MediaType getMediaType(); + +} diff --git a/with-undertow/src/main/java/com/aspectran/undertow/activity/TowActivity.java b/with-undertow/src/main/java/com/aspectran/undertow/activity/TowActivity.java index 3052a575f..c7116ed20 100644 --- a/with-undertow/src/main/java/com/aspectran/undertow/activity/TowActivity.java +++ b/with-undertow/src/main/java/com/aspectran/undertow/activity/TowActivity.java @@ -33,9 +33,8 @@ import com.aspectran.utils.Assert; import com.aspectran.utils.StringUtils; import com.aspectran.utils.annotation.jsr305.NonNull; -import com.aspectran.web.activity.request.MultipartFormDataParser; -import com.aspectran.web.activity.request.MultipartRequestParseException; import com.aspectran.web.activity.request.WebRequestBodyParser; +import com.aspectran.web.adapter.WebRequestAdapter; import com.aspectran.web.support.http.HttpHeaders; import com.aspectran.web.support.http.MediaType; import io.undertow.server.HttpServerExchange; @@ -45,16 +44,13 @@ import java.io.UnsupportedEncodingException; import static com.aspectran.core.context.rule.RequestRule.LOCALE_CHANGE_INTERCEPTOR_SETTING_NAME; +import static com.aspectran.web.activity.request.WebRequestBodyParser.MAX_REQUEST_SIZE_SETTING_NAME; /** *

Created: 2019-07-27

*/ public class TowActivity extends CoreActivity { - private static final String MULTIPART_FORM_DATA_PARSER_SETTING_NAME = "multipartFormDataParser"; - - private static final String MAX_REQUEST_SIZE_SETTING_NAME = "maxRequestSize"; - private final HttpServerExchange exchange; private String requestName; @@ -192,40 +188,15 @@ protected void parseRequest() throws ActivityTerminatedException, RequestParseEx MediaType mediaType = ((TowRequestAdapter)getRequestAdapter()).getMediaType(); if (mediaType != null) { if (WebRequestBodyParser.isMultipartForm(getRequestAdapter().getRequestMethod(), mediaType)) { - parseMultipartFormData(); + WebRequestBodyParser.parseMultipartFormData(this); } else if (WebRequestBodyParser.isURLEncodedForm(mediaType)) { - parseURLEncodedFormData(); + WebRequestBodyParser.parseURLEncodedFormData((WebRequestAdapter)getRequestAdapter()); } } super.parseRequest(); } - /** - * Parse the multipart form data. - */ - private void parseMultipartFormData() throws MultipartRequestParseException { - String multipartFormDataParser = getSetting(MULTIPART_FORM_DATA_PARSER_SETTING_NAME); - if (multipartFormDataParser == null) { - throw new MultipartRequestParseException("The setting name 'multipartFormDataParser' for multipart " + - "form data parsing is not specified. Please specify 'multipartFormDataParser' via Aspect so " + - "that Translet can parse multipart form data."); - } - - MultipartFormDataParser parser = getBean(multipartFormDataParser); - if (parser == null) { - throw new MultipartRequestParseException("No bean named '" + multipartFormDataParser + "' is defined"); - } - parser.parse(getRequestAdapter()); - } - - /** - * Parse the URL-encoded Form Data to get the request parameters. - */ - private void parseURLEncodedFormData() throws RequestParseException { - WebRequestBodyParser.parseURLEncodedFormData(getRequestAdapter()); - } - @Override protected LocaleResolver resolveLocale() { LocaleResolver localeResolver = super.resolveLocale(); diff --git a/with-undertow/src/main/java/com/aspectran/undertow/adapter/TowRequestAdapter.java b/with-undertow/src/main/java/com/aspectran/undertow/adapter/TowRequestAdapter.java index c64a069a1..3d8e9d198 100644 --- a/with-undertow/src/main/java/com/aspectran/undertow/adapter/TowRequestAdapter.java +++ b/with-undertow/src/main/java/com/aspectran/undertow/adapter/TowRequestAdapter.java @@ -15,22 +15,20 @@ */ package com.aspectran.undertow.adapter; -import com.aspectran.core.activity.request.RequestParseException; -import com.aspectran.core.adapter.AbstractRequestAdapter; import com.aspectran.core.context.rule.type.MethodType; import com.aspectran.utils.MultiValueMap; -import com.aspectran.utils.apon.Parameters; -import com.aspectran.utils.logging.Logger; -import com.aspectran.utils.logging.LoggerFactory; -import com.aspectran.web.activity.request.WebRequestBodyParser; +import com.aspectran.web.adapter.AbstractWebRequestAdapter; +import com.aspectran.web.adapter.WebRequestAdapter; import com.aspectran.web.support.http.MediaType; import io.undertow.server.HttpServerExchange; +import io.undertow.util.HeaderMap; import io.undertow.util.HeaderValues; import io.undertow.util.Headers; import io.undertow.util.LocaleUtils; import java.io.IOException; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.util.Deque; import java.util.List; import java.util.Locale; @@ -41,18 +39,10 @@ * *

Created: 2019-07-27

*/ -public class TowRequestAdapter extends AbstractRequestAdapter { - - private static final Logger logger = LoggerFactory.getLogger(TowRequestAdapter.class); +public class TowRequestAdapter extends AbstractWebRequestAdapter { private boolean headersObtained; - private boolean encodingObtained; - - private boolean bodyObtained; - - private MediaType mediaType; - /** * Instantiates a new TowRequestAdapter. * @param requestMethod the request method @@ -66,9 +56,10 @@ public TowRequestAdapter(MethodType requestMethod, HttpServerExchange exchange) public MultiValueMap getHeaderMap() { if (!headersObtained) { headersObtained = true; - if (getHttpServerExchange().getRequestHeaders().size() > 0) { + HeaderMap headerMap = getHttpServerExchange().getRequestHeaders(); + if (headerMap.size() > 0) { MultiValueMap multiValueMap = super.getHeaderMap(); - for (HeaderValues headerValues : getHttpServerExchange().getRequestHeaders()) { + for (HeaderValues headerValues : headerMap) { String name = headerValues.getHeaderName().toString(); for (String value : headerValues) { multiValueMap.add(name, value); @@ -79,19 +70,6 @@ public MultiValueMap getHeaderMap() { return super.getHeaderMap(); } - @Override - public String getEncoding() { - if (!encodingObtained) { - encodingObtained = true; - String contentType = getHttpServerExchange().getRequestHeaders().getFirst(Headers.CONTENT_TYPE); - if (contentType == null) { - return null; - } - return Headers.extractQuotedValueFromHeader(contentType, MediaType.PARAM_CHARSET); - } - return super.getEncoding(); - } - @Override public InputStream getInputStream() throws IOException { if (!getHttpServerExchange().isBlocking()) { @@ -100,47 +78,11 @@ public InputStream getInputStream() throws IOException { return getHttpServerExchange().getInputStream(); } - @Override - public String getBody() { - if (!bodyObtained) { - bodyObtained = true; - try { - String body = WebRequestBodyParser.parseBody(getInputStream(), getEncoding(), getMaxRequestSize()); - setBody(body); - } catch (Exception e) { - if (logger.isDebugEnabled()) { - logger.debug("Failed to parse request body", e); - } - setBody(null); - } - } - return super.getBody(); - } - - @Override - public T getBodyAsParameters(Class requiredType) throws RequestParseException { - if (getMediaType() != null) { - return WebRequestBodyParser.parseBodyAsParameters(this, getMediaType(), requiredType); - } else { - return null; - } - } - - /** - * Gets the media type value included in the Content-Type header. - */ - public MediaType getMediaType() { - return mediaType; - } - - private void setMediaType(MediaType mediaType) { - this.mediaType = mediaType; - } - private HttpServerExchange getHttpServerExchange() { return getAdaptee(); } + @Override public void preparse() { HttpServerExchange exchange = getAdaptee(); for (Map.Entry> entry : exchange.getQueryParameters().entrySet()) { @@ -150,7 +92,15 @@ public void preparse() { } String contentType = exchange.getRequestHeaders().getFirst(Headers.CONTENT_TYPE); if (contentType != null) { - setMediaType(MediaType.parseMediaType(contentType)); + MediaType mediaType = MediaType.parseMediaType(contentType); + setMediaType(mediaType); + if (mediaType.getCharset() != null) { + try { + setEncoding(mediaType.getCharset().name()); + } catch (UnsupportedEncodingException e) { + // ignored + } + } } String acceptLanguage = exchange.getRequestHeaders().getFirst(Headers.ACCEPT_LANGUAGE); List locales = LocaleUtils.getLocalesFromHeader(acceptLanguage); @@ -159,7 +109,8 @@ public void preparse() { } } - public void preparse(TowRequestAdapter requestAdapter) { + @Override + public void preparse(WebRequestAdapter requestAdapter) { if (requestAdapter == this) { throw new IllegalStateException("Unable To Replicate"); }