From 4c6689db839836d58a27da8052da23226ae6929e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=98=84=EC=84=B1=ED=95=84?= Date: Fri, 6 Dec 2024 16:28:09 +0900 Subject: [PATCH] =?UTF-8?q?encoding=20=EC=84=A4=EC=A0=95=20=EC=A7=80?= =?UTF-8?q?=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../testmaster/api/dto/MockRequest.java | 61 ++++++++++++++++++- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/eactive/testmaster/api/dto/MockRequest.java b/src/main/java/com/eactive/testmaster/api/dto/MockRequest.java index b8dad69..1d88857 100644 --- a/src/main/java/com/eactive/testmaster/api/dto/MockRequest.java +++ b/src/main/java/com/eactive/testmaster/api/dto/MockRequest.java @@ -1,18 +1,39 @@ package com.eactive.testmaster.api.dto; +import io.netty.util.CharsetUtil; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; import java.net.URLDecoder; +import java.nio.charset.Charset; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; public class MockRequest { + private static final Charset DEFAULT_CHARSET = determineDefaultCharset(); + + private static Charset determineDefaultCharset() { + try { + String systemEncoding = System.getProperty("file.encoding"); + if (StringUtils.isNotBlank(systemEncoding)) { + return Charset.forName(systemEncoding); + } + } catch (IllegalArgumentException | SecurityException e) { + // Log warning about fallback to UTF-8 + } + return CharsetUtil.UTF_8; + } + public static Map parseQueryString(HttpServletRequest request) { Map queryParams = new HashMap<>(); - String queryString = request.getQueryString()!=null?URLDecoder.decode(request.getQueryString()) : null; + String queryString = request.getQueryString() != null ? URLDecoder.decode(request.getQueryString()) : null; if (queryString != null) { String[] queryParamsArr = queryString.split("&"); for (String queryParam : queryParamsArr) { @@ -28,16 +49,50 @@ public class MockRequest { return queryParams; } + public static final Pattern CHARSET_PATTERN = Pattern.compile("charset=([^;]+)"); + + private Charset extractCharset(Map headers) { + String contentType = headers.get("content-type"); + + if (contentType != null) { + Matcher matcher = CHARSET_PATTERN.matcher(contentType.toLowerCase()); + if (matcher.find()) { + try { + return Charset.forName(matcher.group(1).trim()); + } catch (IllegalArgumentException e) { + // Log warning about unsupported charset + return DEFAULT_CHARSET; + } + } + } + + return DEFAULT_CHARSET; + } + public MockRequest(HttpServletRequest request) throws IOException { String contextPath = request.getContextPath(); this.method = request.getMethod(); this.uri = request.getRequestURI().replace(contextPath, ""); this.headers = Collections.list(request.getHeaderNames()).stream() - .collect(Collectors.toMap(name -> name, request::getHeader)); + .collect(Collectors.toMap(name -> name, request::getHeader)); this.params = parseQueryString(request); - this.body = URLDecoder.decode(request.getReader().lines().collect(Collectors.joining(System.lineSeparator()))); + String charset = extractCharset(headers).toString(); + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(request.getInputStream(), charset))) { + String rawBody = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + + // Only URL decode if the content type indicates form submission + String contentType = request.getContentType(); + if (contentType != null) { + this.body = URLDecoder.decode(rawBody, charset); + } else { + this.body = rawBody; + } + } } private String uri;