Skip to content

Instantly share code, notes, and snippets.

@ufuk
Created September 5, 2019 06:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ufuk/fba18c23e553977e93c70e34906b093d to your computer and use it in GitHub Desktop.
Save ufuk/fba18c23e553977e93c70e34906b093d to your computer and use it in GitHub Desktop.
Utility to generate logging-purpose text for HttpServletRequest/Response
package ...;
import ...JsonUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.WebUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Map;
import java.util.stream.Stream;
@Slf4j
public final class HttpServletRequestResponsePrinter {
private HttpServletRequestResponsePrinter() {
}
public static String requestToString(HttpServletRequest request) {
return String.join(
System.lineSeparator(),
"HTTP Method: " + request.getMethod(),
"Request URI: " + request.getRequestURI(),
"Parameters: " + getParamsMultiValueMap(request),
"Headers: " + getRequestHeaders(request),
"Body: " + getRequestBody(request)
);
}
private static String getRequestBody(HttpServletRequest request) {
try {
ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class);
if (wrapper != null) {
byte[] buf = wrapper.getContentAsByteArray();
return new String(buf, 0, buf.length, wrapper.getCharacterEncoding());
} else {
return IOUtils.toString(request.getReader());
}
} catch (Exception ignored) {
log.debug("Exception while reading request body: ", ignored);
return null;
}
}
private static HttpHeaders getRequestHeaders(HttpServletRequest request) {
HttpHeaders headers = new HttpHeaders();
Enumeration<?> names = request.getHeaderNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
Enumeration<String> values = request.getHeaders(name);
while (values.hasMoreElements()) {
headers.add(name, values.nextElement());
}
}
return headers;
}
private static MultiValueMap<String, String> getParamsMultiValueMap(HttpServletRequest request) {
Map<String, String[]> params = request.getParameterMap();
MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
params.keySet()
.stream()
.filter(name -> params.get(name) != null)
.forEach(name -> Stream.of(params.get(name)).forEach(value -> multiValueMap.add(name, value)));
return multiValueMap;
}
public static String responseToString(HttpServletResponse response, Object responseBody) {
return String.join(
System.lineSeparator(),
"Status: " + response.getStatus(),
"Headers: " + getResponseHeaders(response),
"Content type: " + response.getContentType(),
"Body: " + JsonUtils.toJsonString(responseBody) // Assumes each response body is a JSON
);
}
private static HttpHeaders getResponseHeaders(HttpServletResponse response) {
HttpHeaders headers = new HttpHeaders();
for (String name : response.getHeaderNames()) {
headers.put(name, new ArrayList<>(response.getHeaders(name)));
}
return headers;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment