Skip to content

Commit

Permalink
fix: request params are recorded in the form of request body (#342)
Browse files Browse the repository at this point in the history
  • Loading branch information
DanLi39 authored Dec 5, 2023
1 parent 8747e60 commit 7115231
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
package io.arex.inst.httpservlet;

import io.arex.agent.bootstrap.util.MapUtils;
import io.arex.agent.bootstrap.util.CollectionUtil;
import io.arex.agent.bootstrap.util.StringUtil;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponentsBuilder;

public class ServletUtil {

Expand Down Expand Up @@ -40,4 +50,50 @@ public static String getRequestPath(String uri) {
return uri;
}
}

/**
* match requset params
*
* @param requestParams
* @param name
* @param value
* @return
*/
public static boolean matchAndRemoveRequestParams(Map<String, List<String>> requestParams, String name, String value) {
if (MapUtils.isEmpty(requestParams)) {
return false;
}
List<String> values = requestParams.get(name);
if(CollectionUtil.isEmpty(values)){
return false;
}
Iterator<String> iterator = values.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (next.equals(value)) {
iterator.remove();
return true;
}
}
return false;
}

/**
* obtain requset params
*
* @param queryString
* @return
*/
public static Map<String, List<String>> getRequestParams(String queryString) {
if (StringUtil.isEmpty(queryString)) {
return Collections.emptyMap();
}
MultiValueMap<String, String> paramsKeyValueMap = UriComponentsBuilder.fromUriString(
"?" + queryString).build().getQueryParams();
Map<String, List<String>> requestParamsMap = new HashMap<>();
for (Map.Entry<String, List<String>> entry : paramsKeyValueMap.entrySet()) {
requestParamsMap.put(entry.getKey(), new ArrayList<>(entry.getValue()));
}
return requestParamsMap;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.arex.inst.httpservlet.wrapper;


import io.arex.inst.httpservlet.ServletUtil;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
Expand Down Expand Up @@ -124,24 +125,34 @@ private boolean isFormPost() {

private void writeRequestParametersToCachedContent() {
try {
if (this.cachedContent.size() == 0) {
// requestBody is not empty
if (this.cachedContent.size() == 0 && this.getContentLength() > 0) {
Map<String, List<String>> requestParams = ServletUtil.getRequestParams(this.getQueryString());
String requestEncoding = getCharacterEncoding();
Map<String, String[]> form = super.getParameterMap();
for (Iterator<String> nameIterator = form.keySet().iterator(); nameIterator.hasNext(); ) {
String name = nameIterator.next();
boolean valueIsEmpty = true;
List<String> values = Arrays.asList(form.get(name));
for (Iterator<String> valueIterator = values.iterator(); valueIterator.hasNext(); ) {
String value = valueIterator.next();
if (ServletUtil.matchAndRemoveRequestParams(requestParams, name, value)) {
continue;
}
this.cachedContent.write(URLEncoder.encode(name, requestEncoding).getBytes());
if (value != null) {
this.cachedContent.write('=');
this.cachedContent.write(URLEncoder.encode(value, requestEncoding).getBytes());
if (valueIterator.hasNext()) {
this.cachedContent.write('&');
}
if (valueIsEmpty) {
valueIsEmpty = false;
}
}

}
if (nameIterator.hasNext()) {
if (nameIterator.hasNext() && !valueIsEmpty) {
this.cachedContent.write('&');
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.arex.inst.httpservlet.wrapper;

import io.arex.inst.httpservlet.ServletUtil;
import jakarta.servlet.ReadListener;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
Expand Down Expand Up @@ -122,14 +123,20 @@ private boolean isFormPost() {

private void writeRequestParametersToCachedContent() {
try {
if (this.cachedContent.size() == 0) {
// requestBody is not empty
if (this.cachedContent.size() == 0 && this.getContentLength() > 0) {
Map<String, List<String>> requestParams = ServletUtil.getRequestParams(this.getQueryString());
String requestEncoding = getCharacterEncoding();
Map<String, String[]> form = super.getParameterMap();
for (Iterator<String> nameIterator = form.keySet().iterator(); nameIterator.hasNext(); ) {
String name = nameIterator.next();
boolean valueIsEmpty = true;
List<String> values = Arrays.asList(form.get(name));
for (Iterator<String> valueIterator = values.iterator(); valueIterator.hasNext(); ) {
String value = valueIterator.next();
if (ServletUtil.matchAndRemoveRequestParams(requestParams, name, value)) {
continue;
}
this.cachedContent.write(URLEncoder.encode(name, requestEncoding).getBytes());
if (value != null) {
this.cachedContent.write('=');
Expand All @@ -138,8 +145,11 @@ private void writeRequestParametersToCachedContent() {
this.cachedContent.write('&');
}
}
if (valueIsEmpty) {
valueIsEmpty = false;
}
}
if (nameIterator.hasNext()) {
if (nameIterator.hasNext() && !valueIsEmpty) {
this.cachedContent.write('&');
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

import static org.junit.jupiter.api.Assertions.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;

class ServletUtilTest {
Expand All @@ -23,4 +29,21 @@ public void getFullPath() {
assertEquals("/servletpath/controll/action", ServletUtil.getRequestPath("http://arextest.com/servletpath/controll/action"));
assertEquals("/servletpath/controll/action?k1=v1", ServletUtil.getRequestPath("http://arextest.com/servletpath/controll/action?k1=v1"));
}

@Test
public void matchRequestParams() {
Map<String, List<String>> requestParams = new HashMap<>();
requestParams.put("name", new ArrayList<>(Arrays.asList("kimi")));
requestParams.put("age", new ArrayList<>(Arrays.asList("0")));
assertFalse(ServletUtil.matchAndRemoveRequestParams(requestParams, "name", "lock"));
assertTrue(ServletUtil.matchAndRemoveRequestParams(requestParams, "age", "0"));
assertFalse(ServletUtil.matchAndRemoveRequestParams(Collections.emptyMap(), "name", "lock"));
}

@Test
public void getRequestParams() {
String queryString = "name=kimi&age=0";
Map<String, List<String>> requestParams = ServletUtil.getRequestParams(queryString);
assertEquals(2, requestParams.size());
}
}

0 comments on commit 7115231

Please sign in to comment.